blob: 119b7c76a4bda805ec981bd3e5953b72671a5e71 [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
Bob Wilson9c8af452013-04-11 18:53:25 +0000818 if (!Args.hasFlag(options::OPT_mimplicit_float,
819 options::OPT_mno_implicit_float,
820 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000821 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000822}
823
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000824// Translate MIPS CPU name alias option to CPU name.
825static StringRef getMipsCPUFromAlias(const Arg &A) {
826 if (A.getOption().matches(options::OPT_mips32))
827 return "mips32";
828 if (A.getOption().matches(options::OPT_mips32r2))
829 return "mips32r2";
830 if (A.getOption().matches(options::OPT_mips64))
831 return "mips64";
832 if (A.getOption().matches(options::OPT_mips64r2))
833 return "mips64r2";
834 llvm_unreachable("Unexpected option");
835 return "";
836}
837
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000838// Get CPU and ABI names. They are not independent
839// so we have to calculate them together.
840static void getMipsCPUAndABI(const ArgList &Args,
841 const ToolChain &TC,
842 StringRef &CPUName,
843 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000844 const char *DefMips32CPU = "mips32";
845 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000846
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000847 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000848 options::OPT_mcpu_EQ,
849 options::OPT_mips_CPUs_Group)) {
850 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
851 CPUName = getMipsCPUFromAlias(*A);
852 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000853 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000854 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000855
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000856 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000857 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000858 // Convert a GNU style Mips ABI name to the name
859 // accepted by LLVM Mips backend.
860 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
861 .Case("32", "o32")
862 .Case("64", "n64")
863 .Default(ABIName);
864 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000865
866 // Setup default CPU and ABI names.
867 if (CPUName.empty() && ABIName.empty()) {
868 switch (TC.getTriple().getArch()) {
869 default:
870 llvm_unreachable("Unexpected triple arch name");
871 case llvm::Triple::mips:
872 case llvm::Triple::mipsel:
873 CPUName = DefMips32CPU;
874 break;
875 case llvm::Triple::mips64:
876 case llvm::Triple::mips64el:
877 CPUName = DefMips64CPU;
878 break;
879 }
880 }
881
882 if (!ABIName.empty()) {
883 // Deduce CPU name from ABI name.
884 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000885 .Cases("32", "o32", "eabi", DefMips32CPU)
886 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000887 .Default("");
888 }
889 else if (!CPUName.empty()) {
890 // Deduce ABI name from CPU name.
891 ABIName = llvm::StringSwitch<const char *>(CPUName)
892 .Cases("mips32", "mips32r2", "o32")
893 .Cases("mips64", "mips64r2", "n64")
894 .Default("");
895 }
896
897 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000898}
899
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000900// Convert ABI name to the GNU tools acceptable variant.
901static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
902 return llvm::StringSwitch<llvm::StringRef>(ABI)
903 .Case("o32", "32")
904 .Case("n64", "64")
905 .Default(ABI);
906}
907
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000908// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
909// and -mfloat-abi=.
910static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000911 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 options::OPT_mhard_float,
914 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000915 if (A->getOption().matches(options::OPT_msoft_float))
916 FloatABI = "soft";
917 else if (A->getOption().matches(options::OPT_mhard_float))
918 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000919 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000920 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000921 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000922 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000923 FloatABI = "hard";
924 }
925 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000926 }
927
928 // If unspecified, choose the default based on the platform.
929 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000930 // Assume "hard", because it's a default value used by gcc.
931 // When we start to recognize specific target MIPS processors,
932 // we will be able to select the default more correctly.
933 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000934 }
935
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000936 return FloatABI;
937}
938
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000939static void AddTargetFeature(const ArgList &Args,
940 ArgStringList &CmdArgs,
941 OptSpecifier OnOpt,
942 OptSpecifier OffOpt,
943 StringRef FeatureName) {
944 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
945 CmdArgs.push_back("-target-feature");
946 if (A->getOption().matches(OnOpt))
947 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
948 else
949 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
950 }
951}
952
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000953void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000954 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000955 const Driver &D = getToolChain().getDriver();
956 StringRef CPUName;
957 StringRef ABIName;
958 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
959
960 CmdArgs.push_back("-target-cpu");
961 CmdArgs.push_back(CPUName.data());
962
963 CmdArgs.push_back("-target-abi");
964 CmdArgs.push_back(ABIName.data());
965
966 StringRef FloatABI = getMipsFloatABI(D, Args);
967
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000968 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
969
970 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000971 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000972 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000973 CmdArgs.push_back("-mfloat-abi");
974 CmdArgs.push_back("soft");
975
976 // FIXME: Note, this is a hack. We need to pass the selected float
977 // mode to the MipsTargetInfoBase to define appropriate macros there.
978 // Now it is the only method.
979 CmdArgs.push_back("-target-feature");
980 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000981
982 if (FloatABI == "hard" && IsMips16) {
983 CmdArgs.push_back("-mllvm");
984 CmdArgs.push_back("-mips16-hard-float");
985 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000986 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000987 else {
988 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000989 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000990 CmdArgs.push_back("-mfloat-abi");
991 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000992 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000993
Simon Atanasyan82eec3a2013-04-14 14:07:36 +0000994 AddTargetFeature(Args, CmdArgs,
995 options::OPT_msingle_float, options::OPT_mdouble_float,
996 "single-float");
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000997 AddTargetFeature(Args, CmdArgs,
998 options::OPT_mips16, options::OPT_mno_mips16,
999 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001000 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan60777612013-04-14 14:07:51 +00001001 options::OPT_mmicromips, options::OPT_mno_micromips,
1002 "micromips");
1003 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001004 options::OPT_mdsp, options::OPT_mno_dsp,
1005 "dsp");
1006 AddTargetFeature(Args, CmdArgs,
1007 options::OPT_mdspr2, options::OPT_mno_dspr2,
1008 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001009
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001010 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1011 if (A->getOption().matches(options::OPT_mxgot)) {
1012 CmdArgs.push_back("-mllvm");
1013 CmdArgs.push_back("-mxgot");
1014 }
1015 }
1016
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001017 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001018 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001019 CmdArgs.push_back("-mllvm");
1020 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1021 A->claim();
1022 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001023}
1024
Hal Finkel8eb59282012-06-11 22:35:19 +00001025/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1026static std::string getPPCTargetCPU(const ArgList &Args) {
1027 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001028 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001029
1030 if (CPUName == "native") {
1031 std::string CPU = llvm::sys::getHostCPUName();
1032 if (!CPU.empty() && CPU != "generic")
1033 return CPU;
1034 else
1035 return "";
1036 }
1037
1038 return llvm::StringSwitch<const char *>(CPUName)
1039 .Case("common", "generic")
1040 .Case("440", "440")
1041 .Case("440fp", "440")
1042 .Case("450", "450")
1043 .Case("601", "601")
1044 .Case("602", "602")
1045 .Case("603", "603")
1046 .Case("603e", "603e")
1047 .Case("603ev", "603ev")
1048 .Case("604", "604")
1049 .Case("604e", "604e")
1050 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001051 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001052 .Case("G3", "g3")
1053 .Case("7400", "7400")
1054 .Case("G4", "g4")
1055 .Case("7450", "7450")
1056 .Case("G4+", "g4+")
1057 .Case("750", "750")
1058 .Case("970", "970")
1059 .Case("G5", "g5")
1060 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001061 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001062 .Case("e500mc", "e500mc")
1063 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001064 .Case("power3", "pwr3")
1065 .Case("power4", "pwr4")
1066 .Case("power5", "pwr5")
1067 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001068 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001069 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001070 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001071 .Case("pwr3", "pwr3")
1072 .Case("pwr4", "pwr4")
1073 .Case("pwr5", "pwr5")
1074 .Case("pwr5x", "pwr5x")
1075 .Case("pwr6", "pwr6")
1076 .Case("pwr6x", "pwr6x")
1077 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001078 .Case("powerpc", "ppc")
1079 .Case("powerpc64", "ppc64")
1080 .Default("");
1081 }
1082
1083 return "";
1084}
1085
1086void Clang::AddPPCTargetArgs(const ArgList &Args,
1087 ArgStringList &CmdArgs) const {
1088 std::string TargetCPUName = getPPCTargetCPU(Args);
1089
1090 // LLVM may default to generating code for the native CPU,
1091 // but, like gcc, we default to a more generic option for
1092 // each architecture. (except on Darwin)
1093 llvm::Triple Triple = getToolChain().getTriple();
1094 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1095 if (Triple.getArch() == llvm::Triple::ppc64)
1096 TargetCPUName = "ppc64";
1097 else
1098 TargetCPUName = "ppc";
1099 }
1100
1101 if (!TargetCPUName.empty()) {
1102 CmdArgs.push_back("-target-cpu");
1103 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1104 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001105
1106 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001107 AddTargetFeature(Args, CmdArgs,
1108 options::OPT_faltivec, options::OPT_fno_altivec,
1109 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001110
Hal Finkel7d458592013-03-30 13:47:44 +00001111 AddTargetFeature(Args, CmdArgs,
1112 options::OPT_mfprnd, options::OPT_mno_fprnd,
1113 "fprnd");
1114
Hal Finkel279ca4d2013-03-28 08:38:53 +00001115 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1116 AddTargetFeature(Args, CmdArgs,
1117 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1118 "mfocrf");
1119
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001120 AddTargetFeature(Args, CmdArgs,
1121 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1122 "popcntd");
1123
Hal Finkel279ca4d2013-03-28 08:38:53 +00001124 // It is really only possible to turn qpx off because turning qpx on is tied
1125 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001126 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1127 CmdArgs.push_back("-target-feature");
1128 CmdArgs.push_back("-qpx");
1129 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001130}
1131
Tom Stellard6674c702013-04-01 20:56:53 +00001132/// Get the (LLVM) name of the R600 gpu we are targeting.
1133static std::string getR600TargetGPU(const ArgList &Args) {
1134 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1135 std::string GPUName = A->getValue();
1136 return llvm::StringSwitch<const char *>(GPUName)
1137 .Cases("rv610", "rv620", "rv630", "r600")
1138 .Cases("rv635", "rs780", "rs880", "r600")
1139 .Case("rv740", "rv770")
1140 .Case("palm", "cedar")
1141 .Cases("sumo", "sumo2", "redwood")
1142 .Case("hemlock", "cypress")
1143 .Case("aruba", "cayman")
1144 .Default(GPUName.c_str());
1145 }
1146 return "";
1147}
1148
1149void Clang::AddR600TargetArgs(const ArgList &Args,
1150 ArgStringList &CmdArgs) const {
1151 std::string TargetGPUName = getR600TargetGPU(Args);
1152 CmdArgs.push_back("-target-cpu");
1153 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1154}
1155
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001156void Clang::AddSparcTargetArgs(const ArgList &Args,
1157 ArgStringList &CmdArgs) const {
1158 const Driver &D = getToolChain().getDriver();
1159
1160 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001161 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001162 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001163 }
1164
1165 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001166 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001167 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1168 options::OPT_mhard_float)) {
1169 if (A->getOption().matches(options::OPT_msoft_float))
1170 FloatABI = "soft";
1171 else if (A->getOption().matches(options::OPT_mhard_float))
1172 FloatABI = "hard";
1173 }
1174
1175 // If unspecified, choose the default based on the platform.
1176 if (FloatABI.empty()) {
1177 switch (getToolChain().getTriple().getOS()) {
1178 default:
1179 // Assume "soft", but warn the user we are guessing.
1180 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001181 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001182 break;
1183 }
1184 }
1185
1186 if (FloatABI == "soft") {
1187 // Floating point operations and argument passing are soft.
1188 //
1189 // FIXME: This changes CPP defines, we need -target-soft-float.
1190 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001191 CmdArgs.push_back("-target-feature");
1192 CmdArgs.push_back("+soft-float");
1193 } else {
1194 assert(FloatABI == "hard" && "Invalid float abi!");
1195 CmdArgs.push_back("-mhard-float");
1196 }
1197}
1198
Chandler Carruth953fb082013-01-13 11:46:33 +00001199static const char *getX86TargetCPU(const ArgList &Args,
1200 const llvm::Triple &Triple) {
1201 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1202 if (StringRef(A->getValue()) != "native")
1203 return A->getValue();
1204
1205 // FIXME: Reject attempts to use -march=native unless the target matches
1206 // the host.
1207 //
1208 // FIXME: We should also incorporate the detected target features for use
1209 // with -native.
1210 std::string CPU = llvm::sys::getHostCPUName();
1211 if (!CPU.empty() && CPU != "generic")
1212 return Args.MakeArgString(CPU);
1213 }
1214
1215 // Select the default CPU if none was given (or detection failed).
1216
1217 if (Triple.getArch() != llvm::Triple::x86_64 &&
1218 Triple.getArch() != llvm::Triple::x86)
1219 return 0; // This routine is only handling x86 targets.
1220
1221 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1222
1223 // FIXME: Need target hooks.
1224 if (Triple.isOSDarwin())
1225 return Is64Bit ? "core2" : "yonah";
1226
1227 // Everything else goes to x86-64 in 64-bit mode.
1228 if (Is64Bit)
1229 return "x86-64";
1230
1231 if (Triple.getOSName().startswith("haiku"))
1232 return "i586";
1233 if (Triple.getOSName().startswith("openbsd"))
1234 return "i486";
1235 if (Triple.getOSName().startswith("bitrig"))
1236 return "i686";
1237 if (Triple.getOSName().startswith("freebsd"))
1238 return "i486";
1239 if (Triple.getOSName().startswith("netbsd"))
1240 return "i486";
1241 // All x86 devices running Android have core2 as their common
1242 // denominator. This makes a better choice than pentium4.
1243 if (Triple.getEnvironment() == llvm::Triple::Android)
1244 return "core2";
1245
1246 // Fallback to p4.
1247 return "pentium4";
1248}
1249
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001250void Clang::AddX86TargetArgs(const ArgList &Args,
1251 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001252 if (!Args.hasFlag(options::OPT_mred_zone,
1253 options::OPT_mno_red_zone,
1254 true) ||
1255 Args.hasArg(options::OPT_mkernel) ||
1256 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001257 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001258
Bob Wilson2616e2e2013-02-10 16:01:41 +00001259 // Default to avoid implicit floating-point for kernel/kext code, but allow
1260 // that to be overridden with -mno-soft-float.
1261 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1262 Args.hasArg(options::OPT_fapple_kext));
1263 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1264 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001265 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001266 options::OPT_mno_implicit_float)) {
1267 const Option &O = A->getOption();
1268 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1269 O.matches(options::OPT_msoft_float));
1270 }
1271 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001272 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001273
Chandler Carruth953fb082013-01-13 11:46:33 +00001274 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001275 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001276 CmdArgs.push_back(CPUName);
1277 }
1278
Eli Friedmanad811f02011-07-02 00:34:19 +00001279 // The required algorithm here is slightly strange: the options are applied
1280 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1281 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1282 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1283 // former correctly, but not the latter; handle directly-overridden
1284 // attributes here.
1285 llvm::StringMap<unsigned> PrevFeature;
1286 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001287 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1288 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001289 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001290 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001291
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001292 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001293 assert(Name.startswith("m") && "Invalid feature name.");
1294 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001295
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001296 bool IsNegative = Name.startswith("no-");
1297 if (IsNegative)
1298 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001299
Eli Friedmanad811f02011-07-02 00:34:19 +00001300 unsigned& Prev = PrevFeature[Name];
1301 if (Prev)
1302 Features[Prev - 1] = 0;
1303 Prev = Features.size() + 1;
1304 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1305 }
1306 for (unsigned i = 0; i < Features.size(); i++) {
1307 if (Features[i]) {
1308 CmdArgs.push_back("-target-feature");
1309 CmdArgs.push_back(Features[i]);
1310 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001311 }
1312}
1313
Matthew Curtise8f80a12012-12-06 17:49:03 +00001314static inline bool HasPICArg(const ArgList &Args) {
1315 return Args.hasArg(options::OPT_fPIC)
1316 || Args.hasArg(options::OPT_fpic);
1317}
1318
1319static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1320 return Args.getLastArg(options::OPT_G,
1321 options::OPT_G_EQ,
1322 options::OPT_msmall_data_threshold_EQ);
1323}
1324
1325static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1326 std::string value;
1327 if (HasPICArg(Args))
1328 value = "0";
1329 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1330 value = A->getValue();
1331 A->claim();
1332 }
1333 return value;
1334}
1335
Tony Linthicum76329bf2011-12-12 21:14:55 +00001336void Clang::AddHexagonTargetArgs(const ArgList &Args,
1337 ArgStringList &CmdArgs) const {
1338 llvm::Triple Triple = getToolChain().getTriple();
1339
1340 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001341 CmdArgs.push_back(Args.MakeArgString(
1342 "hexagon"
1343 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001344 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001345 CmdArgs.push_back("-mqdsp6-compat");
1346 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001347
Matthew Curtise8f80a12012-12-06 17:49:03 +00001348 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1349 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001350 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001351 CmdArgs.push_back(Args.MakeArgString(
1352 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001353 }
1354
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001355 if (!Args.hasArg(options::OPT_fno_short_enums))
1356 CmdArgs.push_back("-fshort-enums");
1357 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1358 CmdArgs.push_back ("-mllvm");
1359 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1360 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001361 CmdArgs.push_back ("-mllvm");
1362 CmdArgs.push_back ("-machine-sink-split=0");
1363}
1364
Eric Christopher84fbdb42011-08-19 00:30:14 +00001365static bool
John McCall5fb5df92012-06-20 06:18:46 +00001366shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001367 const llvm::Triple &Triple) {
1368 // We use the zero-cost exception tables for Objective-C if the non-fragile
1369 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1370 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001371 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001372 return true;
1373
Bob Wilson6524dd32011-10-14 05:03:44 +00001374 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001375 return false;
1376
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001377 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001378 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001379 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001380}
1381
Anders Carlssone96ab552011-02-28 02:27:16 +00001382/// addExceptionArgs - Adds exception related arguments to the driver command
1383/// arguments. There's a master flag, -fexceptions and also language specific
1384/// flags to enable/disable C++ and Objective-C exceptions.
1385/// This makes it possible to for example disable C++ exceptions but enable
1386/// Objective-C exceptions.
1387static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1388 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001389 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001390 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001391 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001392 if (KernelOrKext) {
1393 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1394 // arguments now to avoid warnings about unused arguments.
1395 Args.ClaimAllArgs(options::OPT_fexceptions);
1396 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1397 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1398 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1399 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1400 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001401 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001402 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001403
1404 // Exceptions are enabled by default.
1405 bool ExceptionsEnabled = true;
1406
1407 // This keeps track of whether exceptions were explicitly turned on or off.
1408 bool DidHaveExplicitExceptionFlag = false;
1409
Rafael Espindola00a66572009-10-01 13:33:33 +00001410 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1411 options::OPT_fno_exceptions)) {
1412 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001413 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001414 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001415 ExceptionsEnabled = false;
1416
1417 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001418 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001419
Anders Carlssone96ab552011-02-28 02:27:16 +00001420 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001421
Anders Carlssone96ab552011-02-28 02:27:16 +00001422 // Exception tables and cleanups can be enabled with -fexceptions even if the
1423 // language itself doesn't support exceptions.
1424 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1425 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001426
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001427 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1428 // is not necessarily sensible, but follows GCC.
1429 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001430 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001431 options::OPT_fno_objc_exceptions,
1432 true)) {
1433 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001434
Eric Christopher84fbdb42011-08-19 00:30:14 +00001435 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001436 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001437 }
1438
1439 if (types::isCXX(InputType)) {
1440 bool CXXExceptionsEnabled = ExceptionsEnabled;
1441
Eric Christopher84fbdb42011-08-19 00:30:14 +00001442 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1443 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001444 options::OPT_fexceptions,
1445 options::OPT_fno_exceptions)) {
1446 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1447 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001448 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001449 CXXExceptionsEnabled = false;
1450 }
1451
1452 if (CXXExceptionsEnabled) {
1453 CmdArgs.push_back("-fcxx-exceptions");
1454
1455 ShouldUseExceptionTables = true;
1456 }
1457 }
1458
1459 if (ShouldUseExceptionTables)
1460 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001461}
1462
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001463static bool ShouldDisableAutolink(const ArgList &Args,
1464 const ToolChain &TC) {
1465 bool Default = true;
1466 if (TC.getTriple().isOSDarwin()) {
1467 // The native darwin assembler doesn't support the linker_option directives,
1468 // so we disable them if we think the .s file will be passed to it.
1469 Default = TC.useIntegratedAs();
1470 }
1471 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1472 Default);
1473}
1474
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001475static bool ShouldDisableCFI(const ArgList &Args,
1476 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001477 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001478 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001479 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001480 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001481 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001482 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001483 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001484 options::OPT_fno_dwarf2_cfi_asm,
1485 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001486}
1487
Ted Kremenek62093662013-03-12 17:02:12 +00001488static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1489 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001490 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1491 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001492 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001493 return !UseDwarfDirectory;
1494}
1495
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001496/// \brief Check whether the given input tree contains any compilation actions.
1497static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001498 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001499 return true;
1500
1501 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1502 if (ContainsCompileAction(*it))
1503 return true;
1504
1505 return false;
1506}
1507
1508/// \brief Check if -relax-all should be passed to the internal assembler.
1509/// This is done by default when compiling non-assembler source with -O0.
1510static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1511 bool RelaxDefault = true;
1512
1513 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1514 RelaxDefault = A->getOption().matches(options::OPT_O0);
1515
1516 if (RelaxDefault) {
1517 RelaxDefault = false;
1518 for (ActionList::const_iterator it = C.getActions().begin(),
1519 ie = C.getActions().end(); it != ie; ++it) {
1520 if (ContainsCompileAction(*it)) {
1521 RelaxDefault = true;
1522 break;
1523 }
1524 }
1525 }
1526
1527 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1528 RelaxDefault);
1529}
1530
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001531SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001532 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1533 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001534 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1535 // at least once (possibly, disabled further).
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001536 const Driver &D = TC.getDriver();
Richard Smith52be6192012-11-05 22:04:41 +00001537 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001538 unsigned Add, Remove;
1539 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001540 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001541 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001542 Kind |= Add;
1543 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001544 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001545 }
1546
Chad Rosierae229d52013-01-29 23:31:22 +00001547 UbsanTrapOnError =
1548 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1549 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1550 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1551
1552 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1553 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1554 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1555 D.Diag(diag::err_drv_argument_not_allowed_with)
1556 << "-fcatch-undefined-behavior"
1557 << "-fno-sanitize-undefined-trap-on-error";
1558 }
1559
1560 // Warn about undefined sanitizer options that require runtime support.
1561 if (UbsanTrapOnError && notAllowedWithTrap()) {
1562 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1563 D.Diag(diag::err_drv_argument_not_allowed_with)
1564 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1565 << "-fcatch-undefined-behavior";
1566 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1567 options::OPT_fno_sanitize_undefined_trap_on_error,
1568 false))
1569 D.Diag(diag::err_drv_argument_not_allowed_with)
1570 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1571 << "-fsanitize-undefined-trap-on-error";
1572 }
1573
Richard Smith52be6192012-11-05 22:04:41 +00001574 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001575 bool NeedsAsan = needsAsanRt();
1576 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001577 bool NeedsMsan = needsMsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001578 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001579 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001580 << lastArgumentForKind(D, Args, NeedsAsanRt)
1581 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001582 if (NeedsAsan && NeedsMsan)
1583 D.Diag(diag::err_drv_argument_not_allowed_with)
1584 << lastArgumentForKind(D, Args, NeedsAsanRt)
1585 << lastArgumentForKind(D, Args, NeedsMsanRt);
1586 if (NeedsTsan && NeedsMsan)
1587 D.Diag(diag::err_drv_argument_not_allowed_with)
1588 << lastArgumentForKind(D, Args, NeedsTsanRt)
1589 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001590
1591 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001592 // explicitly contain -fsanitize=address (probably, turned off later in the
1593 // command line).
1594 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1595 D.Diag(diag::warn_drv_unused_sanitizer)
1596 << lastArgumentForKind(D, Args, AddressFull)
1597 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001598
1599 // Parse -f(no-)sanitize-blacklist options.
1600 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1601 options::OPT_fno_sanitize_blacklist)) {
1602 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1603 std::string BLPath = BLArg->getValue();
1604 bool BLExists = false;
1605 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1606 BlacklistFile = BLPath;
1607 else
1608 D.Diag(diag::err_drv_no_such_file) << BLPath;
1609 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001610 } else {
1611 // If no -fsanitize-blacklist option is specified, try to look up for
1612 // blacklist in the resource directory.
1613 std::string BLPath;
1614 bool BLExists = false;
1615 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1616 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1617 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001618 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001619
1620 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001621 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001622 MsanTrackOrigins =
1623 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1624 options::OPT_fno_sanitize_memory_track_origins,
1625 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001626
1627 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov7e434072013-04-09 07:27:44 +00001628 if (NeedsAsan) {
1629 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1630 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov29524a92013-01-20 13:12:12 +00001631 AsanZeroBaseShadow =
Alexey Samsonov7e434072013-04-09 07:27:44 +00001632 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1633 options::OPT_fno_sanitize_address_zero_base_shadow,
1634 ZeroBaseShadowDefault);
1635 // Zero-base shadow is a requirement on Android.
1636 if (IsAndroid && !AsanZeroBaseShadow) {
1637 D.Diag(diag::err_drv_argument_not_allowed_with)
1638 << "-fno-sanitize-address-zero-base-shadow"
1639 << lastArgumentForKind(D, Args, Address);
1640 }
1641 }
Richard Smith52be6192012-11-05 22:04:41 +00001642}
1643
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001644static void addSanitizerRTLinkFlagsLinux(
1645 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001646 const StringRef Sanitizer, bool BeforeLibStdCXX,
1647 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001648 // Sanitizer runtime is located in the Linux library directory and
1649 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1650 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1651 llvm::sys::path::append(
1652 LibSanitizer, "lib", "linux",
1653 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001654
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001655 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1656 // etc.) so that the linker picks custom versions of the global 'operator
1657 // new' and 'operator delete' symbols. We take the extreme (but simple)
1658 // strategy of inserting it at the front of the link command. It also
1659 // needs to be forced to end up in the executable, so wrap it in
1660 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001661 SmallVector<const char *, 3> LibSanitizerArgs;
1662 LibSanitizerArgs.push_back("-whole-archive");
1663 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1664 LibSanitizerArgs.push_back("-no-whole-archive");
1665
1666 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1667 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1668
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001669 CmdArgs.push_back("-lpthread");
1670 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001671
1672 // If possible, use a dynamic symbols file to export the symbols from the
1673 // runtime library. If we can't do so, use -export-dynamic instead to export
1674 // all symbols from the binary.
1675 if (ExportSymbols) {
1676 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1677 CmdArgs.push_back(
1678 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1679 else
1680 CmdArgs.push_back("-export-dynamic");
1681 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001682}
1683
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001684/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1685/// This needs to be called before we add the C run-time (malloc, etc).
1686static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001687 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001688 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001689 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1690 llvm::sys::path::append(LibAsan, "lib", "linux",
1691 (Twine("libclang_rt.asan-") +
1692 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001693 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001694 } else {
1695 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001696 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001697 }
1698 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001699}
1700
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001701/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1702/// This needs to be called before we add the C run-time (malloc, etc).
1703static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1704 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001705 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001706 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001707 }
1708}
1709
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001710/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1711/// This needs to be called before we add the C run-time (malloc, etc).
1712static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1713 ArgStringList &CmdArgs) {
1714 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001715 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001716 }
1717}
1718
Richard Smithe30752c2012-10-09 19:52:38 +00001719/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1720/// (Linux).
1721static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001722 ArgStringList &CmdArgs, bool IsCXX,
1723 bool HasOtherSanitizerRt) {
1724 if (Args.hasArg(options::OPT_shared))
1725 return;
1726
1727 // Need a copy of sanitizer_common. This could come from another sanitizer
1728 // runtime; if we're not including one, include our own copy.
1729 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001730 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001731
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001732 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001733
1734 // Only include the bits of the runtime which need a C++ ABI library if
1735 // we're linking in C++ mode.
1736 if (IsCXX)
1737 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001738}
1739
Rafael Espindola224dd632011-12-14 21:02:23 +00001740static bool shouldUseFramePointer(const ArgList &Args,
1741 const llvm::Triple &Triple) {
1742 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1743 options::OPT_fomit_frame_pointer))
1744 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1745
Rafael Espindola00b29182011-12-14 21:50:24 +00001746 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001747 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1748 Triple.getArch() == llvm::Triple::x86) &&
1749 Triple.getOS() == llvm::Triple::Linux) {
1750 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1751 if (!A->getOption().matches(options::OPT_O0))
1752 return false;
1753 }
1754
1755 return true;
1756}
1757
Eric Christopherb7d97e92013-04-03 01:58:53 +00001758static bool shouldUseLeafFramePointer(const ArgList &Args,
1759 const llvm::Triple &Triple) {
1760 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1761 options::OPT_momit_leaf_frame_pointer))
1762 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1763
1764 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1765 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1766 Triple.getArch() == llvm::Triple::x86) &&
1767 Triple.getOS() == llvm::Triple::Linux) {
1768 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1769 if (!A->getOption().matches(options::OPT_O0))
1770 return false;
1771 }
1772
1773 return true;
1774}
1775
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001776/// If the PWD environment variable is set, add a CC1 option to specify the
1777/// debug compilation directory.
1778static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1779 if (const char *pwd = ::getenv("PWD")) {
1780 // GCC also verifies that stat(pwd) and stat(".") have the same inode
1781 // number. Not doing those because stats are slow, but we could.
1782 if (llvm::sys::path::is_absolute(pwd)) {
1783 std::string CompDir = pwd;
1784 CmdArgs.push_back("-fdebug-compilation-dir");
1785 CmdArgs.push_back(Args.MakeArgString(CompDir));
1786 }
1787 }
1788}
1789
Eric Christopherd3804002013-02-22 20:12:52 +00001790static const char *SplitDebugName(const ArgList &Args,
1791 const InputInfoList &Inputs) {
1792 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1793 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1794 SmallString<128> T(FinalOutput->getValue());
1795 llvm::sys::path::replace_extension(T, "dwo");
1796 return Args.MakeArgString(T);
1797 } else {
1798 // Use the compilation dir.
1799 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1800 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1801 llvm::sys::path::replace_extension(F, "dwo");
1802 T += F;
1803 return Args.MakeArgString(F);
1804 }
1805}
1806
1807static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1808 const Tool &T, const JobAction &JA,
1809 const ArgList &Args, const InputInfo &Output,
1810 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001811 ArgStringList ExtractArgs;
1812 ExtractArgs.push_back("--extract-dwo");
1813
1814 ArgStringList StripArgs;
1815 StripArgs.push_back("--strip-dwo");
1816
1817 // Grabbing the output of the earlier compile step.
1818 StripArgs.push_back(Output.getFilename());
1819 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001820 ExtractArgs.push_back(OutFile);
1821
1822 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001823 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001824
1825 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001826 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001827
1828 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001829 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001830}
1831
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001832void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001833 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001834 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001835 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001836 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001837 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1838 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001839 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001840 ArgStringList CmdArgs;
1841
Daniel Dunbare521a892009-03-31 20:53:55 +00001842 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1843
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001844 // Invoke ourselves in -cc1 mode.
1845 //
1846 // FIXME: Implement custom jobs for internal actions.
1847 CmdArgs.push_back("-cc1");
1848
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001849 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001850 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001851 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001852 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001853
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001854 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001855 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001856
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001857 if (isa<AnalyzeJobAction>(JA)) {
1858 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1859 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001860 } else if (isa<MigrateJobAction>(JA)) {
1861 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001862 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001863 if (Output.getType() == types::TY_Dependencies)
1864 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001865 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001866 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001867 if (Args.hasArg(options::OPT_rewrite_objc) &&
1868 !Args.hasArg(options::OPT_g_Group))
1869 CmdArgs.push_back("-P");
1870 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001871 } else if (isa<AssembleJobAction>(JA)) {
1872 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001873
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001874 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001875 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001876
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001877 // When using an integrated assembler, translate -Wa, and -Xassembler
1878 // options.
1879 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1880 options::OPT_Xassembler),
1881 ie = Args.filtered_end(); it != ie; ++it) {
1882 const Arg *A = *it;
1883 A->claim();
1884
1885 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001886 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001887
1888 if (Value == "-force_cpusubtype_ALL") {
1889 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001890 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001891 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001892 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001893 CmdArgs.push_back("-mllvm");
1894 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001895 } else if (Value == "--noexecstack") {
1896 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001897 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001898 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001899 << A->getOption().getName() << Value;
1900 }
1901 }
1902 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001903
1904 // Also ignore explicit -force_cpusubtype_ALL option.
1905 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001906 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001907 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001908 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001909
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001910 if (JA.getType() == types::TY_Nothing)
1911 CmdArgs.push_back("-fsyntax-only");
1912 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001913 CmdArgs.push_back("-emit-pch");
1914 else
1915 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001916 } else {
1917 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001918
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001919 if (JA.getType() == types::TY_Nothing) {
1920 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001921 } else if (JA.getType() == types::TY_LLVM_IR ||
1922 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001923 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001924 } else if (JA.getType() == types::TY_LLVM_BC ||
1925 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001926 CmdArgs.push_back("-emit-llvm-bc");
1927 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001928 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001929 } else if (JA.getType() == types::TY_AST) {
1930 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00001931 } else if (JA.getType() == types::TY_ModuleFile) {
1932 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001933 } else if (JA.getType() == types::TY_RewrittenObjC) {
1934 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001935 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001936 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1937 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001938 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001939 } else {
1940 assert(JA.getType() == types::TY_PP_Asm &&
1941 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001942 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001943 }
1944
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001945 // The make clang go fast button.
1946 CmdArgs.push_back("-disable-free");
1947
John McCallbb79b5f2010-02-13 03:50:24 +00001948 // Disable the verification pass in -asserts builds.
1949#ifdef NDEBUG
1950 CmdArgs.push_back("-disable-llvm-verifier");
1951#endif
1952
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001953 // Set the main file name, so that debug info works even with
1954 // -save-temps.
1955 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001956 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001957
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001958 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001959 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001960 if (Args.hasArg(options::OPT_static))
1961 CmdArgs.push_back("-static-define");
1962
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001963 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001964 // Enable region store model by default.
1965 CmdArgs.push_back("-analyzer-store=region");
1966
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001967 // Treat blocks as analysis entry points.
1968 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1969
Ted Kremenek49c79792011-03-24 00:28:47 +00001970 CmdArgs.push_back("-analyzer-eagerly-assume");
1971
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001972 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001973 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001974 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001975
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001976 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1977 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001978
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001979 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001980 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001981
1982 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001983
Jordan Rose10ad0812013-04-05 17:55:07 +00001984 if (types::isCXX(Inputs[0].getType()))
1985 CmdArgs.push_back("-analyzer-checker=cplusplus");
1986
Ted Kremenek37e96522012-01-26 02:27:38 +00001987 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001988 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1989 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1990 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1991 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1992 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1993 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001994 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001995
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001996 // Set the output format. The default is plist, for (lame) historical
1997 // reasons.
1998 CmdArgs.push_back("-analyzer-output");
1999 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002000 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002001 else
2002 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002003
Ted Kremenekfe449a22010-03-22 22:32:05 +00002004 // Disable the presentation of standard compiler warnings when
2005 // using --analyze. We only want to show static analyzer diagnostics
2006 // or frontend errors.
2007 CmdArgs.push_back("-w");
2008
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002009 // Add -Xanalyzer arguments when running as analyzer.
2010 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002011 }
2012
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002013 CheckCodeGenerationOptions(D, Args);
2014
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002015 bool PIE = getToolChain().isPIEDefault();
2016 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002017 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002018
Alexey Samsonov090301e2013-04-09 12:28:19 +00002019 // For the PIC and PIE flag options, this logic is different from the
2020 // legacy logic in very old versions of GCC, as that logic was just
2021 // a bug no one had ever fixed. This logic is both more rational and
2022 // consistent with GCC's new logic now that the bugs are fixed. The last
2023 // argument relating to either PIC or PIE wins, and no other argument is
2024 // used. If the last argument is any flavor of the '-fno-...' arguments,
2025 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2026 // at the same level.
2027 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2028 options::OPT_fpic, options::OPT_fno_pic,
2029 options::OPT_fPIE, options::OPT_fno_PIE,
2030 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002031 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2032 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002033 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002034 if (LastPICArg) {
2035 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002036 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2037 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2038 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2039 PIC = PIE || O.matches(options::OPT_fPIC) ||
2040 O.matches(options::OPT_fpic);
2041 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2042 O.matches(options::OPT_fPIC);
2043 } else {
2044 PIE = PIC = false;
2045 }
2046 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002047 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002048
2049 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2050 // specified while enabling PIC enabled level 1 PIC, just force it back to
2051 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2052 // informal testing).
2053 if (PIC && getToolChain().getTriple().isOSDarwin())
2054 IsPICLevelTwo |= getToolChain().isPICDefault();
2055
Chandler Carruthc0c04552012-04-08 16:40:35 +00002056 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2057 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002058 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002059 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002060 (Triple.getOS() != llvm::Triple::IOS ||
2061 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002062 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002063 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002064 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002065
Chandler Carruth76a943b2012-11-19 03:52:03 +00002066 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2067 // This is a very special mode. It trumps the other modes, almost no one
2068 // uses it, and it isn't even valid on any OS but Darwin.
2069 if (!getToolChain().getTriple().isOSDarwin())
2070 D.Diag(diag::err_drv_unsupported_opt_for_target)
2071 << A->getSpelling() << getToolChain().getTriple().str();
2072
2073 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2074
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002075 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002076 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002077
Chandler Carruth76a943b2012-11-19 03:52:03 +00002078 // Only a forced PIC mode can cause the actual compile to have PIC defines
2079 // etc., no flags are sufficient. This behavior was selected to closely
2080 // match that of llvm-gcc and Apple GCC before that.
2081 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2082 CmdArgs.push_back("-pic-level");
2083 CmdArgs.push_back("2");
2084 }
2085 } else {
2086 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2087 // handled in Clang's IRGen by the -pie-level flag.
2088 CmdArgs.push_back("-mrelocation-model");
2089 CmdArgs.push_back(PIC ? "pic" : "static");
2090
2091 if (PIC) {
2092 CmdArgs.push_back("-pic-level");
2093 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2094 if (PIE) {
2095 CmdArgs.push_back("-pie-level");
2096 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2097 }
2098 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002099 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002100
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002101 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2102 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002103 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002104
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002105 // LLVM Code Generator Options.
2106
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002107 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2108 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002109 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002110 }
2111
Roman Divacky65b88cd2011-03-01 17:40:53 +00002112 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2113 CmdArgs.push_back("-mrtd");
2114
Rafael Espindola224dd632011-12-14 21:02:23 +00002115 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002116 CmdArgs.push_back("-mdisable-fp-elim");
2117 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2118 options::OPT_fno_zero_initialized_in_bss))
2119 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002120 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
2121 options::OPT_fno_strict_aliasing,
2122 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002123 CmdArgs.push_back("-relaxed-aliasing");
Manman Renc451e572013-04-04 21:53:22 +00002124 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2125 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002126 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2127 false))
2128 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002129 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2130 options::OPT_fno_optimize_sibling_calls))
2131 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002132
Eric Christopher006208c2013-04-04 06:29:47 +00002133 // Handle segmented stacks.
2134 if (Args.hasArg(options::OPT_fsplit_stack))
2135 CmdArgs.push_back("-split-stacks");
2136
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002137 // Handle various floating point optimization flags, mapping them to the
2138 // appropriate LLVM code generation flags. The pattern for all of these is to
2139 // default off the codegen optimizations, and if any flag enables them and no
2140 // flag disables them after the flag enabling them, enable the codegen
2141 // optimization. This is complicated by several "umbrella" flags.
2142 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002143 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002144 options::OPT_ffinite_math_only,
2145 options::OPT_fno_finite_math_only,
2146 options::OPT_fhonor_infinities,
2147 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002148 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2149 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002150 A->getOption().getID() != options::OPT_fhonor_infinities)
2151 CmdArgs.push_back("-menable-no-infs");
2152 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002153 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002154 options::OPT_ffinite_math_only,
2155 options::OPT_fno_finite_math_only,
2156 options::OPT_fhonor_nans,
2157 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002158 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2159 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002160 A->getOption().getID() != options::OPT_fhonor_nans)
2161 CmdArgs.push_back("-menable-no-nans");
2162
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002163 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2164 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002165 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002166 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002167 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00002168 options::OPT_fno_math_errno))
2169 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2170 if (MathErrno)
2171 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002172
2173 // There are several flags which require disabling very specific
2174 // optimizations. Any of these being disabled forces us to turn off the
2175 // entire set of LLVM optimizations, so collect them through all the flag
2176 // madness.
2177 bool AssociativeMath = false;
2178 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002179 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002180 options::OPT_funsafe_math_optimizations,
2181 options::OPT_fno_unsafe_math_optimizations,
2182 options::OPT_fassociative_math,
2183 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002184 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2185 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002186 A->getOption().getID() != options::OPT_fno_associative_math)
2187 AssociativeMath = true;
2188 bool ReciprocalMath = false;
2189 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002190 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002191 options::OPT_funsafe_math_optimizations,
2192 options::OPT_fno_unsafe_math_optimizations,
2193 options::OPT_freciprocal_math,
2194 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002195 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2196 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002197 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2198 ReciprocalMath = true;
2199 bool SignedZeros = true;
2200 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002201 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002202 options::OPT_funsafe_math_optimizations,
2203 options::OPT_fno_unsafe_math_optimizations,
2204 options::OPT_fsigned_zeros,
2205 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002206 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2207 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002208 A->getOption().getID() != options::OPT_fsigned_zeros)
2209 SignedZeros = false;
2210 bool TrappingMath = true;
2211 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002212 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002213 options::OPT_funsafe_math_optimizations,
2214 options::OPT_fno_unsafe_math_optimizations,
2215 options::OPT_ftrapping_math,
2216 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002217 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2218 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002219 A->getOption().getID() != options::OPT_ftrapping_math)
2220 TrappingMath = false;
2221 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2222 !TrappingMath)
2223 CmdArgs.push_back("-menable-unsafe-fp-math");
2224
Lang Hamesaa53b932012-07-06 00:59:19 +00002225
2226 // Validate and pass through -fp-contract option.
2227 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002228 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002229 options::OPT_ffp_contract)) {
2230 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002231 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002232 if (Val == "fast" || Val == "on" || Val == "off") {
2233 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2234 } else {
2235 D.Diag(diag::err_drv_unsupported_option_argument)
2236 << A->getOption().getName() << Val;
2237 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002238 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002239 // If fast-math is set then set the fp-contract mode to fast.
2240 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2241 }
2242 }
2243
Bob Wilson6a039162012-07-19 03:52:53 +00002244 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2245 // and if we find them, tell the frontend to provide the appropriate
2246 // preprocessor macros. This is distinct from enabling any optimizations as
2247 // these options induce language changes which must survive serialization
2248 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002249 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2250 if (A->getOption().matches(options::OPT_ffast_math))
2251 CmdArgs.push_back("-ffast-math");
2252 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2253 if (A->getOption().matches(options::OPT_ffinite_math_only))
2254 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002255
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002256 // Decide whether to use verbose asm. Verbose assembly is the default on
2257 // toolchains which have the integrated assembler on by default.
2258 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2259 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002260 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002261 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002262 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002263
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002264 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2265 CmdArgs.push_back("-mdebug-pass");
2266 CmdArgs.push_back("Structure");
2267 }
2268 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2269 CmdArgs.push_back("-mdebug-pass");
2270 CmdArgs.push_back("Arguments");
2271 }
2272
John McCall8517abc2010-02-19 02:45:38 +00002273 // Enable -mconstructor-aliases except on darwin, where we have to
2274 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002275 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002276 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002277
John McCall7ef5cb32011-03-18 02:56:14 +00002278 // Darwin's kernel doesn't support guard variables; just die if we
2279 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002280 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002281 CmdArgs.push_back("-fforbid-guard-variables");
2282
Douglas Gregordbe39272011-02-01 15:15:22 +00002283 if (Args.hasArg(options::OPT_mms_bitfields)) {
2284 CmdArgs.push_back("-mms-bitfields");
2285 }
John McCall8517abc2010-02-19 02:45:38 +00002286
Daniel Dunbar306945d2009-09-16 06:17:29 +00002287 // This is a coarse approximation of what llvm-gcc actually does, both
2288 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2289 // complicated ways.
2290 bool AsynchronousUnwindTables =
2291 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2292 options::OPT_fno_asynchronous_unwind_tables,
2293 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002294 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002295 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2296 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002297 CmdArgs.push_back("-munwind-tables");
2298
Chandler Carruth05fb5852012-11-21 23:40:23 +00002299 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002300
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002301 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2302 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002303 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002304 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002305
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002306 // FIXME: Handle -mtune=.
2307 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002308
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002309 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002310 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002311 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002312 }
2313
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002314 // Add target specific cpu and features flags.
2315 switch(getToolChain().getTriple().getArch()) {
2316 default:
2317 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002318
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002319 case llvm::Triple::arm:
2320 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002321 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002322 break;
2323
Eric Christopher0b26a612010-03-02 02:41:08 +00002324 case llvm::Triple::mips:
2325 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002326 case llvm::Triple::mips64:
2327 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002328 AddMIPSTargetArgs(Args, CmdArgs);
2329 break;
2330
Hal Finkel8eb59282012-06-11 22:35:19 +00002331 case llvm::Triple::ppc:
2332 case llvm::Triple::ppc64:
2333 AddPPCTargetArgs(Args, CmdArgs);
2334 break;
2335
Tom Stellard6674c702013-04-01 20:56:53 +00002336 case llvm::Triple::r600:
2337 AddR600TargetArgs(Args, CmdArgs);
2338 break;
2339
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002340 case llvm::Triple::sparc:
2341 AddSparcTargetArgs(Args, CmdArgs);
2342 break;
2343
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002344 case llvm::Triple::x86:
2345 case llvm::Triple::x86_64:
2346 AddX86TargetArgs(Args, CmdArgs);
2347 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002348
2349 case llvm::Triple::hexagon:
2350 AddHexagonTargetArgs(Args, CmdArgs);
2351 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002352 }
2353
Tony Linthicum76329bf2011-12-12 21:14:55 +00002354
2355
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002356 // Pass the linker version in use.
2357 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2358 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002359 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002360 }
2361
Eric Christopherb7d97e92013-04-03 01:58:53 +00002362 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002363 CmdArgs.push_back("-momit-leaf-frame-pointer");
2364
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002365 // Explicitly error on some things we know we don't support and can't just
2366 // ignore.
2367 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002368 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2369 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002370 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002371 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002372 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002373 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2374 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002375 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002376 << Unsupported->getOption().getName();
2377 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002378 }
2379
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002380 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002381 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002382 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002383 CmdArgs.push_back("-header-include-file");
2384 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2385 D.CCPrintHeadersFilename : "-");
2386 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002387 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002388 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002389
Chad Rosierbe10f982011-08-02 17:58:04 +00002390 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002391 CmdArgs.push_back("-diagnostic-log-file");
2392 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2393 D.CCLogDiagnosticsFilename : "-");
2394 }
2395
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002396 // Use the last option from "-g" group. "-gline-tables-only"
2397 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002398 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002399 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002400 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002401 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002402 else if (!A->getOption().matches(options::OPT_g0) &&
2403 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002404 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002405 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002406
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002407 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2408 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002409 if (Args.hasArg(options::OPT_gcolumn_info))
2410 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002411
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002412 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2413 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002414 // FIXME: Currently only works on Linux.
2415 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2416 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002417 CmdArgs.push_back("-g");
2418 CmdArgs.push_back("-backend-option");
2419 CmdArgs.push_back("-split-dwarf=Enable");
2420 }
2421
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002422 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2423 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2424
Chris Lattner3c77a352010-06-22 00:03:40 +00002425 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2426
Nick Lewycky207bce32011-04-21 23:44:07 +00002427 if (Args.hasArg(options::OPT_ftest_coverage) ||
2428 Args.hasArg(options::OPT_coverage))
2429 CmdArgs.push_back("-femit-coverage-notes");
2430 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2431 Args.hasArg(options::OPT_coverage))
2432 CmdArgs.push_back("-femit-coverage-data");
2433
Nick Lewycky480cb992011-05-04 20:46:58 +00002434 if (C.getArgs().hasArg(options::OPT_c) ||
2435 C.getArgs().hasArg(options::OPT_S)) {
2436 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002437 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002438 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002439 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2440 if (const char *pwd = ::getenv("PWD")) {
2441 if (llvm::sys::path::is_absolute(pwd)) {
2442 SmallString<128> Pwd(pwd);
2443 llvm::sys::path::append(Pwd, CoverageFilename.str());
2444 CoverageFilename.swap(Pwd);
2445 }
2446 }
2447 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002448 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002449 }
2450 }
2451
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002452 // Pass options for controlling the default header search paths.
2453 if (Args.hasArg(options::OPT_nostdinc)) {
2454 CmdArgs.push_back("-nostdsysteminc");
2455 CmdArgs.push_back("-nobuiltininc");
2456 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002457 if (Args.hasArg(options::OPT_nostdlibinc))
2458 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002459 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2460 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2461 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002462
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002463 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002464 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002465 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002466
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002467 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2468
Ted Kremenekf7639e12012-03-06 20:06:33 +00002469 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002470 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002471 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002472 options::OPT_ccc_arcmt_modify,
2473 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002474 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002475 switch (A->getOption().getID()) {
2476 default:
2477 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002478 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002479 CmdArgs.push_back("-arcmt-check");
2480 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002481 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002482 CmdArgs.push_back("-arcmt-modify");
2483 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002484 case options::OPT_ccc_arcmt_migrate:
2485 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002486 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002487 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002488
2489 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2490 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002491 break;
John McCalld70fb982011-06-15 23:25:17 +00002492 }
2493 }
2494 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002495
Ted Kremenekf7639e12012-03-06 20:06:33 +00002496 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2497 if (ARCMTEnabled) {
2498 D.Diag(diag::err_drv_argument_not_allowed_with)
2499 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2500 }
2501 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002502 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002503
2504 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2505 options::OPT_objcmt_migrate_subscripting)) {
2506 // None specified, means enable them all.
2507 CmdArgs.push_back("-objcmt-migrate-literals");
2508 CmdArgs.push_back("-objcmt-migrate-subscripting");
2509 } else {
2510 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2511 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2512 }
2513 }
2514
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002515 // Add preprocessing options like -I, -D, etc. if we are using the
2516 // preprocessor.
2517 //
2518 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002519 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002520 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002521
Rafael Espindolaa7431922011-07-21 23:40:37 +00002522 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2523 // that "The compiler can only warn and ignore the option if not recognized".
2524 // When building with ccache, it will pass -D options to clang even on
2525 // preprocessed inputs and configure concludes that -fPIC is not supported.
2526 Args.ClaimAllArgs(options::OPT_D);
2527
Daniel Dunbar58f78332009-09-17 06:53:36 +00002528 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002529 // others.
2530 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002531 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002532 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002533 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002534 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002535 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002536 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002537 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002538 }
2539
Chad Rosier86b82082012-12-12 20:06:31 +00002540 // Don't warn about unused -flto. This can happen when we're preprocessing or
2541 // precompiling.
2542 Args.ClaimAllArgs(options::OPT_flto);
2543
Daniel Dunbar945577c2009-10-29 02:24:45 +00002544 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002545 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2546 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002547 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002548 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002549
2550 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2551 // (-ansi is equivalent to -std=c89).
2552 //
2553 // If a std is supplied, only add -trigraphs if it follows the
2554 // option.
2555 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2556 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002557 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002558 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002559 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002560 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002561 else
2562 Std->render(Args, CmdArgs);
2563
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002564 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2565 options::OPT_trigraphs))
2566 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002567 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002568 } else {
2569 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002570 //
2571 // FIXME: Clang doesn't correctly handle -std= when the input language
2572 // doesn't match. For the time being just ignore this for C++ inputs;
2573 // eventually we want to do all the standard defaulting here instead of
2574 // splitting it between the driver and clang -cc1.
2575 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002576 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2577 "-std=", /*Joined=*/true);
2578 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2579 CmdArgs.push_back("-std=c++11");
2580
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002581 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002582 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002583
Chandler Carruthb009b142011-04-23 06:30:43 +00002584 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2585 // '-fconst-strings'; this better indicates its actual behavior.
2586 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2587 false)) {
2588 // For perfect compatibility with GCC, we do this even in the presence of
2589 // '-w'. This flag names something other than a warning for GCC.
2590 CmdArgs.push_back("-fconst-strings");
2591 }
2592
Chandler Carruth61fbf622011-04-23 09:27:53 +00002593 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002594 // during C++ compilation, which it is by default. GCC keeps this define even
2595 // in the presence of '-w', match this behavior bug-for-bug.
2596 if (types::isCXX(InputType) &&
2597 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2598 true)) {
2599 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002600 }
2601
Chandler Carruthe0391482010-05-22 02:21:53 +00002602 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2603 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2604 if (Asm->getOption().matches(options::OPT_fasm))
2605 CmdArgs.push_back("-fgnu-keywords");
2606 else
2607 CmdArgs.push_back("-fno-gnu-keywords");
2608 }
2609
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002610 if (ShouldDisableCFI(Args, getToolChain()))
2611 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002612
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002613 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2614 CmdArgs.push_back("-fno-dwarf-directory-asm");
2615
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002616 if (ShouldDisableAutolink(Args, getToolChain()))
2617 CmdArgs.push_back("-fno-autolink");
2618
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002619 // Add in -fdebug-compilation-dir if necessary.
2620 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002621
Richard Smith9a568822011-11-21 19:36:32 +00002622 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2623 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002624 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002625 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002626 }
2627
Richard Smith9a568822011-11-21 19:36:32 +00002628 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2629 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002630 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002631 }
2632
Richard Smithb3a14522013-02-22 01:59:51 +00002633 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2634 CmdArgs.push_back("-fbracket-depth");
2635 CmdArgs.push_back(A->getValue());
2636 }
2637
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002638 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2639 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002640 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002641 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002642 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2643 } else
2644 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002645 }
2646
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002647
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002648 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002649 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002650
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002651 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2652 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002653 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002654 }
David Chisnall5778fce2009-08-31 16:41:57 +00002655
Chris Lattnere23003d2010-01-09 21:54:33 +00002656 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2657 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002658 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002659 }
2660
Chris Lattnerb35583d2010-04-07 20:49:23 +00002661 CmdArgs.push_back("-ferror-limit");
2662 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002663 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002664 else
2665 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002666
Chandler Carrutha77a7272010-05-06 04:55:18 +00002667 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2668 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002669 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002670 }
2671
2672 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2673 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002674 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002675 }
2676
Richard Smithf6f003a2011-12-16 19:06:07 +00002677 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2678 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002679 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002680 }
2681
Daniel Dunbar2c978472009-11-04 06:24:47 +00002682 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002683 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002684 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002685 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002686 } else {
2687 // If -fmessage-length=N was not specified, determine whether this is a
2688 // terminal and, if so, implicitly define -fmessage-length appropriately.
2689 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002690 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002691 }
2692
John McCallb4a99d32013-02-19 01:57:35 +00002693 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2694 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2695 options::OPT_fvisibility_ms_compat)) {
2696 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2697 CmdArgs.push_back("-fvisibility");
2698 CmdArgs.push_back(A->getValue());
2699 } else {
2700 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2701 CmdArgs.push_back("-fvisibility");
2702 CmdArgs.push_back("hidden");
2703 CmdArgs.push_back("-ftype-visibility");
2704 CmdArgs.push_back("default");
2705 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002706 }
2707
Douglas Gregor08329632010-06-15 17:05:35 +00002708 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002709
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002710 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2711
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002712 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002713 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2714 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002715 CmdArgs.push_back("-ffreestanding");
2716
Daniel Dunbare357d562009-12-03 18:42:11 +00002717 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002718 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002719 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002720 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002721 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002722 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002723 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002724 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2725 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002726
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002727 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smith52be6192012-11-05 22:04:41 +00002728 Sanitize.addArgs(Args, CmdArgs);
2729
Will Dietz3676d562012-12-30 20:53:28 +00002730 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2731 options::OPT_fno_sanitize_recover,
2732 true))
2733 CmdArgs.push_back("-fno-sanitize-recover");
2734
Chad Rosierae229d52013-01-29 23:31:22 +00002735 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2736 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2737 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2738 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2739
Eric Christopher459d2712013-02-19 06:16:53 +00002740 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002741 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2742 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2743 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2744 D.Diag(diag::err_drv_argument_only_allowed_with)
2745 << A->getAsString(Args) << "ppc/ppc64";
2746
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002747 if (getToolChain().SupportsProfiling())
2748 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002749
2750 // -flax-vector-conversions is default.
2751 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2752 options::OPT_fno_lax_vector_conversions))
2753 CmdArgs.push_back("-fno-lax-vector-conversions");
2754
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002755 if (Args.getLastArg(options::OPT_fapple_kext))
2756 CmdArgs.push_back("-fapple-kext");
2757
David Blaikie690f21e2012-06-14 18:55:27 +00002758 if (Args.hasFlag(options::OPT_frewrite_includes,
2759 options::OPT_fno_rewrite_includes, false))
2760 CmdArgs.push_back("-frewrite-includes");
2761
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002762 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002763 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002764 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002765 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2766 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002767
2768 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2769 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002770 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002771 }
2772
Bob Wilson14adb362012-02-03 06:27:22 +00002773 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002774
Chandler Carruth6e501032011-03-27 00:04:55 +00002775 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2776 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2777 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2778 options::OPT_fno_wrapv)) {
2779 if (A->getOption().matches(options::OPT_fwrapv))
2780 CmdArgs.push_back("-fwrapv");
2781 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2782 options::OPT_fno_strict_overflow)) {
2783 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2784 CmdArgs.push_back("-fwrapv");
2785 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002786 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002787 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002788
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002789 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2790
Mahesha S6a682be42012-10-27 07:47:56 +00002791
Daniel Dunbar4930e332009-11-17 08:07:36 +00002792 // -stack-protector=0 is default.
2793 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002794 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2795 options::OPT_fstack_protector_all,
2796 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002797 if (A->getOption().matches(options::OPT_fstack_protector))
2798 StackProtectorLevel = 1;
2799 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2800 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002801 } else {
2802 StackProtectorLevel =
2803 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2804 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002805 if (StackProtectorLevel) {
2806 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002807 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002808 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002809
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002810 // --param ssp-buffer-size=
2811 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2812 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002813 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002814 if (Str.startswith("ssp-buffer-size=")) {
2815 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002816 CmdArgs.push_back("-stack-protector-buffer-size");
2817 // FIXME: Verify the argument is a valid integer.
2818 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002819 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002820 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002821 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002822 }
2823
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002824 // Translate -mstackrealign
2825 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2826 false)) {
2827 CmdArgs.push_back("-backend-option");
2828 CmdArgs.push_back("-force-align-stack");
2829 }
2830 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2831 false)) {
2832 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2833 }
2834
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002835 if (Args.hasArg(options::OPT_mstack_alignment)) {
2836 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2837 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002838 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002839 // -mkernel implies -mstrict-align; don't add the redundant option.
2840 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002841 CmdArgs.push_back("-backend-option");
2842 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002843 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002844
Daniel Dunbard18049a2009-04-07 21:16:11 +00002845 // Forward -f options with positive and negative forms; we translate
2846 // these by hand.
2847
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002848 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002849 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002850 CmdArgs.push_back("-fapple-kext");
2851 if (!Args.hasArg(options::OPT_fbuiltin))
2852 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002853 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002854 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002855 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002856 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002857 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002858
Nuno Lopes13c88c72009-12-16 16:59:22 +00002859 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2860 options::OPT_fno_assume_sane_operator_new))
2861 CmdArgs.push_back("-fno-assume-sane-operator-new");
2862
Daniel Dunbar4930e332009-11-17 08:07:36 +00002863 // -fblocks=0 is default.
2864 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002865 getToolChain().IsBlocksDefault()) ||
2866 (Args.hasArg(options::OPT_fgnu_runtime) &&
2867 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2868 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002869 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002870
2871 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2872 !getToolChain().hasBlocksRuntime())
2873 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002874 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002875
Douglas Gregor226173a2012-01-18 15:19:58 +00002876 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2877 // users must also pass -fcxx-modules. The latter flag will disappear once the
2878 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002879 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002880 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2881 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2882 options::OPT_fno_cxx_modules,
2883 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002884 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002885 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002886 HaveModules = true;
2887 }
2888 }
2889
Douglas Gregor35b04d62013-02-07 19:01:24 +00002890 // If a module path was provided, pass it along. Otherwise, use a temporary
2891 // directory.
2892 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2893 A->claim();
2894 if (HaveModules) {
2895 A->render(Args, CmdArgs);
2896 }
2897 } else if (HaveModules) {
2898 SmallString<128> DefaultModuleCache;
2899 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2900 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00002901 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2902 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00002903 const char Arg[] = "-fmodules-cache-path=";
2904 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2905 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00002906 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2907 }
2908
2909 // Pass through all -fmodules-ignore-macro arguments.
2910 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00002911 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
2912 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00002913
John McCalldfea9982010-04-09 19:12:06 +00002914 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002915 if (Args.hasFlag(options::OPT_fno_access_control,
2916 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002917 false))
John McCall3155f572010-04-09 19:03:51 +00002918 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002919
Anders Carlssond470fef2010-11-21 00:09:52 +00002920 // -felide-constructors is the default.
2921 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2922 options::OPT_felide_constructors,
2923 false))
2924 CmdArgs.push_back("-fno-elide-constructors");
2925
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002926 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002927 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002928 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002929 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002930
Richard Smith52be6192012-11-05 22:04:41 +00002931 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002932 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002933 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002934 Args.getLastArg(options::OPT_mkernel,
2935 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002936 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002937 D.Diag(diag::err_drv_argument_not_allowed_with)
2938 << "-fsanitize=vptr" << NoRttiArg;
2939 }
2940 }
2941
Tony Linthicum76329bf2011-12-12 21:14:55 +00002942 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002943 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002944 options::OPT_fno_short_enums,
2945 getToolChain().getTriple().getArch() ==
2946 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002947 CmdArgs.push_back("-fshort-enums");
2948
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002949 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002950 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002951 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002952 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002953
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002954 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002955 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002956 options::OPT_fno_threadsafe_statics))
2957 CmdArgs.push_back("-fno-threadsafe-statics");
2958
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002959 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002960 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2961 options::OPT_fno_use_cxa_atexit,
2962 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002963 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002964 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2965 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002966 CmdArgs.push_back("-fno-use-cxa-atexit");
2967
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002968 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002969 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002970 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2971 CmdArgs.push_back("-fms-extensions");
2972
Francois Pichet1b4f1632011-09-17 04:32:15 +00002973 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002974 if (Args.hasFlag(options::OPT_fms_compatibility,
2975 options::OPT_fno_ms_compatibility,
2976 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2977 Args.hasFlag(options::OPT_fms_extensions,
2978 options::OPT_fno_ms_extensions,
2979 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002980 CmdArgs.push_back("-fms-compatibility");
2981
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002982 // -fmsc-version=1300 is default.
2983 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2984 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2985 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002986 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002987 if (msc_ver.empty())
2988 CmdArgs.push_back("-fmsc-version=1300");
2989 else
2990 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2991 }
2992
2993
Eric Christopher5ecce122013-02-18 00:38:31 +00002994 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002995 if (Args.hasFlag(options::OPT_fborland_extensions,
2996 options::OPT_fno_borland_extensions, false))
2997 CmdArgs.push_back("-fborland-extensions");
2998
Francois Pichet02744872011-09-01 16:38:08 +00002999 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3000 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003001 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3002 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003003 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003004 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003005
Chandler Carruthe03aa552010-04-17 20:17:31 +00003006 // -fgnu-keywords default varies depending on language; only pass if
3007 // specified.
3008 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003009 options::OPT_fno_gnu_keywords))
3010 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003011
Rafael Espindola922a6242011-06-02 17:30:53 +00003012 if (Args.hasFlag(options::OPT_fgnu89_inline,
3013 options::OPT_fno_gnu89_inline,
3014 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003015 CmdArgs.push_back("-fgnu89-inline");
3016
Chad Rosier9c76d242012-03-15 22:31:42 +00003017 if (Args.hasArg(options::OPT_fno_inline))
3018 CmdArgs.push_back("-fno-inline");
3019
Chad Rosier64d6be92012-03-06 21:17:19 +00003020 if (Args.hasArg(options::OPT_fno_inline_functions))
3021 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003022
John McCall5fb5df92012-06-20 06:18:46 +00003023 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003024
John McCall5fb5df92012-06-20 06:18:46 +00003025 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3026 // legacy is the default.
3027 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003028 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3029 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003030 objcRuntime.isLegacyDispatchDefaultForArch(
3031 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003032 if (getToolChain().UseObjCMixedDispatch())
3033 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3034 else
3035 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3036 }
3037 }
3038
Nico Weber97bd94b2012-03-09 21:19:44 +00003039 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3040 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00003041 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00003042 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3043 }
3044
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003045 // -fencode-extended-block-signature=1 is default.
3046 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3047 CmdArgs.push_back("-fencode-extended-block-signature");
3048 }
3049
John McCall24fc0de2011-07-06 00:26:06 +00003050 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3051 // NOTE: This logic is duplicated in ToolChains.cpp.
3052 bool ARC = isObjCAutoRefCount(Args);
3053 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003054 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003055
John McCall24fc0de2011-07-06 00:26:06 +00003056 CmdArgs.push_back("-fobjc-arc");
3057
Chandler Carruth491db322011-11-04 07:34:47 +00003058 // FIXME: It seems like this entire block, and several around it should be
3059 // wrapped in isObjC, but for now we just use it here as this is where it
3060 // was being used previously.
3061 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3062 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3063 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3064 else
3065 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3066 }
3067
John McCall24fc0de2011-07-06 00:26:06 +00003068 // Allow the user to enable full exceptions code emission.
3069 // We define off for Objective-CC, on for Objective-C++.
3070 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3071 options::OPT_fno_objc_arc_exceptions,
3072 /*default*/ types::isCXX(InputType)))
3073 CmdArgs.push_back("-fobjc-arc-exceptions");
3074 }
3075
3076 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3077 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003078 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003079 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003080
John McCall24fc0de2011-07-06 00:26:06 +00003081 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3082 // takes precedence.
3083 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3084 if (!GCArg)
3085 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3086 if (GCArg) {
3087 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003088 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003089 << GCArg->getAsString(Args);
3090 } else if (getToolChain().SupportsObjCGC()) {
3091 GCArg->render(Args, CmdArgs);
3092 } else {
3093 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003094 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003095 << GCArg->getAsString(Args);
3096 }
3097 }
3098
John McCallb5f652e2011-06-22 00:53:57 +00003099 // Add exception args.
3100 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003101 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003102
3103 if (getToolChain().UseSjLjExceptions())
3104 CmdArgs.push_back("-fsjlj-exceptions");
3105
3106 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003107 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3108 options::OPT_fno_assume_sane_operator_new))
3109 CmdArgs.push_back("-fno-assume-sane-operator-new");
3110
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003111 // -fconstant-cfstrings is default, and may be subject to argument translation
3112 // on Darwin.
3113 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3114 options::OPT_fno_constant_cfstrings) ||
3115 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3116 options::OPT_mno_constant_cfstrings))
3117 CmdArgs.push_back("-fno-constant-cfstrings");
3118
John Thompsoned4e2952009-11-05 20:14:16 +00003119 // -fshort-wchar default varies depending on platform; only
3120 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003121 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3122 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003123
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003124 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3125 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003126 //
3127 // FIXME: This is gross; that translation should be pulled from the
3128 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003129 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003130 options::OPT_fno_pascal_strings,
3131 false) ||
3132 Args.hasFlag(options::OPT_mpascal_strings,
3133 options::OPT_mno_pascal_strings,
3134 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003135 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003136
Daniel Dunbar096ed292011-10-05 21:04:55 +00003137 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3138 // -fno-pack-struct doesn't apply to -fpack-struct=.
3139 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003140 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003141 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003142 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003143 } else if (Args.hasFlag(options::OPT_fpack_struct,
3144 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003145 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003146 }
3147
Eric Christopher8d56caa2013-02-18 01:16:37 +00003148 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003149 if (!Args.hasArg(options::OPT_fcommon))
3150 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003151 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003152 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003153
Daniel Dunbard18049a2009-04-07 21:16:11 +00003154 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003155 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003156 CmdArgs.push_back("-fno-common");
3157
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003158 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003159 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003160 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003161 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003162 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003163 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3164
Daniel Dunbar6358d682010-10-15 22:30:42 +00003165 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3166 if (!Args.hasFlag(options::OPT_ffor_scope,
3167 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003168 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003169 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3170
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003171 // -fcaret-diagnostics is default.
3172 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3173 options::OPT_fno_caret_diagnostics, true))
3174 CmdArgs.push_back("-fno-caret-diagnostics");
3175
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003176 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003177 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003178 options::OPT_fno_diagnostics_fixit_info))
3179 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003180
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003181 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003182 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003183 options::OPT_fno_diagnostics_show_option))
3184 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003185
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003186 if (const Arg *A =
3187 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3188 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003189 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003190 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003191
Douglas Gregor643c9222011-05-21 17:07:29 +00003192 if (const Arg *A =
3193 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3194 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003195 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003196 }
3197
Chandler Carruthb6766f02011-03-27 01:50:55 +00003198 if (Arg *A = Args.getLastArg(
3199 options::OPT_fdiagnostics_show_note_include_stack,
3200 options::OPT_fno_diagnostics_show_note_include_stack)) {
3201 if (A->getOption().matches(
3202 options::OPT_fdiagnostics_show_note_include_stack))
3203 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3204 else
3205 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3206 }
3207
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003208 // Color diagnostics are the default, unless the terminal doesn't support
3209 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003210 // Support both clang's -f[no-]color-diagnostics and gcc's
3211 // -f[no-]diagnostics-colors[=never|always|auto].
3212 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3213 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3214 it != ie; ++it) {
3215 const Option &O = (*it)->getOption();
3216 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3217 !O.matches(options::OPT_fdiagnostics_color) &&
3218 !O.matches(options::OPT_fno_color_diagnostics) &&
3219 !O.matches(options::OPT_fno_diagnostics_color) &&
3220 !O.matches(options::OPT_fdiagnostics_color_EQ))
3221 continue;
3222
3223 (*it)->claim();
3224 if (O.matches(options::OPT_fcolor_diagnostics) ||
3225 O.matches(options::OPT_fdiagnostics_color)) {
3226 ShowColors = Colors_On;
3227 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3228 O.matches(options::OPT_fno_diagnostics_color)) {
3229 ShowColors = Colors_Off;
3230 } else {
3231 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3232 StringRef value((*it)->getValue());
3233 if (value == "always")
3234 ShowColors = Colors_On;
3235 else if (value == "never")
3236 ShowColors = Colors_Off;
3237 else if (value == "auto")
3238 ShowColors = Colors_Auto;
3239 else
3240 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3241 << ("-fdiagnostics-color=" + value).str();
3242 }
3243 }
3244 if (ShowColors == Colors_On ||
3245 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003246 CmdArgs.push_back("-fcolor-diagnostics");
3247
Daniel Dunbardb097022009-06-08 21:13:54 +00003248 if (!Args.hasFlag(options::OPT_fshow_source_location,
3249 options::OPT_fno_show_source_location))
3250 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003251
Douglas Gregor643c9222011-05-21 17:07:29 +00003252 if (!Args.hasFlag(options::OPT_fshow_column,
3253 options::OPT_fno_show_column,
3254 true))
3255 CmdArgs.push_back("-fno-show-column");
3256
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003257 if (!Args.hasFlag(options::OPT_fspell_checking,
3258 options::OPT_fno_spell_checking))
3259 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003260
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003261
Chad Rosierc8e56e82012-12-05 21:08:21 +00003262 // -fno-asm-blocks is default.
3263 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3264 false))
3265 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003266
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003267 // -fvectorize is default.
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003268 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003269 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003270 CmdArgs.push_back("-backend-option");
3271 CmdArgs.push_back("-vectorize-loops");
3272 }
3273
Hal Finkel061f1652012-12-11 19:59:32 +00003274 // -fno-slp-vectorize is default.
3275 if (Args.hasFlag(options::OPT_fslp_vectorize,
3276 options::OPT_fno_slp_vectorize, false)) {
3277 CmdArgs.push_back("-backend-option");
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003278 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003279 }
3280
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003281 // -fno-slp-vectorize-aggressive is default.
3282 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3283 options::OPT_fno_slp_vectorize_aggressive, false)) {
3284 CmdArgs.push_back("-backend-option");
3285 CmdArgs.push_back("-vectorize-slp-aggressive");
3286 }
3287
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003288 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3289 A->render(Args, CmdArgs);
3290
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003291 // -fdollars-in-identifiers default varies depending on platform and
3292 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003293 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003294 options::OPT_fno_dollars_in_identifiers)) {
3295 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003296 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003297 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003298 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003299 }
3300
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003301 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3302 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003303 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003304 options::OPT_fno_unit_at_a_time)) {
3305 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003306 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003307 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003308
Eli Friedman055c9702011-11-02 01:53:16 +00003309 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3310 options::OPT_fno_apple_pragma_pack, false))
3311 CmdArgs.push_back("-fapple-pragma-pack");
3312
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003313 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003314 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003315 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003316#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003317 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003318 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3319 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3320 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3321 CmdArgs.push_back("-fno-builtin-strcat");
3322 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3323 CmdArgs.push_back("-fno-builtin-strcpy");
3324 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003325#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003326
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003327 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003328 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003329 options::OPT_traditional_cpp)) {
3330 if (isa<PreprocessJobAction>(JA))
3331 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003332 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003333 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003334 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003335
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003336 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003337 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003338
3339 // Handle serialized diagnostics.
3340 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3341 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003342 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003343 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003344
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003345 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3346 CmdArgs.push_back("-fretain-comments-from-system-headers");
3347
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003348 // Forward -fcomment-block-commands to -cc1.
3349 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003350 // Forward -fparse-all-comments to -cc1.
3351 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003352
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003353 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3354 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003355 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003356 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3357 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003358 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003359
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003360 // We translate this by hand to the -cc1 argument, since nightly test uses
3361 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003362 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003363 CmdArgs.push_back("-disable-llvm-optzns");
3364 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003365 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003366 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003367
Daniel Dunbard67a3222009-03-30 06:36:42 +00003368 if (Output.getType() == types::TY_Dependencies) {
3369 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003370 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003371 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003372 CmdArgs.push_back(Output.getFilename());
3373 } else {
3374 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003375 }
3376
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003377 for (InputInfoList::const_iterator
3378 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3379 const InputInfo &II = *it;
3380 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003381 if (Args.hasArg(options::OPT_rewrite_objc))
3382 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3383 else
3384 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003385 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003386 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003387 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003388 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003389 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003390
Chris Lattnere9d7d782009-11-03 19:50:27 +00003391 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3392
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003393 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003394
3395 // Optionally embed the -cc1 level arguments into the debug info, for build
3396 // analysis.
3397 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003398 ArgStringList OriginalArgs;
3399 for (ArgList::const_iterator it = Args.begin(),
3400 ie = Args.end(); it != ie; ++it)
3401 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003402
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003403 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003404 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003405 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003406 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003407 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003408 }
3409 CmdArgs.push_back("-dwarf-debug-flags");
3410 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3411 }
3412
Eric Christopherd3804002013-02-22 20:12:52 +00003413 // Add the split debug info name to the command lines here so we
3414 // can propagate it to the backend.
3415 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3416 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003417 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003418 const char *SplitDwarfOut;
3419 if (SplitDwarf) {
3420 CmdArgs.push_back("-split-dwarf-file");
3421 SplitDwarfOut = SplitDebugName(Args, Inputs);
3422 CmdArgs.push_back(SplitDwarfOut);
3423 }
3424
3425 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003426 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003427
Eric Christopherf1545832013-02-22 23:50:16 +00003428 // Handle the debug info splitting at object creation time if we're
3429 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003430 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003431 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003432 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003433
Roman Divacky178e01602011-02-10 16:52:03 +00003434 if (Arg *A = Args.getLastArg(options::OPT_pg))
3435 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003436 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003437 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003438
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003439 // Claim some arguments which clang supports automatically.
3440
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003441 // -fpch-preprocess is used with gcc to add a special marker in the output to
3442 // include the PCH file. Clang's PTH solution is completely transparent, so we
3443 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003444 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003445
Daniel Dunbar17731772009-03-23 19:03:36 +00003446 // Claim some arguments which clang doesn't support, but we don't
3447 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003448 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3449 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003450
Rafael Espindolad95a8122011-03-01 05:25:27 +00003451 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003452 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003453 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003454}
3455
Jim Grosbach576452b2012-02-10 20:37:10 +00003456void ClangAs::AddARMTargetArgs(const ArgList &Args,
3457 ArgStringList &CmdArgs) const {
3458 const Driver &D = getToolChain().getDriver();
3459 llvm::Triple Triple = getToolChain().getTriple();
3460
3461 // Set the CPU based on -march= and -mcpu=.
3462 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003463 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003464
3465 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003466 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003467 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003468
3469 // Honor -mfpmath=.
3470 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003471 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003472}
3473
Benjamin Kramerb164d672013-02-22 20:55:17 +00003474void ClangAs::AddX86TargetArgs(const ArgList &Args,
3475 ArgStringList &CmdArgs) const {
3476 // Set the CPU based on -march=.
3477 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3478 CmdArgs.push_back("-target-cpu");
3479 CmdArgs.push_back(CPUName);
3480 }
3481}
3482
John McCall5fb5df92012-06-20 06:18:46 +00003483/// Add options related to the Objective-C runtime/ABI.
3484///
3485/// Returns true if the runtime is non-fragile.
3486ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3487 ArgStringList &cmdArgs,
3488 RewriteKind rewriteKind) const {
3489 // Look for the controlling runtime option.
3490 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3491 options::OPT_fgnu_runtime,
3492 options::OPT_fobjc_runtime_EQ);
3493
3494 // Just forward -fobjc-runtime= to the frontend. This supercedes
3495 // options about fragility.
3496 if (runtimeArg &&
3497 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3498 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003499 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003500 if (runtime.tryParse(value)) {
3501 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3502 << value;
3503 }
3504
3505 runtimeArg->render(args, cmdArgs);
3506 return runtime;
3507 }
3508
3509 // Otherwise, we'll need the ABI "version". Version numbers are
3510 // slightly confusing for historical reasons:
3511 // 1 - Traditional "fragile" ABI
3512 // 2 - Non-fragile ABI, version 1
3513 // 3 - Non-fragile ABI, version 2
3514 unsigned objcABIVersion = 1;
3515 // If -fobjc-abi-version= is present, use that to set the version.
3516 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003517 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003518 if (value == "1")
3519 objcABIVersion = 1;
3520 else if (value == "2")
3521 objcABIVersion = 2;
3522 else if (value == "3")
3523 objcABIVersion = 3;
3524 else
3525 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3526 << value;
3527 } else {
3528 // Otherwise, determine if we are using the non-fragile ABI.
3529 bool nonFragileABIIsDefault =
3530 (rewriteKind == RK_NonFragile ||
3531 (rewriteKind == RK_None &&
3532 getToolChain().IsObjCNonFragileABIDefault()));
3533 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3534 options::OPT_fno_objc_nonfragile_abi,
3535 nonFragileABIIsDefault)) {
3536 // Determine the non-fragile ABI version to use.
3537#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3538 unsigned nonFragileABIVersion = 1;
3539#else
3540 unsigned nonFragileABIVersion = 2;
3541#endif
3542
3543 if (Arg *abiArg = args.getLastArg(
3544 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003545 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003546 if (value == "1")
3547 nonFragileABIVersion = 1;
3548 else if (value == "2")
3549 nonFragileABIVersion = 2;
3550 else
3551 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3552 << value;
3553 }
3554
3555 objcABIVersion = 1 + nonFragileABIVersion;
3556 } else {
3557 objcABIVersion = 1;
3558 }
3559 }
3560
3561 // We don't actually care about the ABI version other than whether
3562 // it's non-fragile.
3563 bool isNonFragile = objcABIVersion != 1;
3564
3565 // If we have no runtime argument, ask the toolchain for its default runtime.
3566 // However, the rewriter only really supports the Mac runtime, so assume that.
3567 ObjCRuntime runtime;
3568 if (!runtimeArg) {
3569 switch (rewriteKind) {
3570 case RK_None:
3571 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3572 break;
3573 case RK_Fragile:
3574 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3575 break;
3576 case RK_NonFragile:
3577 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3578 break;
3579 }
3580
3581 // -fnext-runtime
3582 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3583 // On Darwin, make this use the default behavior for the toolchain.
3584 if (getToolChain().getTriple().isOSDarwin()) {
3585 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3586
3587 // Otherwise, build for a generic macosx port.
3588 } else {
3589 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3590 }
3591
3592 // -fgnu-runtime
3593 } else {
3594 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003595 // Legacy behaviour is to target the gnustep runtime if we are i
3596 // non-fragile mode or the GCC runtime in fragile mode.
3597 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003598 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003599 else
3600 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003601 }
3602
3603 cmdArgs.push_back(args.MakeArgString(
3604 "-fobjc-runtime=" + runtime.getAsString()));
3605 return runtime;
3606}
3607
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003608void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003609 const InputInfo &Output,
3610 const InputInfoList &Inputs,
3611 const ArgList &Args,
3612 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003613 ArgStringList CmdArgs;
3614
3615 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3616 const InputInfo &Input = Inputs[0];
3617
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003618 // Don't warn about "clang -w -c foo.s"
3619 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003620 // and "clang -emit-llvm -c foo.s"
3621 Args.ClaimAllArgs(options::OPT_emit_llvm);
3622 // and "clang -use-gold-plugin -c foo.s"
3623 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003624
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003625 // Invoke ourselves in -cc1as mode.
3626 //
3627 // FIXME: Implement custom jobs for internal actions.
3628 CmdArgs.push_back("-cc1as");
3629
3630 // Add the "effective" target triple.
3631 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003632 std::string TripleStr =
3633 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003634 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3635
3636 // Set the output mode, we currently only expect to be used as a real
3637 // assembler.
3638 CmdArgs.push_back("-filetype");
3639 CmdArgs.push_back("obj");
3640
Eric Christopher45f2e712012-12-18 00:31:10 +00003641 // Set the main file name, so that debug info works even with
3642 // -save-temps or preprocessed assembly.
3643 CmdArgs.push_back("-main-file-name");
3644 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3645
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003646 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003647 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003648
Jim Grosbach576452b2012-02-10 20:37:10 +00003649 // Add target specific cpu and features flags.
3650 switch(getToolChain().getTriple().getArch()) {
3651 default:
3652 break;
3653
3654 case llvm::Triple::arm:
3655 case llvm::Triple::thumb:
3656 AddARMTargetArgs(Args, CmdArgs);
3657 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003658
3659 case llvm::Triple::x86:
3660 case llvm::Triple::x86_64:
3661 AddX86TargetArgs(Args, CmdArgs);
3662 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003663 }
3664
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003665 // Ignore explicit -force_cpusubtype_ALL option.
3666 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003667
Eric Christopherfc3ee562012-01-10 00:38:01 +00003668 // Determine the original source input.
3669 const Action *SourceAction = &JA;
3670 while (SourceAction->getKind() != Action::InputClass) {
3671 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3672 SourceAction = SourceAction->getInputs()[0];
3673 }
3674
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003675 // Forward -g and handle debug info related flags, assuming we are dealing
3676 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003677 if (SourceAction->getType() == types::TY_Asm ||
3678 SourceAction->getType() == types::TY_PP_Asm) {
3679 Args.ClaimAllArgs(options::OPT_g_Group);
3680 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3681 if (!A->getOption().matches(options::OPT_g0))
3682 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003683
3684 // Add the -fdebug-compilation-dir flag if needed.
3685 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003686
3687 // Set the AT_producer to the clang version when using the integrated
3688 // assembler on assembly source files.
3689 CmdArgs.push_back("-dwarf-debug-producer");
3690 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003691 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003692
3693 // Optionally embed the -cc1as level arguments into the debug info, for build
3694 // analysis.
3695 if (getToolChain().UseDwarfDebugFlags()) {
3696 ArgStringList OriginalArgs;
3697 for (ArgList::const_iterator it = Args.begin(),
3698 ie = Args.end(); it != ie; ++it)
3699 (*it)->render(Args, OriginalArgs);
3700
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003701 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003702 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3703 Flags += Exec;
3704 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3705 Flags += " ";
3706 Flags += OriginalArgs[i];
3707 }
3708 CmdArgs.push_back("-dwarf-debug-flags");
3709 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3710 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003711
3712 // FIXME: Add -static support, once we have it.
3713
3714 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3715 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003716 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003717
3718 assert(Output.isFilename() && "Unexpected lipo output.");
3719 CmdArgs.push_back("-o");
3720 CmdArgs.push_back(Output.getFilename());
3721
Daniel Dunbarb440f562010-08-02 02:38:21 +00003722 assert(Input.isFilename() && "Invalid input.");
3723 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003724
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003725 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003726 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003727
3728 // Handle the debug info splitting at object creation time if we're
3729 // creating an object.
3730 // TODO: Currently only works on linux with newer objcopy.
3731 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3732 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3733 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3734 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003735}
3736
Daniel Dunbara3246a02009-03-18 08:07:30 +00003737void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003738 const InputInfo &Output,
3739 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003740 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003741 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003742 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003743 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003744
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003745 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003746 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003747 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003748 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003749 // Don't forward any -g arguments to assembly steps.
3750 if (isa<AssembleJobAction>(JA) &&
3751 A->getOption().matches(options::OPT_g_Group))
3752 continue;
3753
Daniel Dunbar2da02722009-03-19 07:55:12 +00003754 // It is unfortunate that we have to claim here, as this means
3755 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003756 // platforms using a generic gcc, even if we are just using gcc
3757 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003758 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003759 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003760 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003761 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003762
Daniel Dunbar4e295052010-01-25 22:35:08 +00003763 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003764
3765 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003766 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003767 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003768 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003769
3770 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003771 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003772 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003773 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003774 CmdArgs.push_back("ppc64");
3775 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003776 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003777 }
3778
Daniel Dunbar5716d872009-05-02 21:41:52 +00003779 // Try to force gcc to match the tool chain we want, if we recognize
3780 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003781 //
3782 // FIXME: The triple class should directly provide the information we want
3783 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003784 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003785 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003786 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003787 CmdArgs.push_back("-m64");
3788
Daniel Dunbarb440f562010-08-02 02:38:21 +00003789 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003790 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003791 CmdArgs.push_back(Output.getFilename());
3792 } else {
3793 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003794 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003795 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003796
Tony Linthicum76329bf2011-12-12 21:14:55 +00003797 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3798 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003799
3800 // Only pass -x if gcc will understand it; otherwise hope gcc
3801 // understands the suffix correctly. The main use case this would go
3802 // wrong in is for linker inputs if they happened to have an odd
3803 // suffix; really the only way to get this to happen is a command
3804 // like '-x foobar a.c' which will treat a.c like a linker input.
3805 //
3806 // FIXME: For the linker case specifically, can we safely convert
3807 // inputs into '-Wl,' options?
3808 for (InputInfoList::const_iterator
3809 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3810 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003811
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003812 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003813 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3814 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003815 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003816 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003817 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003818 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003819 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003820 else if (II.getType() == types::TY_ModuleFile)
3821 D.Diag(diag::err_drv_no_module_support)
3822 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003823
Daniel Dunbara3246a02009-03-18 08:07:30 +00003824 if (types::canTypeBeUserSpecified(II.getType())) {
3825 CmdArgs.push_back("-x");
3826 CmdArgs.push_back(types::getTypeName(II.getType()));
3827 }
3828
Daniel Dunbarb440f562010-08-02 02:38:21 +00003829 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003830 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003831 else {
3832 const Arg &A = II.getInputArg();
3833
3834 // Reverse translate some rewritten options.
3835 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3836 CmdArgs.push_back("-lstdc++");
3837 continue;
3838 }
3839
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003840 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003841 A.render(Args, CmdArgs);
3842 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003843 }
3844
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003845 const std::string customGCCName = D.getCCCGenericGCCName();
3846 const char *GCCName;
3847 if (!customGCCName.empty())
3848 GCCName = customGCCName.c_str();
3849 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003850 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003851 } else
3852 GCCName = "gcc";
3853
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003854 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003855 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003856 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003857}
3858
Daniel Dunbar4e295052010-01-25 22:35:08 +00003859void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3860 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003861 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003862}
3863
Daniel Dunbar4e295052010-01-25 22:35:08 +00003864void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3865 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003866 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003867}
3868
Daniel Dunbar4e295052010-01-25 22:35:08 +00003869void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3870 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003871 const Driver &D = getToolChain().getDriver();
3872
Daniel Dunbar4e295052010-01-25 22:35:08 +00003873 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003874 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3875 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003876 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003877 else {
3878 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003879 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003880 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003881
Daniel Dunbar4e295052010-01-25 22:35:08 +00003882 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003883 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003884}
3885
Daniel Dunbar4e295052010-01-25 22:35:08 +00003886void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3887 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003888 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003889}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003890
Daniel Dunbar4e295052010-01-25 22:35:08 +00003891void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3892 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003893 // The types are (hopefully) good enough.
3894}
3895
Tony Linthicum76329bf2011-12-12 21:14:55 +00003896// Hexagon tools start.
3897void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3898 ArgStringList &CmdArgs) const {
3899
3900}
3901void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3902 const InputInfo &Output,
3903 const InputInfoList &Inputs,
3904 const ArgList &Args,
3905 const char *LinkingOutput) const {
3906
3907 const Driver &D = getToolChain().getDriver();
3908 ArgStringList CmdArgs;
3909
3910 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003911 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003912 CmdArgs.push_back(Args.MakeArgString(MarchString));
3913
3914 RenderExtraToolArgs(JA, CmdArgs);
3915
3916 if (Output.isFilename()) {
3917 CmdArgs.push_back("-o");
3918 CmdArgs.push_back(Output.getFilename());
3919 } else {
3920 assert(Output.isNothing() && "Unexpected output");
3921 CmdArgs.push_back("-fsyntax-only");
3922 }
3923
Matthew Curtise8f80a12012-12-06 17:49:03 +00003924 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3925 if (!SmallDataThreshold.empty())
3926 CmdArgs.push_back(
3927 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003928
Matthew Curtise5df3812012-12-07 17:23:04 +00003929 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3930 options::OPT_Xassembler);
3931
Tony Linthicum76329bf2011-12-12 21:14:55 +00003932 // Only pass -x if gcc will understand it; otherwise hope gcc
3933 // understands the suffix correctly. The main use case this would go
3934 // wrong in is for linker inputs if they happened to have an odd
3935 // suffix; really the only way to get this to happen is a command
3936 // like '-x foobar a.c' which will treat a.c like a linker input.
3937 //
3938 // FIXME: For the linker case specifically, can we safely convert
3939 // inputs into '-Wl,' options?
3940 for (InputInfoList::const_iterator
3941 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3942 const InputInfo &II = *it;
3943
3944 // Don't try to pass LLVM or AST inputs to a generic gcc.
3945 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3946 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3947 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3948 << getToolChain().getTripleString();
3949 else if (II.getType() == types::TY_AST)
3950 D.Diag(clang::diag::err_drv_no_ast_support)
3951 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003952 else if (II.getType() == types::TY_ModuleFile)
3953 D.Diag(diag::err_drv_no_module_support)
3954 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00003955
3956 if (II.isFilename())
3957 CmdArgs.push_back(II.getFilename());
3958 else
3959 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3960 II.getInputArg().render(Args, CmdArgs);
3961 }
3962
3963 const char *GCCName = "hexagon-as";
3964 const char *Exec =
3965 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3966 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3967
3968}
3969void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3970 ArgStringList &CmdArgs) const {
3971 // The types are (hopefully) good enough.
3972}
3973
3974void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3975 const InputInfo &Output,
3976 const InputInfoList &Inputs,
3977 const ArgList &Args,
3978 const char *LinkingOutput) const {
3979
Matthew Curtise689b052012-12-06 15:46:07 +00003980 const toolchains::Hexagon_TC& ToolChain =
3981 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3982 const Driver &D = ToolChain.getDriver();
3983
Tony Linthicum76329bf2011-12-12 21:14:55 +00003984 ArgStringList CmdArgs;
3985
Matthew Curtise689b052012-12-06 15:46:07 +00003986 //----------------------------------------------------------------------------
3987 //
3988 //----------------------------------------------------------------------------
3989 bool hasStaticArg = Args.hasArg(options::OPT_static);
3990 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00003991 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00003992 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3993 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3994 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3995 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003996
Matthew Curtise689b052012-12-06 15:46:07 +00003997 //----------------------------------------------------------------------------
3998 // Silence warnings for various options
3999 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004000
Matthew Curtise689b052012-12-06 15:46:07 +00004001 Args.ClaimAllArgs(options::OPT_g_Group);
4002 Args.ClaimAllArgs(options::OPT_emit_llvm);
4003 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4004 // handled somewhere else.
4005 Args.ClaimAllArgs(options::OPT_static_libgcc);
4006
4007 //----------------------------------------------------------------------------
4008 //
4009 //----------------------------------------------------------------------------
4010 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4011 e = ToolChain.ExtraOpts.end();
4012 i != e; ++i)
4013 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004014
Matthew Curtisf10a5952012-12-06 14:16:43 +00004015 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4016 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004017
Matthew Curtise689b052012-12-06 15:46:07 +00004018 if (buildingLib) {
4019 CmdArgs.push_back("-shared");
4020 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4021 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004022 }
4023
Matthew Curtise689b052012-12-06 15:46:07 +00004024 if (hasStaticArg)
4025 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004026
Matthew Curtise8f80a12012-12-06 17:49:03 +00004027 if (buildPIE && !buildingLib)
4028 CmdArgs.push_back("-pie");
4029
4030 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4031 if (!SmallDataThreshold.empty()) {
4032 CmdArgs.push_back(
4033 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4034 }
4035
Matthew Curtise689b052012-12-06 15:46:07 +00004036 //----------------------------------------------------------------------------
4037 //
4038 //----------------------------------------------------------------------------
4039 CmdArgs.push_back("-o");
4040 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004041
Matthew Curtise689b052012-12-06 15:46:07 +00004042 const std::string MarchSuffix = "/" + MarchString;
4043 const std::string G0Suffix = "/G0";
4044 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4045 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4046 + "/";
4047 const std::string StartFilesDir = RootDir
4048 + "hexagon/lib"
4049 + (buildingLib
4050 ? MarchG0Suffix : MarchSuffix);
4051
4052 //----------------------------------------------------------------------------
4053 // moslib
4054 //----------------------------------------------------------------------------
4055 std::vector<std::string> oslibs;
4056 bool hasStandalone= false;
4057
4058 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4059 ie = Args.filtered_end(); it != ie; ++it) {
4060 (*it)->claim();
4061 oslibs.push_back((*it)->getValue());
4062 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004063 }
Matthew Curtise689b052012-12-06 15:46:07 +00004064 if (oslibs.empty()) {
4065 oslibs.push_back("standalone");
4066 hasStandalone = true;
4067 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004068
Matthew Curtise689b052012-12-06 15:46:07 +00004069 //----------------------------------------------------------------------------
4070 // Start Files
4071 //----------------------------------------------------------------------------
4072 if (incStdLib && incStartFiles) {
4073
4074 if (!buildingLib) {
4075 if (hasStandalone) {
4076 CmdArgs.push_back(
4077 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4078 }
4079 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4080 }
4081 std::string initObj = useShared ? "/initS.o" : "/init.o";
4082 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4083 }
4084
4085 //----------------------------------------------------------------------------
4086 // Library Search Paths
4087 //----------------------------------------------------------------------------
4088 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4089 for (ToolChain::path_list::const_iterator
4090 i = LibPaths.begin(),
4091 e = LibPaths.end();
4092 i != e;
4093 ++i)
4094 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4095
4096 //----------------------------------------------------------------------------
4097 //
4098 //----------------------------------------------------------------------------
4099 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4100 Args.AddAllArgs(CmdArgs, options::OPT_e);
4101 Args.AddAllArgs(CmdArgs, options::OPT_s);
4102 Args.AddAllArgs(CmdArgs, options::OPT_t);
4103 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4104
4105 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4106
4107 //----------------------------------------------------------------------------
4108 // Libraries
4109 //----------------------------------------------------------------------------
4110 if (incStdLib && incDefLibs) {
4111 if (D.CCCIsCXX) {
4112 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4113 CmdArgs.push_back("-lm");
4114 }
4115
4116 CmdArgs.push_back("--start-group");
4117
4118 if (!buildingLib) {
4119 for(std::vector<std::string>::iterator i = oslibs.begin(),
4120 e = oslibs.end(); i != e; ++i)
4121 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4122 CmdArgs.push_back("-lc");
4123 }
4124 CmdArgs.push_back("-lgcc");
4125
4126 CmdArgs.push_back("--end-group");
4127 }
4128
4129 //----------------------------------------------------------------------------
4130 // End files
4131 //----------------------------------------------------------------------------
4132 if (incStdLib && incStartFiles) {
4133 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4134 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4135 }
4136
4137 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4138 C.addCommand(
4139 new Command(
4140 JA, *this,
4141 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004142}
4143// Hexagon tools end.
4144
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004145llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4146 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4147 // archs which Darwin doesn't use.
4148
4149 // The matching this routine does is fairly pointless, since it is neither the
4150 // complete architecture list, nor a reasonable subset. The problem is that
4151 // historically the driver driver accepts this and also ties its -march=
4152 // handling to the architecture name, so we need to be careful before removing
4153 // support for it.
4154
4155 // This code must be kept in sync with Clang's Darwin specific argument
4156 // translation.
4157
4158 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4159 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4160 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4161 .Case("ppc64", llvm::Triple::ppc64)
4162 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4163 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4164 llvm::Triple::x86)
4165 .Case("x86_64", llvm::Triple::x86_64)
4166 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004167 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4168 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4169 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004170 .Case("r600", llvm::Triple::r600)
4171 .Case("nvptx", llvm::Triple::nvptx)
4172 .Case("nvptx64", llvm::Triple::nvptx64)
4173 .Case("amdil", llvm::Triple::amdil)
4174 .Case("spir", llvm::Triple::spir)
4175 .Default(llvm::Triple::UnknownArch);
4176}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004177
Bob Wilsondecc03e2012-11-23 06:14:39 +00004178const char *Clang::getBaseInputName(const ArgList &Args,
4179 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004180 return Args.MakeArgString(
4181 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004182}
4183
Bob Wilsondecc03e2012-11-23 06:14:39 +00004184const char *Clang::getBaseInputStem(const ArgList &Args,
4185 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004186 const char *Str = getBaseInputName(Args, Inputs);
4187
Chris Lattner906bb902011-01-16 08:14:11 +00004188 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004189 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004190
4191 return Str;
4192}
4193
Bob Wilsondecc03e2012-11-23 06:14:39 +00004194const char *Clang::getDependencyFileName(const ArgList &Args,
4195 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004196 // FIXME: Think about this more.
4197 std::string Res;
4198
4199 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004200 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004201 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004202 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004203 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004204 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004205 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004206}
4207
Daniel Dunbarbe220842009-03-20 16:06:39 +00004208void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004209 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004210 const InputInfoList &Inputs,
4211 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004212 const char *LinkingOutput) const {
4213 ArgStringList CmdArgs;
4214
4215 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4216 const InputInfo &Input = Inputs[0];
4217
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004218 // Determine the original source input.
4219 const Action *SourceAction = &JA;
4220 while (SourceAction->getKind() != Action::InputClass) {
4221 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4222 SourceAction = SourceAction->getInputs()[0];
4223 }
4224
4225 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004226 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004227 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004228 if (Args.hasArg(options::OPT_gstabs))
4229 CmdArgs.push_back("--gstabs");
4230 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004231 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004232 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004233
Daniel Dunbarbe220842009-03-20 16:06:39 +00004234 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004235 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004236
Daniel Dunbar6d484762010-07-22 01:47:22 +00004237 // Use -force_cpusubtype_ALL on x86 by default.
4238 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4239 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004240 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4241 CmdArgs.push_back("-force_cpusubtype_ALL");
4242
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004243 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004244 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004245 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004246 (!getDarwinToolChain().isTargetIPhoneOS() ||
4247 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4248 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004249 CmdArgs.push_back("-static");
4250
Daniel Dunbarbe220842009-03-20 16:06:39 +00004251 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4252 options::OPT_Xassembler);
4253
4254 assert(Output.isFilename() && "Unexpected lipo output.");
4255 CmdArgs.push_back("-o");
4256 CmdArgs.push_back(Output.getFilename());
4257
Daniel Dunbarb440f562010-08-02 02:38:21 +00004258 assert(Input.isFilename() && "Invalid input.");
4259 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004260
4261 // asm_final spec is empty.
4262
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004263 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004264 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004265 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004266}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004267
David Blaikie68e081d2011-12-20 02:48:34 +00004268void darwin::DarwinTool::anchor() {}
4269
Daniel Dunbare9ded432009-09-09 18:36:20 +00004270void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4271 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004272 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004273
Daniel Dunbarc1964212009-03-26 16:23:12 +00004274 // Derived from darwin_arch spec.
4275 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004276 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004277
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004278 // FIXME: Is this needed anymore?
4279 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004280 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004281}
4282
Bill Wendling3b2000f2012-10-02 18:02:50 +00004283bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4284 // We only need to generate a temp path for LTO if we aren't compiling object
4285 // files. When compiling source files, we run 'dsymutil' after linking. We
4286 // don't run 'dsymutil' when compiling object files.
4287 for (InputInfoList::const_iterator
4288 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4289 if (it->getType() != types::TY_Object)
4290 return true;
4291
4292 return false;
4293}
4294
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004295void darwin::Link::AddLinkArgs(Compilation &C,
4296 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004297 ArgStringList &CmdArgs,
4298 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004299 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004300 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004301
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004302 unsigned Version[3] = { 0, 0, 0 };
4303 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4304 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004305 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004306 Version[1], Version[2], HadExtra) ||
4307 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004308 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004309 << A->getAsString(Args);
4310 }
4311
4312 // Newer linkers support -demangle, pass it if supported and not disabled by
4313 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004314 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004315 // Don't pass -demangle to ld_classic.
4316 //
4317 // FIXME: This is a temporary workaround, ld should be handling this.
4318 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4319 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004320 if (getToolChain().getArch() == llvm::Triple::x86) {
4321 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4322 options::OPT_Wl_COMMA),
4323 ie = Args.filtered_end(); it != ie; ++it) {
4324 const Arg *A = *it;
4325 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004326 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004327 UsesLdClassic = true;
4328 }
4329 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004330 if (!UsesLdClassic)
4331 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004332 }
4333
Bill Wendling313b6bf2012-11-16 23:03:00 +00004334 // If we are using LTO, then automatically create a temporary file path for
4335 // the linker to use, so that it's lifetime will extend past a possible
4336 // dsymutil step.
4337 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4338 const char *TmpPath = C.getArgs().MakeArgString(
4339 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4340 C.addTempFile(TmpPath);
4341 CmdArgs.push_back("-object_path_lto");
4342 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004343 }
4344
Daniel Dunbarc1964212009-03-26 16:23:12 +00004345 // Derived from the "link" spec.
4346 Args.AddAllArgs(CmdArgs, options::OPT_static);
4347 if (!Args.hasArg(options::OPT_static))
4348 CmdArgs.push_back("-dynamic");
4349 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4350 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4351 // here. How do we wish to handle such things?
4352 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004353
Daniel Dunbarc1964212009-03-26 16:23:12 +00004354 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004355 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004356 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004357 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004358
4359 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4360 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4361 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4362
4363 Arg *A;
4364 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4365 (A = Args.getLastArg(options::OPT_current__version)) ||
4366 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004367 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004368 << A->getAsString(Args) << "-dynamiclib";
4369
4370 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4371 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4372 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4373 } else {
4374 CmdArgs.push_back("-dylib");
4375
4376 Arg *A;
4377 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4378 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4379 (A = Args.getLastArg(options::OPT_client__name)) ||
4380 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4381 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4382 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004383 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004384 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004385
Daniel Dunbarc1964212009-03-26 16:23:12 +00004386 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4387 "-dylib_compatibility_version");
4388 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4389 "-dylib_current_version");
4390
Daniel Dunbara48823f2010-01-22 02:04:52 +00004391 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004392
4393 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4394 "-dylib_install_name");
4395 }
4396
4397 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4398 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4399 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004400 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004401 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004402 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4403 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4404 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4405 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4406 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4407 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004408 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004409 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4410 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4411 Args.AddAllArgs(CmdArgs, options::OPT_init);
4412
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004413 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004414 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004415
4416 // If we had an explicit -mios-simulator-version-min argument, honor that,
4417 // otherwise use the traditional deployment targets. We can't just check the
4418 // is-sim attribute because existing code follows this path, and the linker
4419 // may not handle the argument.
4420 //
4421 // FIXME: We may be able to remove this, once we can verify no one depends on
4422 // it.
4423 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4424 CmdArgs.push_back("-ios_simulator_version_min");
4425 else if (DarwinTC.isTargetIPhoneOS())
4426 CmdArgs.push_back("-iphoneos_version_min");
4427 else
4428 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004429 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004430
Daniel Dunbarc1964212009-03-26 16:23:12 +00004431 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4432 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4433 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4434 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4435 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004436
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004437 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4438 options::OPT_fno_pie,
4439 options::OPT_fno_PIE)) {
4440 if (A->getOption().matches(options::OPT_fpie) ||
4441 A->getOption().matches(options::OPT_fPIE))
4442 CmdArgs.push_back("-pie");
4443 else
4444 CmdArgs.push_back("-no_pie");
4445 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004446
4447 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4448 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4449 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4450 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4451 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4452 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4453 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4454 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4455 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4456 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4457 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4458 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4459 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4460 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4461 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4462 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004463
Daniel Dunbar84384642011-05-02 21:03:47 +00004464 // Give --sysroot= preference, over the Apple specific behavior to also use
4465 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004466 StringRef sysroot = C.getSysRoot();
4467 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004468 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004469 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004470 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4471 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004472 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004473 }
4474
Daniel Dunbarc1964212009-03-26 16:23:12 +00004475 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4476 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4477 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4478 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4479 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004480 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004481 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4482 Args.AddAllArgs(CmdArgs, options::OPT_y);
4483 Args.AddLastArg(CmdArgs, options::OPT_w);
4484 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4485 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4486 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4487 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4488 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4489 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4490 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4491 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4492 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4493 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4494 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4495 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4496}
4497
4498void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004499 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004500 const InputInfoList &Inputs,
4501 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004502 const char *LinkingOutput) const {
4503 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004504
Daniel Dunbarc1964212009-03-26 16:23:12 +00004505 // The logic here is derived from gcc's behavior; most of which
4506 // comes from specs (starting with link_command). Consult gcc for
4507 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004508 ArgStringList CmdArgs;
4509
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004510 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4511 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4512 options::OPT_ccc_arcmt_migrate)) {
4513 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4514 (*I)->claim();
4515 const char *Exec =
4516 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4517 CmdArgs.push_back(Output.getFilename());
4518 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4519 return;
4520 }
4521
Daniel Dunbarc1964212009-03-26 16:23:12 +00004522 // I'm not sure why this particular decomposition exists in gcc, but
4523 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004524 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004525
Daniel Dunbarc1964212009-03-26 16:23:12 +00004526 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4527 Args.AddAllArgs(CmdArgs, options::OPT_s);
4528 Args.AddAllArgs(CmdArgs, options::OPT_t);
4529 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4530 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004531 Args.AddLastArg(CmdArgs, options::OPT_e);
4532 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4533 Args.AddAllArgs(CmdArgs, options::OPT_r);
4534
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004535 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4536 // members of static archive libraries which implement Objective-C classes or
4537 // categories.
4538 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4539 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004540
Bill Wendling58979742012-12-10 21:48:41 +00004541 if (Args.hasArg(options::OPT_rdynamic))
4542 CmdArgs.push_back("-export_dynamic");
4543
Daniel Dunbarc1964212009-03-26 16:23:12 +00004544 CmdArgs.push_back("-o");
4545 CmdArgs.push_back(Output.getFilename());
4546
Chad Rosier06fd3c62012-05-16 23:45:12 +00004547 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004548 !Args.hasArg(options::OPT_nostartfiles)) {
4549 // Derived from startfile spec.
4550 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004551 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004552 if (getDarwinToolChain().isTargetIOSSimulator()) {
4553 // The simulator doesn't have a versioned crt1 file.
4554 CmdArgs.push_back("-ldylib1.o");
4555 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004556 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4557 CmdArgs.push_back("-ldylib1.o");
4558 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004559 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004560 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004561 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004562 CmdArgs.push_back("-ldylib1.10.5.o");
4563 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004564 } else {
4565 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004566 if (!Args.hasArg(options::OPT_static)) {
4567 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004568 if (getDarwinToolChain().isTargetIOSSimulator()) {
4569 // The simulator doesn't have a versioned crt1 file.
4570 CmdArgs.push_back("-lbundle1.o");
4571 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004572 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4573 CmdArgs.push_back("-lbundle1.o");
4574 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004575 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004576 CmdArgs.push_back("-lbundle1.o");
4577 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004578 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004579 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004580 if (Args.hasArg(options::OPT_pg) &&
4581 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004582 if (Args.hasArg(options::OPT_static) ||
4583 Args.hasArg(options::OPT_object) ||
4584 Args.hasArg(options::OPT_preload)) {
4585 CmdArgs.push_back("-lgcrt0.o");
4586 } else {
4587 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004588
Daniel Dunbarc1964212009-03-26 16:23:12 +00004589 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004590 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004591 // By default on OS X 10.8 and later, we don't link with a crt1.o
4592 // file and the linker knows to use _main as the entry point. But,
4593 // when compiling with -pg, we need to link with the gcrt1.o file,
4594 // so pass the -no_new_main option to tell the linker to use the
4595 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004596 if (getDarwinToolChain().isTargetMacOS() &&
4597 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4598 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004599 } else {
4600 if (Args.hasArg(options::OPT_static) ||
4601 Args.hasArg(options::OPT_object) ||
4602 Args.hasArg(options::OPT_preload)) {
4603 CmdArgs.push_back("-lcrt0.o");
4604 } else {
4605 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004606 if (getDarwinToolChain().isTargetIOSSimulator()) {
4607 // The simulator doesn't have a versioned crt1 file.
4608 CmdArgs.push_back("-lcrt1.o");
4609 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004610 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4611 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004612 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004613 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004614 } else {
4615 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4616 CmdArgs.push_back("-lcrt1.o");
4617 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4618 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004619 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004620 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004621
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004622 // darwin_crt2 spec is empty.
4623 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004624 }
4625 }
4626 }
4627 }
4628
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004629 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4630 Args.hasArg(options::OPT_shared_libgcc) &&
4631 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004632 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004633 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004634 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004635 }
4636 }
4637
4638 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004639
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004640 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004641 // If we're building a dynamic lib with -fsanitize=address,
4642 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004643 // of them as dynamic_lookup. Linking executables is handled in
4644 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004645 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004646 if (Args.hasArg(options::OPT_dynamiclib) ||
4647 Args.hasArg(options::OPT_bundle)) {
4648 CmdArgs.push_back("-undefined");
4649 CmdArgs.push_back("dynamic_lookup");
4650 }
4651 }
4652
Daniel Dunbarc1964212009-03-26 16:23:12 +00004653 if (Args.hasArg(options::OPT_fopenmp))
4654 // This is more complicated in gcc...
4655 CmdArgs.push_back("-lgomp");
4656
Douglas Gregor9295df02012-05-15 21:00:27 +00004657 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4658
Bob Wilson16d93952012-05-15 18:57:39 +00004659 if (isObjCRuntimeLinked(Args) &&
4660 !Args.hasArg(options::OPT_nostdlib) &&
4661 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004662 // Avoid linking compatibility stubs on i386 mac.
4663 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004664 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004665 // If we don't have ARC or subscripting runtime support, link in the
4666 // runtime stubs. We have to do this *before* adding any of the normal
4667 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004668 ObjCRuntime runtime =
4669 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004670 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004671 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004672 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004673 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004674 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004675 CmdArgs.push_back("-framework");
4676 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004677 // Link libobj.
4678 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004679 }
John McCall31168b02011-06-15 23:02:42 +00004680
Daniel Dunbarc1964212009-03-26 16:23:12 +00004681 if (LinkingOutput) {
4682 CmdArgs.push_back("-arch_multiple");
4683 CmdArgs.push_back("-final_output");
4684 CmdArgs.push_back(LinkingOutput);
4685 }
4686
Daniel Dunbarc1964212009-03-26 16:23:12 +00004687 if (Args.hasArg(options::OPT_fnested_functions))
4688 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004689
Daniel Dunbarc1964212009-03-26 16:23:12 +00004690 if (!Args.hasArg(options::OPT_nostdlib) &&
4691 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004692 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004693 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004694
Daniel Dunbarc1964212009-03-26 16:23:12 +00004695 // link_ssp spec is empty.
4696
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004697 // Let the tool chain choose which runtime library to link.
4698 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004699 }
4700
Chad Rosier06fd3c62012-05-16 23:45:12 +00004701 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004702 !Args.hasArg(options::OPT_nostartfiles)) {
4703 // endfile_spec is empty.
4704 }
4705
4706 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4707 Args.AddAllArgs(CmdArgs, options::OPT_F);
4708
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004709 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004710 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004711 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004712}
4713
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004714void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004715 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004716 const InputInfoList &Inputs,
4717 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004718 const char *LinkingOutput) const {
4719 ArgStringList CmdArgs;
4720
4721 CmdArgs.push_back("-create");
4722 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004723
4724 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004725 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004726
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004727 for (InputInfoList::const_iterator
4728 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4729 const InputInfo &II = *it;
4730 assert(II.isFilename() && "Unexpected lipo input.");
4731 CmdArgs.push_back(II.getFilename());
4732 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004733 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004734 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004735 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004736}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004737
Daniel Dunbar88299622010-06-04 18:28:36 +00004738void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004739 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004740 const InputInfoList &Inputs,
4741 const ArgList &Args,
4742 const char *LinkingOutput) const {
4743 ArgStringList CmdArgs;
4744
Daniel Dunbareb86b042011-05-09 17:23:16 +00004745 CmdArgs.push_back("-o");
4746 CmdArgs.push_back(Output.getFilename());
4747
Daniel Dunbar88299622010-06-04 18:28:36 +00004748 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4749 const InputInfo &Input = Inputs[0];
4750 assert(Input.isFilename() && "Unexpected dsymutil input.");
4751 CmdArgs.push_back(Input.getFilename());
4752
Daniel Dunbar88299622010-06-04 18:28:36 +00004753 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004754 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004755 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004756}
4757
Eric Christopher551ef452011-08-23 17:56:55 +00004758void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004759 const InputInfo &Output,
4760 const InputInfoList &Inputs,
4761 const ArgList &Args,
4762 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004763 ArgStringList CmdArgs;
4764 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004765 CmdArgs.push_back("--debug-info");
4766 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004767 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004768
4769 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4770 const InputInfo &Input = Inputs[0];
4771 assert(Input.isFilename() && "Unexpected verify input");
4772
4773 // Grabbing the output of the earlier dsymutil run.
4774 CmdArgs.push_back(Input.getFilename());
4775
4776 const char *Exec =
4777 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4778 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4779}
4780
David Chisnallf571cde2012-02-15 13:39:01 +00004781void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4782 const InputInfo &Output,
4783 const InputInfoList &Inputs,
4784 const ArgList &Args,
4785 const char *LinkingOutput) const {
4786 ArgStringList CmdArgs;
4787
4788 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4789 options::OPT_Xassembler);
4790
4791 CmdArgs.push_back("-o");
4792 CmdArgs.push_back(Output.getFilename());
4793
4794 for (InputInfoList::const_iterator
4795 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4796 const InputInfo &II = *it;
4797 CmdArgs.push_back(II.getFilename());
4798 }
4799
4800 const char *Exec =
4801 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4802 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4803}
4804
4805
4806void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4807 const InputInfo &Output,
4808 const InputInfoList &Inputs,
4809 const ArgList &Args,
4810 const char *LinkingOutput) const {
4811 // FIXME: Find a real GCC, don't hard-code versions here
4812 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4813 const llvm::Triple &T = getToolChain().getTriple();
4814 std::string LibPath = "/usr/lib/";
4815 llvm::Triple::ArchType Arch = T.getArch();
4816 switch (Arch) {
4817 case llvm::Triple::x86:
4818 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4819 T.getOSName()).str() + "/4.5.2/";
4820 break;
4821 case llvm::Triple::x86_64:
4822 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4823 T.getOSName()).str();
4824 GCCLibPath += "/4.5.2/amd64/";
4825 LibPath += "amd64/";
4826 break;
4827 default:
4828 assert(0 && "Unsupported architecture");
4829 }
4830
4831 ArgStringList CmdArgs;
4832
David Chisnall272a0712012-02-29 15:06:12 +00004833 // Demangle C++ names in errors
4834 CmdArgs.push_back("-C");
4835
David Chisnallf571cde2012-02-15 13:39:01 +00004836 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4837 (!Args.hasArg(options::OPT_shared))) {
4838 CmdArgs.push_back("-e");
4839 CmdArgs.push_back("_start");
4840 }
4841
4842 if (Args.hasArg(options::OPT_static)) {
4843 CmdArgs.push_back("-Bstatic");
4844 CmdArgs.push_back("-dn");
4845 } else {
4846 CmdArgs.push_back("-Bdynamic");
4847 if (Args.hasArg(options::OPT_shared)) {
4848 CmdArgs.push_back("-shared");
4849 } else {
4850 CmdArgs.push_back("--dynamic-linker");
4851 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4852 }
4853 }
4854
4855 if (Output.isFilename()) {
4856 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)) {
4865 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4866 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004867 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004868 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4869 } else {
4870 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004871 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4872 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004873 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004874 if (getToolChain().getDriver().CCCIsCXX)
4875 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004876 }
4877
4878 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4879
4880 Args.AddAllArgs(CmdArgs, options::OPT_L);
4881 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4882 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004883 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004884
4885 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4886
4887 if (!Args.hasArg(options::OPT_nostdlib) &&
4888 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004889 if (getToolChain().getDriver().CCCIsCXX)
4890 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004891 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004892 if (!Args.hasArg(options::OPT_shared)) {
4893 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004894 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004895 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004896 }
David Chisnallf571cde2012-02-15 13:39:01 +00004897 }
4898
4899 if (!Args.hasArg(options::OPT_nostdlib) &&
4900 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004901 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004902 }
David Chisnall96de9932012-02-16 16:00:47 +00004903 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004904
4905 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4906
4907 const char *Exec =
4908 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4909 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4910}
4911
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004912void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004913 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004914 const InputInfoList &Inputs,
4915 const ArgList &Args,
4916 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004917 ArgStringList CmdArgs;
4918
4919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4920 options::OPT_Xassembler);
4921
4922 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004923 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004924
4925 for (InputInfoList::const_iterator
4926 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4927 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004928 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004929 }
4930
4931 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004932 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004933 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004934}
4935
4936void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004937 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004938 const InputInfoList &Inputs,
4939 const ArgList &Args,
4940 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004941 ArgStringList CmdArgs;
4942
4943 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004944 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004945 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004946 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004947 }
4948
4949 if (Args.hasArg(options::OPT_static)) {
4950 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004951 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004952 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004953// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004954 CmdArgs.push_back("-Bdynamic");
4955 if (Args.hasArg(options::OPT_shared)) {
4956 CmdArgs.push_back("-shared");
4957 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004958 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004959 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4960 }
4961 }
4962
Daniel Dunbarb440f562010-08-02 02:38:21 +00004963 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004964 CmdArgs.push_back("-o");
4965 CmdArgs.push_back(Output.getFilename());
4966 } else {
4967 assert(Output.isNothing() && "Invalid output.");
4968 }
4969
4970 if (!Args.hasArg(options::OPT_nostdlib) &&
4971 !Args.hasArg(options::OPT_nostartfiles)) {
4972 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004973 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004974 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004975 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004976 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004977 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004978 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004979 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004980 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004981 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004982 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004983 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004984 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004985 }
4986
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004987 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4988 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004989 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004990
4991 Args.AddAllArgs(CmdArgs, options::OPT_L);
4992 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4993 Args.AddAllArgs(CmdArgs, options::OPT_e);
4994
Daniel Dunbar54423b22010-09-17 00:24:54 +00004995 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004996
4997 if (!Args.hasArg(options::OPT_nostdlib) &&
4998 !Args.hasArg(options::OPT_nodefaultlibs)) {
4999 // FIXME: For some reason GCC passes -lgcc before adding
5000 // the default system libraries. Just mimic this for now.
5001 CmdArgs.push_back("-lgcc");
5002
5003 if (Args.hasArg(options::OPT_pthread))
5004 CmdArgs.push_back("-pthread");
5005 if (!Args.hasArg(options::OPT_shared))
5006 CmdArgs.push_back("-lc");
5007 CmdArgs.push_back("-lgcc");
5008 }
5009
5010 if (!Args.hasArg(options::OPT_nostdlib) &&
5011 !Args.hasArg(options::OPT_nostartfiles)) {
5012 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005013 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005014 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005015 }
5016
Bill Wendling08760582011-06-27 19:15:03 +00005017 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005018
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005019 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005020 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005021 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005022}
5023
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005024void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005025 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005026 const InputInfoList &Inputs,
5027 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005028 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005029 ArgStringList CmdArgs;
5030
5031 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5032 options::OPT_Xassembler);
5033
5034 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005035 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005036
5037 for (InputInfoList::const_iterator
5038 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5039 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005040 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005041 }
5042
5043 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005044 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005045 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005046}
5047
5048void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005049 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005050 const InputInfoList &Inputs,
5051 const ArgList &Args,
5052 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005053 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005054 ArgStringList CmdArgs;
5055
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005056 // Silence warning for "clang -g foo.o -o foo"
5057 Args.ClaimAllArgs(options::OPT_g_Group);
5058 // and "clang -emit-llvm foo.o -o foo"
5059 Args.ClaimAllArgs(options::OPT_emit_llvm);
5060 // and for "clang -w foo.o -o foo". Other warning options are already
5061 // handled somewhere else.
5062 Args.ClaimAllArgs(options::OPT_w);
5063
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005064 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005065 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005066 CmdArgs.push_back("-e");
5067 CmdArgs.push_back("__start");
5068 }
5069
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005070 if (Args.hasArg(options::OPT_static)) {
5071 CmdArgs.push_back("-Bstatic");
5072 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005073 if (Args.hasArg(options::OPT_rdynamic))
5074 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005075 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005076 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005077 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005078 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005079 } else {
5080 CmdArgs.push_back("-dynamic-linker");
5081 CmdArgs.push_back("/usr/libexec/ld.so");
5082 }
5083 }
5084
Daniel Dunbarb440f562010-08-02 02:38:21 +00005085 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005086 CmdArgs.push_back("-o");
5087 CmdArgs.push_back(Output.getFilename());
5088 } else {
5089 assert(Output.isNothing() && "Invalid output.");
5090 }
5091
5092 if (!Args.hasArg(options::OPT_nostdlib) &&
5093 !Args.hasArg(options::OPT_nostartfiles)) {
5094 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005095 if (Args.hasArg(options::OPT_pg))
5096 CmdArgs.push_back(Args.MakeArgString(
5097 getToolChain().GetFilePath("gcrt0.o")));
5098 else
5099 CmdArgs.push_back(Args.MakeArgString(
5100 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005101 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005102 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005103 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005104 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005105 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005106 }
5107 }
5108
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005109 std::string Triple = getToolChain().getTripleString();
5110 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005111 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005112 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005113 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005114
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005115 Args.AddAllArgs(CmdArgs, options::OPT_L);
5116 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5117 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005118 Args.AddAllArgs(CmdArgs, options::OPT_s);
5119 Args.AddAllArgs(CmdArgs, options::OPT_t);
5120 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5121 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005122
Daniel Dunbar54423b22010-09-17 00:24:54 +00005123 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005124
5125 if (!Args.hasArg(options::OPT_nostdlib) &&
5126 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005127 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005128 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005129 if (Args.hasArg(options::OPT_pg))
5130 CmdArgs.push_back("-lm_p");
5131 else
5132 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005133 }
5134
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005135 // FIXME: For some reason GCC passes -lgcc before adding
5136 // the default system libraries. Just mimic this for now.
5137 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005138
Eric Christopher17674ec2012-09-13 06:32:34 +00005139 if (Args.hasArg(options::OPT_pthread)) {
5140 if (!Args.hasArg(options::OPT_shared) &&
5141 Args.hasArg(options::OPT_pg))
5142 CmdArgs.push_back("-lpthread_p");
5143 else
5144 CmdArgs.push_back("-lpthread");
5145 }
5146
Chandler Carruth45661652011-12-17 22:32:42 +00005147 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005148 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005149 CmdArgs.push_back("-lc_p");
5150 else
5151 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005152 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005153
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005154 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005155 }
5156
5157 if (!Args.hasArg(options::OPT_nostdlib) &&
5158 !Args.hasArg(options::OPT_nostartfiles)) {
5159 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005160 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005161 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005162 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005163 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005164 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005165 }
5166
5167 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005168 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005169 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005170}
Ed Schoutene33194b2009-04-02 19:13:12 +00005171
Eli Friedman9fa28852012-08-08 23:57:20 +00005172void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5173 const InputInfo &Output,
5174 const InputInfoList &Inputs,
5175 const ArgList &Args,
5176 const char *LinkingOutput) const {
5177 ArgStringList CmdArgs;
5178
5179 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5180 options::OPT_Xassembler);
5181
5182 CmdArgs.push_back("-o");
5183 CmdArgs.push_back(Output.getFilename());
5184
5185 for (InputInfoList::const_iterator
5186 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5187 const InputInfo &II = *it;
5188 CmdArgs.push_back(II.getFilename());
5189 }
5190
5191 const char *Exec =
5192 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5193 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5194}
5195
5196void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5197 const InputInfo &Output,
5198 const InputInfoList &Inputs,
5199 const ArgList &Args,
5200 const char *LinkingOutput) const {
5201 const Driver &D = getToolChain().getDriver();
5202 ArgStringList CmdArgs;
5203
5204 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5205 (!Args.hasArg(options::OPT_shared))) {
5206 CmdArgs.push_back("-e");
5207 CmdArgs.push_back("__start");
5208 }
5209
5210 if (Args.hasArg(options::OPT_static)) {
5211 CmdArgs.push_back("-Bstatic");
5212 } else {
5213 if (Args.hasArg(options::OPT_rdynamic))
5214 CmdArgs.push_back("-export-dynamic");
5215 CmdArgs.push_back("--eh-frame-hdr");
5216 CmdArgs.push_back("-Bdynamic");
5217 if (Args.hasArg(options::OPT_shared)) {
5218 CmdArgs.push_back("-shared");
5219 } else {
5220 CmdArgs.push_back("-dynamic-linker");
5221 CmdArgs.push_back("/usr/libexec/ld.so");
5222 }
5223 }
5224
5225 if (Output.isFilename()) {
5226 CmdArgs.push_back("-o");
5227 CmdArgs.push_back(Output.getFilename());
5228 } else {
5229 assert(Output.isNothing() && "Invalid output.");
5230 }
5231
5232 if (!Args.hasArg(options::OPT_nostdlib) &&
5233 !Args.hasArg(options::OPT_nostartfiles)) {
5234 if (!Args.hasArg(options::OPT_shared)) {
5235 if (Args.hasArg(options::OPT_pg))
5236 CmdArgs.push_back(Args.MakeArgString(
5237 getToolChain().GetFilePath("gcrt0.o")));
5238 else
5239 CmdArgs.push_back(Args.MakeArgString(
5240 getToolChain().GetFilePath("crt0.o")));
5241 CmdArgs.push_back(Args.MakeArgString(
5242 getToolChain().GetFilePath("crtbegin.o")));
5243 } else {
5244 CmdArgs.push_back(Args.MakeArgString(
5245 getToolChain().GetFilePath("crtbeginS.o")));
5246 }
5247 }
5248
5249 Args.AddAllArgs(CmdArgs, options::OPT_L);
5250 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5251 Args.AddAllArgs(CmdArgs, options::OPT_e);
5252
5253 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5254
5255 if (!Args.hasArg(options::OPT_nostdlib) &&
5256 !Args.hasArg(options::OPT_nodefaultlibs)) {
5257 if (D.CCCIsCXX) {
5258 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5259 if (Args.hasArg(options::OPT_pg))
5260 CmdArgs.push_back("-lm_p");
5261 else
5262 CmdArgs.push_back("-lm");
5263 }
5264
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005265 if (Args.hasArg(options::OPT_pthread)) {
5266 if (!Args.hasArg(options::OPT_shared) &&
5267 Args.hasArg(options::OPT_pg))
5268 CmdArgs.push_back("-lpthread_p");
5269 else
5270 CmdArgs.push_back("-lpthread");
5271 }
5272
Eli Friedman9fa28852012-08-08 23:57:20 +00005273 if (!Args.hasArg(options::OPT_shared)) {
5274 if (Args.hasArg(options::OPT_pg))
5275 CmdArgs.push_back("-lc_p");
5276 else
5277 CmdArgs.push_back("-lc");
5278 }
5279
5280 std::string myarch = "-lclang_rt.";
5281 const llvm::Triple &T = getToolChain().getTriple();
5282 llvm::Triple::ArchType Arch = T.getArch();
5283 switch (Arch) {
5284 case llvm::Triple::arm:
5285 myarch += ("arm");
5286 break;
5287 case llvm::Triple::x86:
5288 myarch += ("i386");
5289 break;
5290 case llvm::Triple::x86_64:
5291 myarch += ("amd64");
5292 break;
5293 default:
5294 assert(0 && "Unsupported architecture");
5295 }
5296 CmdArgs.push_back(Args.MakeArgString(myarch));
5297 }
5298
5299 if (!Args.hasArg(options::OPT_nostdlib) &&
5300 !Args.hasArg(options::OPT_nostartfiles)) {
5301 if (!Args.hasArg(options::OPT_shared))
5302 CmdArgs.push_back(Args.MakeArgString(
5303 getToolChain().GetFilePath("crtend.o")));
5304 else
5305 CmdArgs.push_back(Args.MakeArgString(
5306 getToolChain().GetFilePath("crtendS.o")));
5307 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005308
5309 const char *Exec =
5310 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5311 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005312}
5313
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005314void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005315 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005316 const InputInfoList &Inputs,
5317 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005318 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005319 ArgStringList CmdArgs;
5320
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005321 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5322 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005323 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005324 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005325 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005326 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005327 else if (getToolChain().getArch() == llvm::Triple::mips ||
5328 getToolChain().getArch() == llvm::Triple::mipsel ||
5329 getToolChain().getArch() == llvm::Triple::mips64 ||
5330 getToolChain().getArch() == llvm::Triple::mips64el) {
5331 StringRef CPUName;
5332 StringRef ABIName;
5333 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005334
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005335 CmdArgs.push_back("-march");
5336 CmdArgs.push_back(CPUName.data());
5337
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005338 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005339 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005340
5341 if (getToolChain().getArch() == llvm::Triple::mips ||
5342 getToolChain().getArch() == llvm::Triple::mips64)
5343 CmdArgs.push_back("-EB");
5344 else
5345 CmdArgs.push_back("-EL");
5346
5347 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5348 options::OPT_fpic, options::OPT_fno_pic,
5349 options::OPT_fPIE, options::OPT_fno_PIE,
5350 options::OPT_fpie, options::OPT_fno_pie);
5351 if (LastPICArg &&
5352 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5353 LastPICArg->getOption().matches(options::OPT_fpic) ||
5354 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5355 LastPICArg->getOption().matches(options::OPT_fpie))) {
5356 CmdArgs.push_back("-KPIC");
5357 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005358 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5359 getToolChain().getArch() == llvm::Triple::thumb) {
5360 CmdArgs.push_back("-mfpu=softvfp");
5361 switch(getToolChain().getTriple().getEnvironment()) {
5362 case llvm::Triple::GNUEABI:
5363 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005364 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005365 break;
5366
5367 default:
5368 CmdArgs.push_back("-matpcs");
5369 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005370 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005371
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005372 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5373 options::OPT_Xassembler);
5374
5375 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005376 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005377
5378 for (InputInfoList::const_iterator
5379 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5380 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005381 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005382 }
5383
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005384 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005385 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005386 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005387}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005388
5389void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005390 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005391 const InputInfoList &Inputs,
5392 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005393 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005394 const toolchains::FreeBSD& ToolChain =
5395 static_cast<const toolchains::FreeBSD&>(getToolChain());
5396 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005397 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005398
5399 // Silence warning for "clang -g foo.o -o foo"
5400 Args.ClaimAllArgs(options::OPT_g_Group);
5401 // and "clang -emit-llvm foo.o -o foo"
5402 Args.ClaimAllArgs(options::OPT_emit_llvm);
5403 // and for "clang -w foo.o -o foo". Other warning options are already
5404 // handled somewhere else.
5405 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005406
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005407 if (!D.SysRoot.empty())
5408 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5409
Roman Divackyafe2f232012-08-28 15:09:03 +00005410 if (Args.hasArg(options::OPT_pie))
5411 CmdArgs.push_back("-pie");
5412
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005413 if (Args.hasArg(options::OPT_static)) {
5414 CmdArgs.push_back("-Bstatic");
5415 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005416 if (Args.hasArg(options::OPT_rdynamic))
5417 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005418 CmdArgs.push_back("--eh-frame-hdr");
5419 if (Args.hasArg(options::OPT_shared)) {
5420 CmdArgs.push_back("-Bshareable");
5421 } else {
5422 CmdArgs.push_back("-dynamic-linker");
5423 CmdArgs.push_back("/libexec/ld-elf.so.1");
5424 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005425 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5426 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005427 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5428 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5429 CmdArgs.push_back("--hash-style=both");
5430 }
5431 }
5432 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005433 }
5434
5435 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5436 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005437 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005438 CmdArgs.push_back("-m");
5439 CmdArgs.push_back("elf_i386_fbsd");
5440 }
5441
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005442 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005443 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005444 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005445 }
5446
Daniel Dunbarb440f562010-08-02 02:38:21 +00005447 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005448 CmdArgs.push_back("-o");
5449 CmdArgs.push_back(Output.getFilename());
5450 } else {
5451 assert(Output.isNothing() && "Invalid output.");
5452 }
5453
5454 if (!Args.hasArg(options::OPT_nostdlib) &&
5455 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005456 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005457 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005458 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005459 crt1 = "gcrt1.o";
5460 else if (Args.hasArg(options::OPT_pie))
5461 crt1 = "Scrt1.o";
5462 else
5463 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005464 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005465 if (crt1)
5466 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5467
5468 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5469
5470 const char *crtbegin = NULL;
5471 if (Args.hasArg(options::OPT_static))
5472 crtbegin = "crtbeginT.o";
5473 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5474 crtbegin = "crtbeginS.o";
5475 else
5476 crtbegin = "crtbegin.o";
5477
5478 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005479 }
5480
5481 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005482 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005483 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5484 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005485 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005486 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5487 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005488 Args.AddAllArgs(CmdArgs, options::OPT_s);
5489 Args.AddAllArgs(CmdArgs, options::OPT_t);
5490 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5491 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005492
Roman Divackyafe2f232012-08-28 15:09:03 +00005493 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005494
5495 if (!Args.hasArg(options::OPT_nostdlib) &&
5496 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005497 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005498 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005499 if (Args.hasArg(options::OPT_pg))
5500 CmdArgs.push_back("-lm_p");
5501 else
5502 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005503 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005504 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5505 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005506 if (Args.hasArg(options::OPT_pg))
5507 CmdArgs.push_back("-lgcc_p");
5508 else
5509 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005510 if (Args.hasArg(options::OPT_static)) {
5511 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005512 } else if (Args.hasArg(options::OPT_pg)) {
5513 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005514 } else {
5515 CmdArgs.push_back("--as-needed");
5516 CmdArgs.push_back("-lgcc_s");
5517 CmdArgs.push_back("--no-as-needed");
5518 }
5519
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005520 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005521 if (Args.hasArg(options::OPT_pg))
5522 CmdArgs.push_back("-lpthread_p");
5523 else
5524 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005525 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005526
Roman Divacky66f22762011-02-10 16:59:40 +00005527 if (Args.hasArg(options::OPT_pg)) {
5528 if (Args.hasArg(options::OPT_shared))
5529 CmdArgs.push_back("-lc");
5530 else
5531 CmdArgs.push_back("-lc_p");
5532 CmdArgs.push_back("-lgcc_p");
5533 } else {
5534 CmdArgs.push_back("-lc");
5535 CmdArgs.push_back("-lgcc");
5536 }
5537
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005538 if (Args.hasArg(options::OPT_static)) {
5539 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005540 } else if (Args.hasArg(options::OPT_pg)) {
5541 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005542 } else {
5543 CmdArgs.push_back("--as-needed");
5544 CmdArgs.push_back("-lgcc_s");
5545 CmdArgs.push_back("--no-as-needed");
5546 }
5547 }
5548
5549 if (!Args.hasArg(options::OPT_nostdlib) &&
5550 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005551 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005552 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005553 else
5554 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005555 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005556 }
5557
Roman Divackyafe2f232012-08-28 15:09:03 +00005558 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005559
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005560 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005561 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005562 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005563}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005564
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005565void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5566 const InputInfo &Output,
5567 const InputInfoList &Inputs,
5568 const ArgList &Args,
5569 const char *LinkingOutput) const {
5570 ArgStringList CmdArgs;
5571
5572 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5573 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005574 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005575 CmdArgs.push_back("--32");
5576
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005577 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005578 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005579 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005580 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005581 CmdArgs.push_back("-EL");
5582
5583 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5584 options::OPT_Xassembler);
5585
5586 CmdArgs.push_back("-o");
5587 CmdArgs.push_back(Output.getFilename());
5588
5589 for (InputInfoList::const_iterator
5590 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5591 const InputInfo &II = *it;
5592 CmdArgs.push_back(II.getFilename());
5593 }
5594
David Chisnallddbd68f2011-09-27 22:03:18 +00005595 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005596 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5597}
5598
5599void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5600 const InputInfo &Output,
5601 const InputInfoList &Inputs,
5602 const ArgList &Args,
5603 const char *LinkingOutput) const {
5604 const Driver &D = getToolChain().getDriver();
5605 ArgStringList CmdArgs;
5606
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005607 if (!D.SysRoot.empty())
5608 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5609
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005610 if (Args.hasArg(options::OPT_static)) {
5611 CmdArgs.push_back("-Bstatic");
5612 } else {
5613 if (Args.hasArg(options::OPT_rdynamic))
5614 CmdArgs.push_back("-export-dynamic");
5615 CmdArgs.push_back("--eh-frame-hdr");
5616 if (Args.hasArg(options::OPT_shared)) {
5617 CmdArgs.push_back("-Bshareable");
5618 } else {
5619 CmdArgs.push_back("-dynamic-linker");
5620 CmdArgs.push_back("/libexec/ld.elf_so");
5621 }
5622 }
5623
5624 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5625 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005626 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005627 CmdArgs.push_back("-m");
5628 CmdArgs.push_back("elf_i386");
5629 }
5630
5631 if (Output.isFilename()) {
5632 CmdArgs.push_back("-o");
5633 CmdArgs.push_back(Output.getFilename());
5634 } else {
5635 assert(Output.isNothing() && "Invalid output.");
5636 }
5637
5638 if (!Args.hasArg(options::OPT_nostdlib) &&
5639 !Args.hasArg(options::OPT_nostartfiles)) {
5640 if (!Args.hasArg(options::OPT_shared)) {
5641 CmdArgs.push_back(Args.MakeArgString(
5642 getToolChain().GetFilePath("crt0.o")));
5643 CmdArgs.push_back(Args.MakeArgString(
5644 getToolChain().GetFilePath("crti.o")));
5645 CmdArgs.push_back(Args.MakeArgString(
5646 getToolChain().GetFilePath("crtbegin.o")));
5647 } else {
5648 CmdArgs.push_back(Args.MakeArgString(
5649 getToolChain().GetFilePath("crti.o")));
5650 CmdArgs.push_back(Args.MakeArgString(
5651 getToolChain().GetFilePath("crtbeginS.o")));
5652 }
5653 }
5654
5655 Args.AddAllArgs(CmdArgs, options::OPT_L);
5656 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5657 Args.AddAllArgs(CmdArgs, options::OPT_e);
5658 Args.AddAllArgs(CmdArgs, options::OPT_s);
5659 Args.AddAllArgs(CmdArgs, options::OPT_t);
5660 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5661 Args.AddAllArgs(CmdArgs, options::OPT_r);
5662
5663 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5664
5665 if (!Args.hasArg(options::OPT_nostdlib) &&
5666 !Args.hasArg(options::OPT_nodefaultlibs)) {
5667 if (D.CCCIsCXX) {
5668 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5669 CmdArgs.push_back("-lm");
5670 }
5671 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5672 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005673 if (Args.hasArg(options::OPT_static)) {
5674 CmdArgs.push_back("-lgcc_eh");
5675 } else {
5676 CmdArgs.push_back("--as-needed");
5677 CmdArgs.push_back("-lgcc_s");
5678 CmdArgs.push_back("--no-as-needed");
5679 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005680 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005681
5682 if (Args.hasArg(options::OPT_pthread))
5683 CmdArgs.push_back("-lpthread");
5684 CmdArgs.push_back("-lc");
5685
5686 CmdArgs.push_back("-lgcc");
5687 if (Args.hasArg(options::OPT_static)) {
5688 CmdArgs.push_back("-lgcc_eh");
5689 } else {
5690 CmdArgs.push_back("--as-needed");
5691 CmdArgs.push_back("-lgcc_s");
5692 CmdArgs.push_back("--no-as-needed");
5693 }
5694 }
5695
5696 if (!Args.hasArg(options::OPT_nostdlib) &&
5697 !Args.hasArg(options::OPT_nostartfiles)) {
5698 if (!Args.hasArg(options::OPT_shared))
5699 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5700 "crtend.o")));
5701 else
5702 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5703 "crtendS.o")));
5704 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5705 "crtn.o")));
5706 }
5707
Bill Wendling08760582011-06-27 19:15:03 +00005708 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005709
David Chisnallddbd68f2011-09-27 22:03:18 +00005710 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005711 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5712}
5713
Thomas Schwinge4e555262013-03-28 19:04:25 +00005714void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5715 const InputInfo &Output,
5716 const InputInfoList &Inputs,
5717 const ArgList &Args,
5718 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005719 ArgStringList CmdArgs;
5720
5721 // Add --32/--64 to make sure we get the format we want.
5722 // This is incomplete
5723 if (getToolChain().getArch() == llvm::Triple::x86) {
5724 CmdArgs.push_back("--32");
5725 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5726 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005727 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5728 CmdArgs.push_back("-a32");
5729 CmdArgs.push_back("-mppc");
5730 CmdArgs.push_back("-many");
5731 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5732 CmdArgs.push_back("-a64");
5733 CmdArgs.push_back("-mppc64");
5734 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005735 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005736 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005737 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5738 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005739
5740 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5741 getToolChain().getTriple());
5742 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005743
5744 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5745 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5746 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005747 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5748 getToolChain().getArch() == llvm::Triple::mipsel ||
5749 getToolChain().getArch() == llvm::Triple::mips64 ||
5750 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005751 StringRef CPUName;
5752 StringRef ABIName;
5753 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005754
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005755 CmdArgs.push_back("-march");
5756 CmdArgs.push_back(CPUName.data());
5757
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005758 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005759 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005760
5761 if (getToolChain().getArch() == llvm::Triple::mips ||
5762 getToolChain().getArch() == llvm::Triple::mips64)
5763 CmdArgs.push_back("-EB");
5764 else
5765 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005766
5767 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5768 options::OPT_fpic, options::OPT_fno_pic,
5769 options::OPT_fPIE, options::OPT_fno_PIE,
5770 options::OPT_fpie, options::OPT_fno_pie);
5771 if (LastPICArg &&
5772 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5773 LastPICArg->getOption().matches(options::OPT_fpic) ||
5774 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5775 LastPICArg->getOption().matches(options::OPT_fpie))) {
5776 CmdArgs.push_back("-KPIC");
5777 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005778 }
5779
5780 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5781 options::OPT_Xassembler);
5782
5783 CmdArgs.push_back("-o");
5784 CmdArgs.push_back(Output.getFilename());
5785
5786 for (InputInfoList::const_iterator
5787 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5788 const InputInfo &II = *it;
5789 CmdArgs.push_back(II.getFilename());
5790 }
5791
5792 const char *Exec =
5793 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5794 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5795}
5796
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005797static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5798 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005799 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005800 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5801 Args.hasArg(options::OPT_static);
Rafael Espindolacc354322011-10-17 21:39:04 +00005802 if (!D.CCCIsCXX)
5803 CmdArgs.push_back("-lgcc");
5804
Logan Chien3d3373c2012-11-19 12:04:11 +00005805 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005806 if (D.CCCIsCXX)
5807 CmdArgs.push_back("-lgcc");
5808 } else {
5809 if (!D.CCCIsCXX)
5810 CmdArgs.push_back("--as-needed");
5811 CmdArgs.push_back("-lgcc_s");
5812 if (!D.CCCIsCXX)
5813 CmdArgs.push_back("--no-as-needed");
5814 }
5815
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005816 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005817 CmdArgs.push_back("-lgcc_eh");
5818 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5819 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005820
5821 // According to Android ABI, we have to link with libdl if we are
5822 // linking with non-static libgcc.
5823 //
5824 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5825 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5826 if (isAndroid && !StaticLibgcc)
5827 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005828}
5829
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005830static bool hasMipsN32ABIArg(const ArgList &Args) {
5831 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005832 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005833}
5834
Thomas Schwinge4e555262013-03-28 19:04:25 +00005835void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5836 const InputInfo &Output,
5837 const InputInfoList &Inputs,
5838 const ArgList &Args,
5839 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005840 const toolchains::Linux& ToolChain =
5841 static_cast<const toolchains::Linux&>(getToolChain());
5842 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005843 const bool isAndroid =
5844 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005845 SanitizerArgs Sanitize(getToolChain(), Args);
5846 const bool IsPIE =
5847 !Args.hasArg(options::OPT_shared) &&
5848 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005849
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005850 ArgStringList CmdArgs;
5851
Rafael Espindolad1002f62010-11-15 18:28:16 +00005852 // Silence warning for "clang -g foo.o -o foo"
5853 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005854 // and "clang -emit-llvm foo.o -o foo"
5855 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005856 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005857 // handled somewhere else.
5858 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005859
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005860 if (!D.SysRoot.empty())
5861 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005862
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005863 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00005864 CmdArgs.push_back("-pie");
5865
Rafael Espindola1c76c592010-11-07 22:57:16 +00005866 if (Args.hasArg(options::OPT_rdynamic))
5867 CmdArgs.push_back("-export-dynamic");
5868
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005869 if (Args.hasArg(options::OPT_s))
5870 CmdArgs.push_back("-s");
5871
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005872 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5873 e = ToolChain.ExtraOpts.end();
5874 i != e; ++i)
5875 CmdArgs.push_back(i->c_str());
5876
5877 if (!Args.hasArg(options::OPT_static)) {
5878 CmdArgs.push_back("--eh-frame-hdr");
5879 }
5880
5881 CmdArgs.push_back("-m");
5882 if (ToolChain.getArch() == llvm::Triple::x86)
5883 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005884 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5885 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005886 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005887 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005888 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005889 else if (ToolChain.getArch() == llvm::Triple::ppc)
5890 CmdArgs.push_back("elf32ppclinux");
5891 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5892 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005893 else if (ToolChain.getArch() == llvm::Triple::mips)
5894 CmdArgs.push_back("elf32btsmip");
5895 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5896 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005897 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5898 if (hasMipsN32ABIArg(Args))
5899 CmdArgs.push_back("elf32btsmipn32");
5900 else
5901 CmdArgs.push_back("elf64btsmip");
5902 }
5903 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5904 if (hasMipsN32ABIArg(Args))
5905 CmdArgs.push_back("elf32ltsmipn32");
5906 else
5907 CmdArgs.push_back("elf64ltsmip");
5908 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005909 else
5910 CmdArgs.push_back("elf_x86_64");
5911
5912 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005913 if (ToolChain.getArch() == llvm::Triple::arm
5914 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005915 CmdArgs.push_back("-Bstatic");
5916 else
5917 CmdArgs.push_back("-static");
5918 } else if (Args.hasArg(options::OPT_shared)) {
5919 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005920 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005921 CmdArgs.push_back("-Bsymbolic");
5922 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005923 }
5924
5925 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005926 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005927 (!Args.hasArg(options::OPT_static) &&
5928 !Args.hasArg(options::OPT_shared))) {
5929 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005930 if (isAndroid)
5931 CmdArgs.push_back("/system/bin/linker");
5932 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005933 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005934 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5935 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005936 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005937 ToolChain.getArch() == llvm::Triple::thumb) {
5938 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5939 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5940 else
5941 CmdArgs.push_back("/lib/ld-linux.so.3");
5942 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005943 else if (ToolChain.getArch() == llvm::Triple::mips ||
5944 ToolChain.getArch() == llvm::Triple::mipsel)
5945 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005946 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005947 ToolChain.getArch() == llvm::Triple::mips64el) {
5948 if (hasMipsN32ABIArg(Args))
5949 CmdArgs.push_back("/lib32/ld.so.1");
5950 else
5951 CmdArgs.push_back("/lib64/ld.so.1");
5952 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005953 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005954 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005955 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005956 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005957 else
5958 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5959 }
5960
5961 CmdArgs.push_back("-o");
5962 CmdArgs.push_back(Output.getFilename());
5963
Rafael Espindola81937ec2010-12-01 01:52:43 +00005964 if (!Args.hasArg(options::OPT_nostdlib) &&
5965 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005966 if (!isAndroid) {
5967 const char *crt1 = NULL;
5968 if (!Args.hasArg(options::OPT_shared)){
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005969 if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005970 crt1 = "Scrt1.o";
5971 else
5972 crt1 = "crt1.o";
5973 }
5974 if (crt1)
5975 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005976
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005977 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5978 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005979
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005980 const char *crtbegin;
5981 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005982 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005983 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005984 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005985 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005986 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005987 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005988 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005989 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005990
5991 // Add crtfastmath.o if available and fast math is enabled.
5992 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005993 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005994
5995 Args.AddAllArgs(CmdArgs, options::OPT_L);
5996
5997 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5998
Roman Divackyee8188a2011-03-01 17:53:14 +00005999 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6000 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006001 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006002
Rafael Espindola9446d762012-04-09 23:53:34 +00006003 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6004 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6005 // forward.
6006 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6007 CmdArgs.push_back("-plugin");
6008 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6009 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006010
6011 // Try to pass driver level flags relevant to LTO code generation down to
6012 // the plugin.
6013
6014 // Handle architecture-specific flags for selecting CPU variants.
6015 if (ToolChain.getArch() == llvm::Triple::x86 ||
6016 ToolChain.getArch() == llvm::Triple::x86_64)
6017 CmdArgs.push_back(
6018 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6019 getX86TargetCPU(Args, ToolChain.getTriple())));
6020 else if (ToolChain.getArch() == llvm::Triple::arm ||
6021 ToolChain.getArch() == llvm::Triple::thumb)
6022 CmdArgs.push_back(
6023 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6024 getARMTargetCPU(Args, ToolChain.getTriple())));
6025
6026 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6027 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00006028 }
6029
Chandler Carruth953fb082013-01-13 11:46:33 +00006030
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006031 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6032 CmdArgs.push_back("--no-demangle");
6033
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006034 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6035
Eric Christopher04997782012-11-29 18:51:05 +00006036 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006037 if (Sanitize.needsUbsanRt())
Richard Smithcff3cde2013-03-20 23:49:07 +00006038 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6039 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6040 Sanitize.needsMsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006041 if (Sanitize.needsAsanRt())
6042 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6043 if (Sanitize.needsTsanRt())
6044 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006045 if (Sanitize.needsMsanRt())
6046 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006047
Chandler Carruth94a32012012-05-14 18:31:18 +00006048 if (D.CCCIsCXX &&
6049 !Args.hasArg(options::OPT_nostdlib) &&
6050 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006051 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6052 !Args.hasArg(options::OPT_static);
6053 if (OnlyLibstdcxxStatic)
6054 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006055 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006056 if (OnlyLibstdcxxStatic)
6057 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006058 CmdArgs.push_back("-lm");
6059 }
6060
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006061 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006062 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6063 if (Args.hasArg(options::OPT_static))
6064 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006065
Chandler Carruth01538002013-01-17 13:19:29 +00006066 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6067 if (OpenMP) {
6068 CmdArgs.push_back("-lgomp");
6069
6070 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6071 // librt. Most modern Linux platfroms require it, but some may not.
6072 CmdArgs.push_back("-lrt");
6073 }
6074
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006075 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006076
Chandler Carruth94a32012012-05-14 18:31:18 +00006077 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006078 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006079 CmdArgs.push_back("-lpthread");
6080
6081 CmdArgs.push_back("-lc");
6082
6083 if (Args.hasArg(options::OPT_static))
6084 CmdArgs.push_back("--end-group");
6085 else
6086 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6087 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006088
Rafael Espindola81937ec2010-12-01 01:52:43 +00006089 if (!Args.hasArg(options::OPT_nostartfiles)) {
6090 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006091 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006092 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006093 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006094 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006095 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006096 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006097
Rafael Espindola81937ec2010-12-01 01:52:43 +00006098 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006099 if (!isAndroid)
6100 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006101 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006102 }
6103
Bill Wendling08760582011-06-27 19:15:03 +00006104 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006105
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006106 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6107}
Rafael Espindola92b00932010-08-10 00:25:48 +00006108
Chris Lattner3e2ee142010-07-07 16:01:42 +00006109void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006110 const InputInfo &Output,
6111 const InputInfoList &Inputs,
6112 const ArgList &Args,
6113 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006114 ArgStringList CmdArgs;
6115
6116 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6117 options::OPT_Xassembler);
6118
6119 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006120 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006121
6122 for (InputInfoList::const_iterator
6123 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6124 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006125 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006126 }
6127
6128 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006129 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006130 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006131}
6132
6133void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006134 const InputInfo &Output,
6135 const InputInfoList &Inputs,
6136 const ArgList &Args,
6137 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006138 const Driver &D = getToolChain().getDriver();
6139 ArgStringList CmdArgs;
6140
Daniel Dunbarb440f562010-08-02 02:38:21 +00006141 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006142 CmdArgs.push_back("-o");
6143 CmdArgs.push_back(Output.getFilename());
6144 } else {
6145 assert(Output.isNothing() && "Invalid output.");
6146 }
6147
6148 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006149 !Args.hasArg(options::OPT_nostartfiles)) {
6150 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6151 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6152 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6153 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6154 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006155
6156 Args.AddAllArgs(CmdArgs, options::OPT_L);
6157 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6158 Args.AddAllArgs(CmdArgs, options::OPT_e);
6159
Daniel Dunbar54423b22010-09-17 00:24:54 +00006160 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006161
Eli Friedman83de5132011-12-08 23:54:21 +00006162 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6163
Chris Lattner3e2ee142010-07-07 16:01:42 +00006164 if (!Args.hasArg(options::OPT_nostdlib) &&
6165 !Args.hasArg(options::OPT_nodefaultlibs)) {
6166 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006167 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006168 CmdArgs.push_back("-lm");
6169 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006170 }
6171
6172 if (!Args.hasArg(options::OPT_nostdlib) &&
6173 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006174 if (Args.hasArg(options::OPT_pthread))
6175 CmdArgs.push_back("-lpthread");
6176 CmdArgs.push_back("-lc");
6177 CmdArgs.push_back("-lCompilerRT-Generic");
6178 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6179 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006180 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006181 }
6182
Eli Friedman83de5132011-12-08 23:54:21 +00006183 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006184 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006185}
6186
Daniel Dunbarcc912342009-05-02 18:28:39 +00006187/// DragonFly Tools
6188
6189// For now, DragonFly Assemble does just about the same as for
6190// FreeBSD, but this may change soon.
6191void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006192 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006193 const InputInfoList &Inputs,
6194 const ArgList &Args,
6195 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006196 ArgStringList CmdArgs;
6197
6198 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6199 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006200 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006201 CmdArgs.push_back("--32");
6202
6203 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6204 options::OPT_Xassembler);
6205
6206 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006207 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006208
6209 for (InputInfoList::const_iterator
6210 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6211 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006212 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006213 }
6214
6215 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006216 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006217 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006218}
6219
6220void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006221 const InputInfo &Output,
6222 const InputInfoList &Inputs,
6223 const ArgList &Args,
6224 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006225 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006226 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006227 ArgStringList CmdArgs;
6228
John McCall65b8da02013-04-11 22:55:55 +00006229 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6230 UseGCC47 = false;
6231
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006232 if (!D.SysRoot.empty())
6233 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6234
John McCall65b8da02013-04-11 22:55:55 +00006235 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006236 if (Args.hasArg(options::OPT_static)) {
6237 CmdArgs.push_back("-Bstatic");
6238 } else {
John McCall65b8da02013-04-11 22:55:55 +00006239 if (Args.hasArg(options::OPT_rdynamic))
6240 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006241 if (Args.hasArg(options::OPT_shared))
6242 CmdArgs.push_back("-Bshareable");
6243 else {
6244 CmdArgs.push_back("-dynamic-linker");
6245 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6246 }
John McCall65b8da02013-04-11 22:55:55 +00006247 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006248 }
6249
6250 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6251 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006252 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006253 CmdArgs.push_back("-m");
6254 CmdArgs.push_back("elf_i386");
6255 }
6256
Daniel Dunbarb440f562010-08-02 02:38:21 +00006257 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006258 CmdArgs.push_back("-o");
6259 CmdArgs.push_back(Output.getFilename());
6260 } else {
6261 assert(Output.isNothing() && "Invalid output.");
6262 }
6263
6264 if (!Args.hasArg(options::OPT_nostdlib) &&
6265 !Args.hasArg(options::OPT_nostartfiles)) {
6266 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006267 if (Args.hasArg(options::OPT_pg))
6268 CmdArgs.push_back(Args.MakeArgString(
6269 getToolChain().GetFilePath("gcrt1.o")));
6270 else {
6271 if (Args.hasArg(options::OPT_pie))
6272 CmdArgs.push_back(Args.MakeArgString(
6273 getToolChain().GetFilePath("Scrt1.o")));
6274 else
6275 CmdArgs.push_back(Args.MakeArgString(
6276 getToolChain().GetFilePath("crt1.o")));
6277 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006278 }
John McCall65b8da02013-04-11 22:55:55 +00006279 CmdArgs.push_back(Args.MakeArgString(
6280 getToolChain().GetFilePath("crti.o")));
6281 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6282 CmdArgs.push_back(Args.MakeArgString(
6283 getToolChain().GetFilePath("crtbeginS.o")));
6284 else
6285 CmdArgs.push_back(Args.MakeArgString(
6286 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006287 }
6288
6289 Args.AddAllArgs(CmdArgs, options::OPT_L);
6290 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6291 Args.AddAllArgs(CmdArgs, options::OPT_e);
6292
Daniel Dunbar54423b22010-09-17 00:24:54 +00006293 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006294
6295 if (!Args.hasArg(options::OPT_nostdlib) &&
6296 !Args.hasArg(options::OPT_nodefaultlibs)) {
6297 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6298 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006299 if (UseGCC47)
6300 CmdArgs.push_back("-L/usr/lib/gcc47");
6301 else
6302 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006303
6304 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006305 if (UseGCC47) {
6306 CmdArgs.push_back("-rpath");
6307 CmdArgs.push_back("/usr/lib/gcc47");
6308 } else {
6309 CmdArgs.push_back("-rpath");
6310 CmdArgs.push_back("/usr/lib/gcc44");
6311 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006312 }
6313
Rafael Espindola38360b32010-07-20 12:59:03 +00006314 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006315 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006316 CmdArgs.push_back("-lm");
6317 }
6318
Daniel Dunbarcc912342009-05-02 18:28:39 +00006319 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006320 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006321
6322 if (!Args.hasArg(options::OPT_nolibc)) {
6323 CmdArgs.push_back("-lc");
6324 }
6325
John McCall65b8da02013-04-11 22:55:55 +00006326 if (UseGCC47) {
6327 if (Args.hasArg(options::OPT_static) ||
6328 Args.hasArg(options::OPT_static_libgcc)) {
6329 CmdArgs.push_back("-lgcc");
6330 CmdArgs.push_back("-lgcc_eh");
6331 } else {
6332 if (Args.hasArg(options::OPT_shared_libgcc)) {
6333 CmdArgs.push_back("-lgcc_pic");
6334 if (!Args.hasArg(options::OPT_shared))
6335 CmdArgs.push_back("-lgcc");
6336 } else {
6337 CmdArgs.push_back("-lgcc");
6338 CmdArgs.push_back("--as-needed");
6339 CmdArgs.push_back("-lgcc_pic");
6340 CmdArgs.push_back("--no-as-needed");
6341 }
6342 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006343 } else {
John McCall65b8da02013-04-11 22:55:55 +00006344 if (Args.hasArg(options::OPT_shared)) {
6345 CmdArgs.push_back("-lgcc_pic");
6346 } else {
6347 CmdArgs.push_back("-lgcc");
6348 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006349 }
6350 }
6351
6352 if (!Args.hasArg(options::OPT_nostdlib) &&
6353 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006354 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006355 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006356 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006357 else
6358 CmdArgs.push_back(Args.MakeArgString(
6359 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006360 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006361 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006362 }
6363
Bill Wendling08760582011-06-27 19:15:03 +00006364 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006365
Daniel Dunbarcc912342009-05-02 18:28:39 +00006366 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006367 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006368 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006369}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006370
6371void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6372 const InputInfo &Output,
6373 const InputInfoList &Inputs,
6374 const ArgList &Args,
6375 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006376 ArgStringList CmdArgs;
6377
6378 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006379 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6380 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006381 } else {
6382 assert(Output.isNothing() && "Invalid output.");
6383 }
6384
6385 if (!Args.hasArg(options::OPT_nostdlib) &&
6386 !Args.hasArg(options::OPT_nostartfiles)) {
6387 CmdArgs.push_back("-defaultlib:libcmt");
6388 }
6389
6390 CmdArgs.push_back("-nologo");
6391
Michael J. Spencere2f49362012-06-18 16:56:04 +00006392 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6393
6394 // Add filenames immediately.
6395 for (InputInfoList::const_iterator
6396 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6397 if (it->isFilename())
6398 CmdArgs.push_back(it->getFilename());
6399 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006400
6401 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006402 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006403 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6404}