blob: 71e50a5c9e57ece3e5be9169d9a19aa661bcb50c [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 Gregorf936f782011-09-14 20:28:46 +0000417
418 // If a module path was provided, pass it along. Otherwise, use a temporary
419 // directory.
420 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000421 A->claim();
422 A->render(Args, CmdArgs);
423 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000424 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000425 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
426 DefaultModuleCache);
427 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
428 CmdArgs.push_back("-fmodule-cache-path");
429 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
430 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000431
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000433 // FIXME: We should probably sink the logic for handling these from the
434 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // CPATH - included following the user specified includes (but prior to
436 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000442 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000443 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000444 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000445 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000446
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000447 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000448 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000449 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000450
451 // Add system include arguments.
452 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000453}
454
Daniel Dunbarf492c922009-09-10 22:59:51 +0000455/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000456/// CPU.
457//
458// FIXME: This is redundant with -mcpu, why does LLVM use this.
459// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000460static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000461 return llvm::StringSwitch<const char *>(CPU)
462 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
463 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
464 .Cases("arm920", "arm920t", "arm922t", "v4t")
465 .Cases("arm940t", "ep9312","v4t")
466 .Cases("arm10tdmi", "arm1020t", "v5")
467 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
468 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
469 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
470 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
471 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
472 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Quentin Colombet2e9952e2012-11-29 23:15:27 +0000473 .Cases("cortex-a5", "cortex-a8", "cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000474 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000475 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000476 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000477 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000478 .Case("cortex-a9-mp", "v7f")
479 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000480 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000481}
482
Benjamin Kramer09811c72012-06-26 22:20:06 +0000483/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
484//
485// FIXME: tblgen this.
486static std::string getARMTargetCPU(const ArgList &Args,
487 const llvm::Triple &Triple) {
488 // FIXME: Warn on inconsistent use of -mcpu and -march.
489
490 // If we have -mcpu=, use that.
491 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000492 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000493 // Handle -mcpu=native.
494 if (MCPU == "native")
495 return llvm::sys::getHostCPUName();
496 else
497 return MCPU;
498 }
499
500 StringRef MArch;
501 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
502 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000503 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000504 } else {
505 // Otherwise, use the Arch from the triple.
506 MArch = Triple.getArchName();
507 }
508
509 // Handle -march=native.
510 std::string NativeMArch;
511 if (MArch == "native") {
512 std::string CPU = llvm::sys::getHostCPUName();
513 if (CPU != "generic") {
514 // Translate the native cpu into the architecture. The switch below will
515 // then chose the minimum cpu for that arch.
516 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
517 MArch = NativeMArch;
518 }
519 }
520
521 return llvm::StringSwitch<const char *>(MArch)
522 .Cases("armv2", "armv2a","arm2")
523 .Case("armv3", "arm6")
524 .Case("armv3m", "arm7m")
525 .Cases("armv4", "armv4t", "arm7tdmi")
526 .Cases("armv5", "armv5t", "arm10tdmi")
527 .Cases("armv5e", "armv5te", "arm1022e")
528 .Case("armv5tej", "arm926ej-s")
529 .Cases("armv6", "armv6k", "arm1136jf-s")
530 .Case("armv6j", "arm1136j-s")
531 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
532 .Case("armv6t2", "arm1156t2-s")
533 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000534 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
535 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000536 .Cases("armv7r", "armv7-r", "cortex-r4")
537 .Cases("armv7m", "armv7-m", "cortex-m3")
538 .Case("ep9312", "ep9312")
539 .Case("iwmmxt", "iwmmxt")
540 .Case("xscale", "xscale")
541 .Cases("armv6m", "armv6-m", "cortex-m0")
542 // If all else failed, return the most base CPU LLVM supports.
543 .Default("arm7tdmi");
544}
545
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000546// FIXME: Move to target hook.
547static bool isSignedCharDefault(const llvm::Triple &Triple) {
548 switch (Triple.getArch()) {
549 default:
550 return true;
551
Tim Northover9bb857a2013-01-31 12:13:10 +0000552 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000553 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000554 case llvm::Triple::ppc:
555 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000556 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000557 return true;
558 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000559 }
560}
561
Chad Rosiercfbfc582012-04-04 20:51:35 +0000562// Handle -mfpu=.
563//
564// FIXME: Centralize feature selection, defaulting shouldn't be also in the
565// frontend target.
566static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
567 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000568 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000569
570 // Set the target features based on the FPU.
571 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
572 // Disable any default FPU support.
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-vfp2");
575 CmdArgs.push_back("-target-feature");
576 CmdArgs.push_back("-vfp3");
577 CmdArgs.push_back("-target-feature");
578 CmdArgs.push_back("-neon");
579 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+vfp3");
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("+d16");
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neon");
586 } else if (FPU == "vfp") {
587 CmdArgs.push_back("-target-feature");
588 CmdArgs.push_back("+vfp2");
589 CmdArgs.push_back("-target-feature");
590 CmdArgs.push_back("-neon");
591 } else if (FPU == "vfp3" || FPU == "vfpv3") {
592 CmdArgs.push_back("-target-feature");
593 CmdArgs.push_back("+vfp3");
594 CmdArgs.push_back("-target-feature");
595 CmdArgs.push_back("-neon");
596 } else if (FPU == "neon") {
597 CmdArgs.push_back("-target-feature");
598 CmdArgs.push_back("+neon");
599 } else
600 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
601}
602
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000603// Handle -mfpmath=.
604static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000605 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000606 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000607
608 // Set the target features based on the FPMath.
609 if (FPMath == "neon") {
610 CmdArgs.push_back("-target-feature");
611 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000612
Silviu Baranga157f7c62012-09-13 15:06:00 +0000613 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
Quentin Colombet2e9952e2012-11-29 23:15:27 +0000614 CPU != "cortex-a15" && CPU != "cortex-a5")
Chad Rosier45619cb2012-04-04 22:13:40 +0000615 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
616
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000617 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
618 FPMath == "vfp4") {
619 CmdArgs.push_back("-target-feature");
620 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000621
622 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000623 } else
624 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
625}
626
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000627// Select the float ABI as determined by -msoft-float, -mhard-float, and
628// -mfloat-abi=.
629static StringRef getARMFloatABI(const Driver &D,
630 const ArgList &Args,
631 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000632 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
634 options::OPT_mhard_float,
635 options::OPT_mfloat_abi_EQ)) {
636 if (A->getOption().matches(options::OPT_msoft_float))
637 FloatABI = "soft";
638 else if (A->getOption().matches(options::OPT_mhard_float))
639 FloatABI = "hard";
640 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000641 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000642 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000643 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000644 << A->getAsString(Args);
645 FloatABI = "soft";
646 }
647 }
648 }
649
650 // If unspecified, choose the default based on the platform.
651 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000652 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000653 case llvm::Triple::Darwin:
654 case llvm::Triple::MacOSX:
655 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000656 // Darwin defaults to "softfp" for v6 and v7.
657 //
658 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000659 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000660 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000661 if (StringRef(ArchName).startswith("v6") ||
662 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000663 FloatABI = "softfp";
664 else
665 FloatABI = "soft";
666 break;
667 }
668
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000669 case llvm::Triple::FreeBSD:
670 // FreeBSD defaults to soft float
671 FloatABI = "soft";
672 break;
673
Daniel Dunbar78485922009-09-10 23:00:09 +0000674 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000675 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000676 case llvm::Triple::GNUEABIHF:
677 FloatABI = "hard";
678 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000679 case llvm::Triple::GNUEABI:
680 FloatABI = "softfp";
681 break;
682 case llvm::Triple::EABI:
683 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
684 FloatABI = "softfp";
685 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000686 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000687 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000688 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000689 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000690 FloatABI = "softfp";
691 else
692 FloatABI = "soft";
693 break;
694 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000695 default:
696 // Assume "soft", but warn the user we are guessing.
697 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000698 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000699 break;
700 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000701 }
702 }
703
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000704 return FloatABI;
705}
706
707
708void Clang::AddARMTargetArgs(const ArgList &Args,
709 ArgStringList &CmdArgs,
710 bool KernelOrKext) const {
711 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000712 // Get the effective triple, which takes into account the deployment target.
713 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
714 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000715 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000716
717 // Select the ABI to use.
718 //
719 // FIXME: Support -meabi.
720 const char *ABIName = 0;
721 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000722 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000723 } else if (Triple.isOSDarwin()) {
724 // The backend is hardwired to assume AAPCS for M-class processors, ensure
725 // the frontend matches that.
726 if (StringRef(CPUName).startswith("cortex-m")) {
727 ABIName = "aapcs";
728 } else {
729 ABIName = "apcs-gnu";
730 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000731 } else {
732 // Select the default based on the platform.
733 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000734 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000735 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000736 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737 ABIName = "aapcs-linux";
738 break;
739 case llvm::Triple::EABI:
740 ABIName = "aapcs";
741 break;
742 default:
743 ABIName = "apcs-gnu";
744 }
745 }
746 CmdArgs.push_back("-target-abi");
747 CmdArgs.push_back(ABIName);
748
749 // Set the CPU based on -march= and -mcpu=.
750 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000751 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752
753 // Determine floating point ABI from the options & target defaults.
754 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 if (FloatABI == "soft") {
756 // Floating point operations and argument passing are soft.
757 //
758 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000759 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000760 CmdArgs.push_back("-mfloat-abi");
761 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000762 } else if (FloatABI == "softfp") {
763 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000764 CmdArgs.push_back("-mfloat-abi");
765 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000766 } else {
767 // Floating point operations and argument passing are hard.
768 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000769 CmdArgs.push_back("-mfloat-abi");
770 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000771 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000772
773 // Set appropriate target features for floating point mode.
774 //
775 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
776 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
777 // stripped out by the ARM target.
778
779 // Use software floating point operations?
780 if (FloatABI == "soft") {
781 CmdArgs.push_back("-target-feature");
782 CmdArgs.push_back("+soft-float");
783 }
784
785 // Use software floating point argument passing?
786 if (FloatABI != "hard") {
787 CmdArgs.push_back("-target-feature");
788 CmdArgs.push_back("+soft-float-abi");
789 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000790
791 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000792 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000793 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000794
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000795 // Honor -mfpmath=.
796 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000797 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000798
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000799 // Setting -msoft-float effectively disables NEON because of the GCC
800 // implementation, although the same isn't true of VFP or VFP3.
801 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000802 CmdArgs.push_back("-target-feature");
803 CmdArgs.push_back("-neon");
804 }
805
806 // Kernel code has more strict alignment requirements.
807 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000808 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
809 CmdArgs.push_back("-backend-option");
810 CmdArgs.push_back("-arm-long-calls");
811 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000812
Daniel Dunbar12100e22011-03-22 16:48:17 +0000813 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000814 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000815
816 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000817 CmdArgs.push_back("-backend-option");
818 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000819 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000820
821 // Setting -mno-global-merge disables the codegen global merge pass. Setting
822 // -mglobal-merge has no effect as the pass is enabled by default.
823 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
824 options::OPT_mno_global_merge)) {
825 if (A->getOption().matches(options::OPT_mno_global_merge))
826 CmdArgs.push_back("-mno-global-merge");
827 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000828
Chad Rosierc14ded72012-05-16 21:19:55 +0000829 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000830 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000831}
832
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000833// Translate MIPS CPU name alias option to CPU name.
834static StringRef getMipsCPUFromAlias(const Arg &A) {
835 if (A.getOption().matches(options::OPT_mips32))
836 return "mips32";
837 if (A.getOption().matches(options::OPT_mips32r2))
838 return "mips32r2";
839 if (A.getOption().matches(options::OPT_mips64))
840 return "mips64";
841 if (A.getOption().matches(options::OPT_mips64r2))
842 return "mips64r2";
843 llvm_unreachable("Unexpected option");
844 return "";
845}
846
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000847// Get CPU and ABI names. They are not independent
848// so we have to calculate them together.
849static void getMipsCPUAndABI(const ArgList &Args,
850 const ToolChain &TC,
851 StringRef &CPUName,
852 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000853 const char *DefMips32CPU = "mips32";
854 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000855
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000856 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000857 options::OPT_mcpu_EQ,
858 options::OPT_mips_CPUs_Group)) {
859 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
860 CPUName = getMipsCPUFromAlias(*A);
861 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000862 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000863 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000864
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000865 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +0000866 ABIName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000867
868 // Setup default CPU and ABI names.
869 if (CPUName.empty() && ABIName.empty()) {
870 switch (TC.getTriple().getArch()) {
871 default:
872 llvm_unreachable("Unexpected triple arch name");
873 case llvm::Triple::mips:
874 case llvm::Triple::mipsel:
875 CPUName = DefMips32CPU;
876 break;
877 case llvm::Triple::mips64:
878 case llvm::Triple::mips64el:
879 CPUName = DefMips64CPU;
880 break;
881 }
882 }
883
884 if (!ABIName.empty()) {
885 // Deduce CPU name from ABI name.
886 CPUName = llvm::StringSwitch<const char *>(ABIName)
887 .Cases("o32", "eabi", DefMips32CPU)
888 .Cases("n32", "n64", DefMips64CPU)
889 .Default("");
890 }
891 else if (!CPUName.empty()) {
892 // Deduce ABI name from CPU name.
893 ABIName = llvm::StringSwitch<const char *>(CPUName)
894 .Cases("mips32", "mips32r2", "o32")
895 .Cases("mips64", "mips64r2", "n64")
896 .Default("");
897 }
898
899 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000900}
901
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000902// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
903// and -mfloat-abi=.
904static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000905 // Select the float ABI as determined by -msoft-float, -mhard-float,
906 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000907 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000908 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000909 options::OPT_mhard_float,
910 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000911 if (A->getOption().matches(options::OPT_msoft_float))
912 FloatABI = "soft";
913 else if (A->getOption().matches(options::OPT_mhard_float))
914 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000916 FloatABI = A->getValue();
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000917 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000918 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000919 FloatABI = "hard";
920 }
921 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000922 }
923
924 // If unspecified, choose the default based on the platform.
925 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000926 // Assume "hard", because it's a default value used by gcc.
927 // When we start to recognize specific target MIPS processors,
928 // we will be able to select the default more correctly.
929 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000930 }
931
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000932 return FloatABI;
933}
934
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000935static void AddTargetFeature(const ArgList &Args,
936 ArgStringList &CmdArgs,
937 OptSpecifier OnOpt,
938 OptSpecifier OffOpt,
939 StringRef FeatureName) {
940 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
941 CmdArgs.push_back("-target-feature");
942 if (A->getOption().matches(OnOpt))
943 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
944 else
945 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
946 }
947}
948
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000949void Clang::AddMIPSTargetArgs(const ArgList &Args,
950 ArgStringList &CmdArgs) const {
951 const Driver &D = getToolChain().getDriver();
952 StringRef CPUName;
953 StringRef ABIName;
954 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
955
956 CmdArgs.push_back("-target-cpu");
957 CmdArgs.push_back(CPUName.data());
958
959 CmdArgs.push_back("-target-abi");
960 CmdArgs.push_back(ABIName.data());
961
962 StringRef FloatABI = getMipsFloatABI(D, Args);
963
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000964 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
965
966 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000967 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000968 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000969 CmdArgs.push_back("-mfloat-abi");
970 CmdArgs.push_back("soft");
971
972 // FIXME: Note, this is a hack. We need to pass the selected float
973 // mode to the MipsTargetInfoBase to define appropriate macros there.
974 // Now it is the only method.
975 CmdArgs.push_back("-target-feature");
976 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000977
978 if (FloatABI == "hard" && IsMips16) {
979 CmdArgs.push_back("-mllvm");
980 CmdArgs.push_back("-mips16-hard-float");
981 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000982 }
983 else if (FloatABI == "single") {
984 // Restrict the use of hardware floating-point
985 // instructions to 32-bit operations.
986 CmdArgs.push_back("-target-feature");
987 CmdArgs.push_back("+single-float");
988 }
989 else {
990 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000991 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000992 CmdArgs.push_back("-mfloat-abi");
993 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000994 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000995
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000996 AddTargetFeature(Args, CmdArgs,
997 options::OPT_mips16, options::OPT_mno_mips16,
998 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000999 AddTargetFeature(Args, CmdArgs,
1000 options::OPT_mdsp, options::OPT_mno_dsp,
1001 "dsp");
1002 AddTargetFeature(Args, CmdArgs,
1003 options::OPT_mdspr2, options::OPT_mno_dspr2,
1004 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001005
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001006 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1007 if (A->getOption().matches(options::OPT_mxgot)) {
1008 CmdArgs.push_back("-mllvm");
1009 CmdArgs.push_back("-mxgot");
1010 }
1011 }
1012
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001013 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001014 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001015 CmdArgs.push_back("-mllvm");
1016 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1017 A->claim();
1018 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001019}
1020
Hal Finkel8eb59282012-06-11 22:35:19 +00001021/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1022static std::string getPPCTargetCPU(const ArgList &Args) {
1023 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001025
1026 if (CPUName == "native") {
1027 std::string CPU = llvm::sys::getHostCPUName();
1028 if (!CPU.empty() && CPU != "generic")
1029 return CPU;
1030 else
1031 return "";
1032 }
1033
1034 return llvm::StringSwitch<const char *>(CPUName)
1035 .Case("common", "generic")
1036 .Case("440", "440")
1037 .Case("440fp", "440")
1038 .Case("450", "450")
1039 .Case("601", "601")
1040 .Case("602", "602")
1041 .Case("603", "603")
1042 .Case("603e", "603e")
1043 .Case("603ev", "603ev")
1044 .Case("604", "604")
1045 .Case("604e", "604e")
1046 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001047 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001048 .Case("G3", "g3")
1049 .Case("7400", "7400")
1050 .Case("G4", "g4")
1051 .Case("7450", "7450")
1052 .Case("G4+", "g4+")
1053 .Case("750", "750")
1054 .Case("970", "970")
1055 .Case("G5", "g5")
1056 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001057 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001058 .Case("e500mc", "e500mc")
1059 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001060 .Case("power3", "pwr3")
1061 .Case("power4", "pwr4")
1062 .Case("power5", "pwr5")
1063 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001064 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001065 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001066 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001067 .Case("pwr3", "pwr3")
1068 .Case("pwr4", "pwr4")
1069 .Case("pwr5", "pwr5")
1070 .Case("pwr5x", "pwr5x")
1071 .Case("pwr6", "pwr6")
1072 .Case("pwr6x", "pwr6x")
1073 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001074 .Case("powerpc", "ppc")
1075 .Case("powerpc64", "ppc64")
1076 .Default("");
1077 }
1078
1079 return "";
1080}
1081
1082void Clang::AddPPCTargetArgs(const ArgList &Args,
1083 ArgStringList &CmdArgs) const {
1084 std::string TargetCPUName = getPPCTargetCPU(Args);
1085
1086 // LLVM may default to generating code for the native CPU,
1087 // but, like gcc, we default to a more generic option for
1088 // each architecture. (except on Darwin)
1089 llvm::Triple Triple = getToolChain().getTriple();
1090 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1091 if (Triple.getArch() == llvm::Triple::ppc64)
1092 TargetCPUName = "ppc64";
1093 else
1094 TargetCPUName = "ppc";
1095 }
1096
1097 if (!TargetCPUName.empty()) {
1098 CmdArgs.push_back("-target-cpu");
1099 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1100 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001101
1102 // Allow override of the Altivec feature.
1103 if (Args.hasFlag(options::OPT_fno_altivec, options::OPT_faltivec, false)) {
1104 CmdArgs.push_back("-target-feature");
1105 CmdArgs.push_back("-altivec");
1106 }
Hal Finkelb58ce852013-02-01 18:44:19 +00001107
1108 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1109 CmdArgs.push_back("-target-feature");
1110 CmdArgs.push_back("-qpx");
1111 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001112}
1113
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001114void Clang::AddSparcTargetArgs(const ArgList &Args,
1115 ArgStringList &CmdArgs) const {
1116 const Driver &D = getToolChain().getDriver();
1117
1118 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001119 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001120 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001121 }
1122
1123 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001124 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001125 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1126 options::OPT_mhard_float)) {
1127 if (A->getOption().matches(options::OPT_msoft_float))
1128 FloatABI = "soft";
1129 else if (A->getOption().matches(options::OPT_mhard_float))
1130 FloatABI = "hard";
1131 }
1132
1133 // If unspecified, choose the default based on the platform.
1134 if (FloatABI.empty()) {
1135 switch (getToolChain().getTriple().getOS()) {
1136 default:
1137 // Assume "soft", but warn the user we are guessing.
1138 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001139 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001140 break;
1141 }
1142 }
1143
1144 if (FloatABI == "soft") {
1145 // Floating point operations and argument passing are soft.
1146 //
1147 // FIXME: This changes CPP defines, we need -target-soft-float.
1148 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001149 CmdArgs.push_back("-target-feature");
1150 CmdArgs.push_back("+soft-float");
1151 } else {
1152 assert(FloatABI == "hard" && "Invalid float abi!");
1153 CmdArgs.push_back("-mhard-float");
1154 }
1155}
1156
Chandler Carruth953fb082013-01-13 11:46:33 +00001157static const char *getX86TargetCPU(const ArgList &Args,
1158 const llvm::Triple &Triple) {
1159 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1160 if (StringRef(A->getValue()) != "native")
1161 return A->getValue();
1162
1163 // FIXME: Reject attempts to use -march=native unless the target matches
1164 // the host.
1165 //
1166 // FIXME: We should also incorporate the detected target features for use
1167 // with -native.
1168 std::string CPU = llvm::sys::getHostCPUName();
1169 if (!CPU.empty() && CPU != "generic")
1170 return Args.MakeArgString(CPU);
1171 }
1172
1173 // Select the default CPU if none was given (or detection failed).
1174
1175 if (Triple.getArch() != llvm::Triple::x86_64 &&
1176 Triple.getArch() != llvm::Triple::x86)
1177 return 0; // This routine is only handling x86 targets.
1178
1179 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1180
1181 // FIXME: Need target hooks.
1182 if (Triple.isOSDarwin())
1183 return Is64Bit ? "core2" : "yonah";
1184
1185 // Everything else goes to x86-64 in 64-bit mode.
1186 if (Is64Bit)
1187 return "x86-64";
1188
1189 if (Triple.getOSName().startswith("haiku"))
1190 return "i586";
1191 if (Triple.getOSName().startswith("openbsd"))
1192 return "i486";
1193 if (Triple.getOSName().startswith("bitrig"))
1194 return "i686";
1195 if (Triple.getOSName().startswith("freebsd"))
1196 return "i486";
1197 if (Triple.getOSName().startswith("netbsd"))
1198 return "i486";
1199 // All x86 devices running Android have core2 as their common
1200 // denominator. This makes a better choice than pentium4.
1201 if (Triple.getEnvironment() == llvm::Triple::Android)
1202 return "core2";
1203
1204 // Fallback to p4.
1205 return "pentium4";
1206}
1207
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001208void Clang::AddX86TargetArgs(const ArgList &Args,
1209 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001210 if (!Args.hasFlag(options::OPT_mred_zone,
1211 options::OPT_mno_red_zone,
1212 true) ||
1213 Args.hasArg(options::OPT_mkernel) ||
1214 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001215 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001216
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001217 if (Args.hasFlag(options::OPT_msoft_float,
1218 options::OPT_mno_soft_float,
1219 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001220 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001221
Chandler Carruth953fb082013-01-13 11:46:33 +00001222 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001223 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001224 CmdArgs.push_back(CPUName);
1225 }
1226
Eli Friedmanad811f02011-07-02 00:34:19 +00001227 // The required algorithm here is slightly strange: the options are applied
1228 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1229 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1230 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1231 // former correctly, but not the latter; handle directly-overridden
1232 // attributes here.
1233 llvm::StringMap<unsigned> PrevFeature;
1234 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001235 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1236 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001237 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001238 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001239
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001240 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001241 assert(Name.startswith("m") && "Invalid feature name.");
1242 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001243
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001244 bool IsNegative = Name.startswith("no-");
1245 if (IsNegative)
1246 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001247
Eli Friedmanad811f02011-07-02 00:34:19 +00001248 unsigned& Prev = PrevFeature[Name];
1249 if (Prev)
1250 Features[Prev - 1] = 0;
1251 Prev = Features.size() + 1;
1252 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1253 }
1254 for (unsigned i = 0; i < Features.size(); i++) {
1255 if (Features[i]) {
1256 CmdArgs.push_back("-target-feature");
1257 CmdArgs.push_back(Features[i]);
1258 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001259 }
1260}
1261
Matthew Curtise8f80a12012-12-06 17:49:03 +00001262static inline bool HasPICArg(const ArgList &Args) {
1263 return Args.hasArg(options::OPT_fPIC)
1264 || Args.hasArg(options::OPT_fpic);
1265}
1266
1267static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1268 return Args.getLastArg(options::OPT_G,
1269 options::OPT_G_EQ,
1270 options::OPT_msmall_data_threshold_EQ);
1271}
1272
1273static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1274 std::string value;
1275 if (HasPICArg(Args))
1276 value = "0";
1277 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1278 value = A->getValue();
1279 A->claim();
1280 }
1281 return value;
1282}
1283
Tony Linthicum76329bf2011-12-12 21:14:55 +00001284void Clang::AddHexagonTargetArgs(const ArgList &Args,
1285 ArgStringList &CmdArgs) const {
1286 llvm::Triple Triple = getToolChain().getTriple();
1287
1288 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001289 CmdArgs.push_back(Args.MakeArgString(
1290 "hexagon"
1291 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001292 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001293 CmdArgs.push_back("-mqdsp6-compat");
1294 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001295
Matthew Curtise8f80a12012-12-06 17:49:03 +00001296 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1297 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001298 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001299 CmdArgs.push_back(Args.MakeArgString(
1300 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001301 }
1302
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001303 if (!Args.hasArg(options::OPT_fno_short_enums))
1304 CmdArgs.push_back("-fshort-enums");
1305 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1306 CmdArgs.push_back ("-mllvm");
1307 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1308 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001309 CmdArgs.push_back ("-mllvm");
1310 CmdArgs.push_back ("-machine-sink-split=0");
1311}
1312
Eric Christopher84fbdb42011-08-19 00:30:14 +00001313static bool
John McCall5fb5df92012-06-20 06:18:46 +00001314shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001315 const llvm::Triple &Triple) {
1316 // We use the zero-cost exception tables for Objective-C if the non-fragile
1317 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1318 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001319 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001320 return true;
1321
Bob Wilson6524dd32011-10-14 05:03:44 +00001322 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001323 return false;
1324
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001325 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001326 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001327 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001328}
1329
Anders Carlssone96ab552011-02-28 02:27:16 +00001330/// addExceptionArgs - Adds exception related arguments to the driver command
1331/// arguments. There's a master flag, -fexceptions and also language specific
1332/// flags to enable/disable C++ and Objective-C exceptions.
1333/// This makes it possible to for example disable C++ exceptions but enable
1334/// Objective-C exceptions.
1335static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1336 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001337 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001338 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001339 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001340 if (KernelOrKext) {
1341 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1342 // arguments now to avoid warnings about unused arguments.
1343 Args.ClaimAllArgs(options::OPT_fexceptions);
1344 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1345 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1346 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1347 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1348 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001349 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001350 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001351
1352 // Exceptions are enabled by default.
1353 bool ExceptionsEnabled = true;
1354
1355 // This keeps track of whether exceptions were explicitly turned on or off.
1356 bool DidHaveExplicitExceptionFlag = false;
1357
Rafael Espindola00a66572009-10-01 13:33:33 +00001358 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1359 options::OPT_fno_exceptions)) {
1360 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001361 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001362 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001363 ExceptionsEnabled = false;
1364
1365 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001366 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001367
Anders Carlssone96ab552011-02-28 02:27:16 +00001368 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001369
Anders Carlssone96ab552011-02-28 02:27:16 +00001370 // Exception tables and cleanups can be enabled with -fexceptions even if the
1371 // language itself doesn't support exceptions.
1372 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1373 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001374
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001375 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1376 // is not necessarily sensible, but follows GCC.
1377 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001378 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001379 options::OPT_fno_objc_exceptions,
1380 true)) {
1381 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001382
Eric Christopher84fbdb42011-08-19 00:30:14 +00001383 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001384 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001385 }
1386
1387 if (types::isCXX(InputType)) {
1388 bool CXXExceptionsEnabled = ExceptionsEnabled;
1389
Eric Christopher84fbdb42011-08-19 00:30:14 +00001390 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1391 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001392 options::OPT_fexceptions,
1393 options::OPT_fno_exceptions)) {
1394 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1395 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001396 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001397 CXXExceptionsEnabled = false;
1398 }
1399
1400 if (CXXExceptionsEnabled) {
1401 CmdArgs.push_back("-fcxx-exceptions");
1402
1403 ShouldUseExceptionTables = true;
1404 }
1405 }
1406
1407 if (ShouldUseExceptionTables)
1408 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001409}
1410
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001411static bool ShouldDisableCFI(const ArgList &Args,
1412 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001413 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001414 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001415 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001416 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001417 Default = Args.hasFlag(options::OPT_integrated_as,
Eric Christopher45f2e712012-12-18 00:31:10 +00001418 options::OPT_no_integrated_as,
1419 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001420 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001421 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001422 options::OPT_fno_dwarf2_cfi_asm,
1423 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001424}
1425
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001426static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1427 const ToolChain &TC) {
1428 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1429 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1430 options::OPT_no_integrated_as,
1431 IsIADefault);
1432 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1433 options::OPT_fno_dwarf_directory_asm,
1434 UseIntegratedAs);
1435 return !UseDwarfDirectory;
1436}
1437
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001438/// \brief Check whether the given input tree contains any compilation actions.
1439static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001440 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001441 return true;
1442
1443 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1444 if (ContainsCompileAction(*it))
1445 return true;
1446
1447 return false;
1448}
1449
1450/// \brief Check if -relax-all should be passed to the internal assembler.
1451/// This is done by default when compiling non-assembler source with -O0.
1452static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1453 bool RelaxDefault = true;
1454
1455 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1456 RelaxDefault = A->getOption().matches(options::OPT_O0);
1457
1458 if (RelaxDefault) {
1459 RelaxDefault = false;
1460 for (ActionList::const_iterator it = C.getActions().begin(),
1461 ie = C.getActions().end(); it != ie; ++it) {
1462 if (ContainsCompileAction(*it)) {
1463 RelaxDefault = true;
1464 break;
1465 }
1466 }
1467 }
1468
1469 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1470 RelaxDefault);
1471}
1472
Alexey Samsonovf7a24762013-01-16 11:34:36 +00001473SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001474 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1475 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001476 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1477 // at least once (possibly, disabled further).
Richard Smith52be6192012-11-05 22:04:41 +00001478 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001479 unsigned Add, Remove;
1480 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001481 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001482 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001483 Kind |= Add;
1484 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001485 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001486 }
1487
Chad Rosierae229d52013-01-29 23:31:22 +00001488 UbsanTrapOnError =
1489 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1490 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1491 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1492
1493 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1494 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1495 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1496 D.Diag(diag::err_drv_argument_not_allowed_with)
1497 << "-fcatch-undefined-behavior"
1498 << "-fno-sanitize-undefined-trap-on-error";
1499 }
1500
1501 // Warn about undefined sanitizer options that require runtime support.
1502 if (UbsanTrapOnError && notAllowedWithTrap()) {
1503 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1504 D.Diag(diag::err_drv_argument_not_allowed_with)
1505 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1506 << "-fcatch-undefined-behavior";
1507 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1508 options::OPT_fno_sanitize_undefined_trap_on_error,
1509 false))
1510 D.Diag(diag::err_drv_argument_not_allowed_with)
1511 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1512 << "-fsanitize-undefined-trap-on-error";
1513 }
1514
Richard Smith52be6192012-11-05 22:04:41 +00001515 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001516 bool NeedsAsan = needsAsanRt();
1517 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001518 bool NeedsMsan = needsMsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001519 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001520 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001521 << lastArgumentForKind(D, Args, NeedsAsanRt)
1522 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001523 if (NeedsAsan && NeedsMsan)
1524 D.Diag(diag::err_drv_argument_not_allowed_with)
1525 << lastArgumentForKind(D, Args, NeedsAsanRt)
1526 << lastArgumentForKind(D, Args, NeedsMsanRt);
1527 if (NeedsTsan && NeedsMsan)
1528 D.Diag(diag::err_drv_argument_not_allowed_with)
1529 << lastArgumentForKind(D, Args, NeedsTsanRt)
1530 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001531
1532 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001533 // explicitly contain -fsanitize=address (probably, turned off later in the
1534 // command line).
1535 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1536 D.Diag(diag::warn_drv_unused_sanitizer)
1537 << lastArgumentForKind(D, Args, AddressFull)
1538 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001539
1540 // Parse -f(no-)sanitize-blacklist options.
1541 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1542 options::OPT_fno_sanitize_blacklist)) {
1543 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1544 std::string BLPath = BLArg->getValue();
1545 bool BLExists = false;
1546 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1547 BlacklistFile = BLPath;
1548 else
1549 D.Diag(diag::err_drv_no_such_file) << BLPath;
1550 }
1551 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001552
1553 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001554 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001555 MsanTrackOrigins =
1556 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1557 options::OPT_fno_sanitize_memory_track_origins,
1558 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001559
1560 // Parse -f(no-)sanitize-address-zero-base-shadow options.
1561 if (NeedsAsan)
1562 AsanZeroBaseShadow =
1563 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1564 options::OPT_fno_sanitize_address_zero_base_shadow,
1565 /* Default */false);
Richard Smith52be6192012-11-05 22:04:41 +00001566}
1567
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001568/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1569/// This needs to be called before we add the C run-time (malloc, etc).
1570static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001571 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001572 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001573 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001574 if (!Args.hasArg(options::OPT_pie))
1575 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001576 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001577
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001578 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1579 llvm::sys::path::append(LibAsan, "lib", "linux",
1580 (Twine("libclang_rt.asan-") +
1581 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001582 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001583 } else {
1584 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov29524a92013-01-20 13:12:12 +00001585 bool ZeroBaseShadow = Args.hasFlag(
1586 options::OPT_fsanitize_address_zero_base_shadow,
1587 options::OPT_fno_sanitize_address_zero_base_shadow, false);
1588 if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) {
1589 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1590 "-fsanitize-address-zero-base-shadow" << "-pie";
1591 }
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001592 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1593 // resource directory.
1594 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1595 llvm::sys::path::append(LibAsan, "lib", "linux",
1596 (Twine("libclang_rt.asan-") +
1597 TC.getArchName() + ".a"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001598 // The ASan runtime needs to come before -lstdc++ (or -lc++, libstdc++.a,
1599 // etc.) so that the linker picks ASan's versions of the global 'operator
1600 // new' and 'operator delete' symbols. We take the extreme (but simple)
Chandler Carruth210c77b2012-12-04 22:54:37 +00001601 // strategy of inserting it at the front of the link command. It also
1602 // needs to be forced to end up in the executable, so wrap it in
1603 // whole-archive.
1604 SmallVector<const char*, 3> PrefixArgs;
1605 PrefixArgs.push_back("-whole-archive");
1606 PrefixArgs.push_back(Args.MakeArgString(LibAsan));
1607 PrefixArgs.push_back("-no-whole-archive");
1608 CmdArgs.insert(CmdArgs.begin(), PrefixArgs.begin(), PrefixArgs.end());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001609 CmdArgs.push_back("-lpthread");
1610 CmdArgs.push_back("-ldl");
1611 CmdArgs.push_back("-export-dynamic");
1612 }
1613 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001614}
1615
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001616/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1617/// This needs to be called before we add the C run-time (malloc, etc).
1618static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1619 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001620 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001621 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001622 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1623 "-fsanitize=thread" << "-pie";
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001624 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1625 // resource directory.
1626 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1627 llvm::sys::path::append(LibTsan, "lib", "linux",
1628 (Twine("libclang_rt.tsan-") +
1629 TC.getArchName() + ".a"));
1630 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1631 CmdArgs.push_back("-lpthread");
1632 CmdArgs.push_back("-ldl");
1633 CmdArgs.push_back("-export-dynamic");
1634 }
1635}
1636
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001637/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1638/// This needs to be called before we add the C run-time (malloc, etc).
1639static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1640 ArgStringList &CmdArgs) {
1641 if (!Args.hasArg(options::OPT_shared)) {
1642 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001643 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1644 "-fsanitize=memory" << "-pie";
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001645 // LibMsan is "libclang_rt.msan-<ArchName>.a" in the Linux library
1646 // resource directory.
1647 SmallString<128> LibMsan(TC.getDriver().ResourceDir);
1648 llvm::sys::path::append(LibMsan, "lib", "linux",
1649 (Twine("libclang_rt.msan-") +
1650 TC.getArchName() + ".a"));
1651 CmdArgs.push_back(Args.MakeArgString(LibMsan));
1652 CmdArgs.push_back("-lpthread");
1653 CmdArgs.push_back("-ldl");
1654 CmdArgs.push_back("-export-dynamic");
1655 }
1656}
1657
Richard Smithe30752c2012-10-09 19:52:38 +00001658/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1659/// (Linux).
1660static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1661 ArgStringList &CmdArgs) {
Richard Smithf75c8b32013-01-18 22:09:26 +00001662 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1663 // resource directory.
1664 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1665 llvm::sys::path::append(LibUbsan, "lib", "linux",
1666 (Twine("libclang_rt.ubsan-") +
1667 TC.getArchName() + ".a"));
1668 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
1669 CmdArgs.push_back("-lpthread");
1670 CmdArgs.push_back("-export-dynamic");
Richard Smithe30752c2012-10-09 19:52:38 +00001671}
1672
Rafael Espindola224dd632011-12-14 21:02:23 +00001673static bool shouldUseFramePointer(const ArgList &Args,
1674 const llvm::Triple &Triple) {
1675 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1676 options::OPT_fomit_frame_pointer))
1677 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1678
Rafael Espindola00b29182011-12-14 21:50:24 +00001679 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001680 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1681 Triple.getArch() == llvm::Triple::x86) &&
1682 Triple.getOS() == llvm::Triple::Linux) {
1683 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1684 if (!A->getOption().matches(options::OPT_O0))
1685 return false;
1686 }
1687
1688 return true;
1689}
1690
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001691/// If the PWD environment variable is set, add a CC1 option to specify the
1692/// debug compilation directory.
1693static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1694 if (const char *pwd = ::getenv("PWD")) {
1695 // GCC also verifies that stat(pwd) and stat(".") have the same inode
1696 // number. Not doing those because stats are slow, but we could.
1697 if (llvm::sys::path::is_absolute(pwd)) {
1698 std::string CompDir = pwd;
1699 CmdArgs.push_back("-fdebug-compilation-dir");
1700 CmdArgs.push_back(Args.MakeArgString(CompDir));
1701 }
1702 }
1703}
1704
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001705void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001706 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001707 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001708 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001709 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001710 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1711 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001712 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001713 ArgStringList CmdArgs;
1714
Daniel Dunbare521a892009-03-31 20:53:55 +00001715 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1716
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001717 // Invoke ourselves in -cc1 mode.
1718 //
1719 // FIXME: Implement custom jobs for internal actions.
1720 CmdArgs.push_back("-cc1");
1721
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001722 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001723 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001724 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001725 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001726
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001727 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001728 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001729
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001730 if (isa<AnalyzeJobAction>(JA)) {
1731 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1732 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001733 } else if (isa<MigrateJobAction>(JA)) {
1734 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001735 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001736 if (Output.getType() == types::TY_Dependencies)
1737 CmdArgs.push_back("-Eonly");
1738 else
1739 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001740 } else if (isa<AssembleJobAction>(JA)) {
1741 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001742
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001743 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001744 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001745
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001746 // When using an integrated assembler, translate -Wa, and -Xassembler
1747 // options.
1748 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1749 options::OPT_Xassembler),
1750 ie = Args.filtered_end(); it != ie; ++it) {
1751 const Arg *A = *it;
1752 A->claim();
1753
1754 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001755 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001756
1757 if (Value == "-force_cpusubtype_ALL") {
1758 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001759 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001760 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001761 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001762 CmdArgs.push_back("-mllvm");
1763 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001764 } else if (Value == "--noexecstack") {
1765 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001766 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001767 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001768 << A->getOption().getName() << Value;
1769 }
1770 }
1771 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001772
1773 // Also ignore explicit -force_cpusubtype_ALL option.
1774 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001775 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001776 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001777 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001778
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001779 if (JA.getType() == types::TY_Nothing)
1780 CmdArgs.push_back("-fsyntax-only");
1781 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001782 CmdArgs.push_back("-emit-pch");
1783 else
1784 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001785 } else {
1786 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001787
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001788 if (JA.getType() == types::TY_Nothing) {
1789 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001790 } else if (JA.getType() == types::TY_LLVM_IR ||
1791 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001792 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001793 } else if (JA.getType() == types::TY_LLVM_BC ||
1794 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001795 CmdArgs.push_back("-emit-llvm-bc");
1796 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001797 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001798 } else if (JA.getType() == types::TY_AST) {
1799 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001800 } else if (JA.getType() == types::TY_RewrittenObjC) {
1801 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001802 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001803 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1804 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001805 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001806 } else {
1807 assert(JA.getType() == types::TY_PP_Asm &&
1808 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001809 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001810 }
1811
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001812 // The make clang go fast button.
1813 CmdArgs.push_back("-disable-free");
1814
John McCallbb79b5f2010-02-13 03:50:24 +00001815 // Disable the verification pass in -asserts builds.
1816#ifdef NDEBUG
1817 CmdArgs.push_back("-disable-llvm-verifier");
1818#endif
1819
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001820 // Set the main file name, so that debug info works even with
1821 // -save-temps.
1822 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001823 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001824
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001825 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001826 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001827 if (Args.hasArg(options::OPT_static))
1828 CmdArgs.push_back("-static-define");
1829
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001830 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001831 // Enable region store model by default.
1832 CmdArgs.push_back("-analyzer-store=region");
1833
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001834 // Treat blocks as analysis entry points.
1835 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1836
Ted Kremenek49c79792011-03-24 00:28:47 +00001837 CmdArgs.push_back("-analyzer-eagerly-assume");
1838
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001839 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001840 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001841 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001842
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001843 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1844 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001845
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001846 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001847 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001848
1849 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001850
1851 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001852 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1853 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1854 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1855 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1856 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1857 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001858 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001859
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001860 // Set the output format. The default is plist, for (lame) historical
1861 // reasons.
1862 CmdArgs.push_back("-analyzer-output");
1863 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001864 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001865 else
1866 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001867
Ted Kremenekfe449a22010-03-22 22:32:05 +00001868 // Disable the presentation of standard compiler warnings when
1869 // using --analyze. We only want to show static analyzer diagnostics
1870 // or frontend errors.
1871 CmdArgs.push_back("-w");
1872
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001873 // Add -Xanalyzer arguments when running as analyzer.
1874 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001875 }
1876
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001877 CheckCodeGenerationOptions(D, Args);
1878
Chandler Carruth76a943b2012-11-19 03:52:03 +00001879 // For the PIC and PIE flag options, this logic is different from the legacy
1880 // logic in very old versions of GCC, as that logic was just a bug no one had
1881 // ever fixed. This logic is both more rational and consistent with GCC's new
1882 // logic now that the bugs are fixed. The last argument relating to either
1883 // PIC or PIE wins, and no other argument is used. If the last argument is
1884 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1885 // PIE option implicitly enables PIC at the same level.
1886 bool PIE = false;
1887 bool PIC = getToolChain().isPICDefault();
1888 bool IsPICLevelTwo = PIC;
1889 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1890 options::OPT_fpic, options::OPT_fno_pic,
1891 options::OPT_fPIE, options::OPT_fno_PIE,
1892 options::OPT_fpie, options::OPT_fno_pie)) {
1893 Option O = A->getOption();
1894 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1895 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1896 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1897 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1898 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1899 O.matches(options::OPT_fPIC);
1900 } else {
1901 PIE = PIC = false;
1902 }
Benjamin Kramer76db2902012-11-13 15:32:35 +00001903 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001904 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1905 // is forced, then neither PIC nor PIE flags will have no effect.
1906 if (getToolChain().isPICDefaultForced()) {
1907 PIE = false;
1908 PIC = getToolChain().isPICDefault();
1909 IsPICLevelTwo = PIC;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001910 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001911
1912 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1913 // specified while enabling PIC enabled level 1 PIC, just force it back to
1914 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1915 // informal testing).
1916 if (PIC && getToolChain().getTriple().isOSDarwin())
1917 IsPICLevelTwo |= getToolChain().isPICDefault();
1918
Chandler Carruthc0c04552012-04-08 16:40:35 +00001919 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1920 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001921 llvm::Triple Triple(TripleStr);
1922 if ((Args.hasArg(options::OPT_mkernel) ||
1923 Args.hasArg(options::OPT_fapple_kext)) &&
1924 (Triple.getOS() != llvm::Triple::IOS ||
1925 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001926 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001927 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001928 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001929
Chandler Carruth76a943b2012-11-19 03:52:03 +00001930 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1931 // This is a very special mode. It trumps the other modes, almost no one
1932 // uses it, and it isn't even valid on any OS but Darwin.
1933 if (!getToolChain().getTriple().isOSDarwin())
1934 D.Diag(diag::err_drv_unsupported_opt_for_target)
1935 << A->getSpelling() << getToolChain().getTriple().str();
1936
1937 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
1938
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001939 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00001940 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001941
Chandler Carruth76a943b2012-11-19 03:52:03 +00001942 // Only a forced PIC mode can cause the actual compile to have PIC defines
1943 // etc., no flags are sufficient. This behavior was selected to closely
1944 // match that of llvm-gcc and Apple GCC before that.
1945 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
1946 CmdArgs.push_back("-pic-level");
1947 CmdArgs.push_back("2");
1948 }
1949 } else {
1950 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
1951 // handled in Clang's IRGen by the -pie-level flag.
1952 CmdArgs.push_back("-mrelocation-model");
1953 CmdArgs.push_back(PIC ? "pic" : "static");
1954
1955 if (PIC) {
1956 CmdArgs.push_back("-pic-level");
1957 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1958 if (PIE) {
1959 CmdArgs.push_back("-pie-level");
1960 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1961 }
1962 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001963 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001964
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001965 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1966 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001967 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001968
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001969 // LLVM Code Generator Options.
1970
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001971 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1972 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00001973 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001974 }
1975
Roman Divacky65b88cd2011-03-01 17:40:53 +00001976 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1977 CmdArgs.push_back("-mrtd");
1978
Rafael Espindola224dd632011-12-14 21:02:23 +00001979 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001980 CmdArgs.push_back("-mdisable-fp-elim");
1981 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1982 options::OPT_fno_zero_initialized_in_bss))
1983 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001984 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1985 options::OPT_fno_strict_aliasing,
1986 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001987 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001988 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1989 false))
1990 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001991 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1992 options::OPT_fno_optimize_sibling_calls))
1993 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001994
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001995 // Handle various floating point optimization flags, mapping them to the
1996 // appropriate LLVM code generation flags. The pattern for all of these is to
1997 // default off the codegen optimizations, and if any flag enables them and no
1998 // flag disables them after the flag enabling them, enable the codegen
1999 // optimization. This is complicated by several "umbrella" flags.
2000 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002001 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002002 options::OPT_ffinite_math_only,
2003 options::OPT_fno_finite_math_only,
2004 options::OPT_fhonor_infinities,
2005 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002006 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2007 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002008 A->getOption().getID() != options::OPT_fhonor_infinities)
2009 CmdArgs.push_back("-menable-no-infs");
2010 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002011 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002012 options::OPT_ffinite_math_only,
2013 options::OPT_fno_finite_math_only,
2014 options::OPT_fhonor_nans,
2015 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002016 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2017 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002018 A->getOption().getID() != options::OPT_fhonor_nans)
2019 CmdArgs.push_back("-menable-no-nans");
2020
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002021 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2022 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002023 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002024 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002025 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00002026 options::OPT_fno_math_errno))
2027 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2028 if (MathErrno)
2029 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002030
2031 // There are several flags which require disabling very specific
2032 // optimizations. Any of these being disabled forces us to turn off the
2033 // entire set of LLVM optimizations, so collect them through all the flag
2034 // madness.
2035 bool AssociativeMath = false;
2036 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002037 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002038 options::OPT_funsafe_math_optimizations,
2039 options::OPT_fno_unsafe_math_optimizations,
2040 options::OPT_fassociative_math,
2041 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002042 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2043 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002044 A->getOption().getID() != options::OPT_fno_associative_math)
2045 AssociativeMath = true;
2046 bool ReciprocalMath = false;
2047 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002048 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002049 options::OPT_funsafe_math_optimizations,
2050 options::OPT_fno_unsafe_math_optimizations,
2051 options::OPT_freciprocal_math,
2052 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002053 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2054 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002055 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2056 ReciprocalMath = true;
2057 bool SignedZeros = true;
2058 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002059 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002060 options::OPT_funsafe_math_optimizations,
2061 options::OPT_fno_unsafe_math_optimizations,
2062 options::OPT_fsigned_zeros,
2063 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002064 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2065 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002066 A->getOption().getID() != options::OPT_fsigned_zeros)
2067 SignedZeros = false;
2068 bool TrappingMath = true;
2069 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002070 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002071 options::OPT_funsafe_math_optimizations,
2072 options::OPT_fno_unsafe_math_optimizations,
2073 options::OPT_ftrapping_math,
2074 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002075 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2076 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002077 A->getOption().getID() != options::OPT_ftrapping_math)
2078 TrappingMath = false;
2079 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2080 !TrappingMath)
2081 CmdArgs.push_back("-menable-unsafe-fp-math");
2082
Lang Hamesaa53b932012-07-06 00:59:19 +00002083
2084 // Validate and pass through -fp-contract option.
2085 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002086 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002087 options::OPT_ffp_contract)) {
2088 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002089 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002090 if (Val == "fast" || Val == "on" || Val == "off") {
2091 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2092 } else {
2093 D.Diag(diag::err_drv_unsupported_option_argument)
2094 << A->getOption().getName() << Val;
2095 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002096 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002097 // If fast-math is set then set the fp-contract mode to fast.
2098 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2099 }
2100 }
2101
Bob Wilson6a039162012-07-19 03:52:53 +00002102 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2103 // and if we find them, tell the frontend to provide the appropriate
2104 // preprocessor macros. This is distinct from enabling any optimizations as
2105 // these options induce language changes which must survive serialization
2106 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002107 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2108 if (A->getOption().matches(options::OPT_ffast_math))
2109 CmdArgs.push_back("-ffast-math");
2110 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2111 if (A->getOption().matches(options::OPT_ffinite_math_only))
2112 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002113
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002114 // Decide whether to use verbose asm. Verbose assembly is the default on
2115 // toolchains which have the integrated assembler on by default.
2116 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2117 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002118 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002119 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002120 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002121
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002122 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2123 CmdArgs.push_back("-mdebug-pass");
2124 CmdArgs.push_back("Structure");
2125 }
2126 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2127 CmdArgs.push_back("-mdebug-pass");
2128 CmdArgs.push_back("Arguments");
2129 }
2130
John McCall8517abc2010-02-19 02:45:38 +00002131 // Enable -mconstructor-aliases except on darwin, where we have to
2132 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002133 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002134 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002135
John McCall7ef5cb32011-03-18 02:56:14 +00002136 // Darwin's kernel doesn't support guard variables; just die if we
2137 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002138 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002139 CmdArgs.push_back("-fforbid-guard-variables");
2140
Douglas Gregordbe39272011-02-01 15:15:22 +00002141 if (Args.hasArg(options::OPT_mms_bitfields)) {
2142 CmdArgs.push_back("-mms-bitfields");
2143 }
John McCall8517abc2010-02-19 02:45:38 +00002144
Daniel Dunbar306945d2009-09-16 06:17:29 +00002145 // This is a coarse approximation of what llvm-gcc actually does, both
2146 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2147 // complicated ways.
2148 bool AsynchronousUnwindTables =
2149 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2150 options::OPT_fno_asynchronous_unwind_tables,
2151 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002152 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002153 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2154 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002155 CmdArgs.push_back("-munwind-tables");
2156
Chandler Carruth05fb5852012-11-21 23:40:23 +00002157 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002158
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002159 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2160 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002161 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002162 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002163
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002164 // FIXME: Handle -mtune=.
2165 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002166
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002167 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002168 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002169 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002170 }
2171
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002172 // Add target specific cpu and features flags.
2173 switch(getToolChain().getTriple().getArch()) {
2174 default:
2175 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002176
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002177 case llvm::Triple::arm:
2178 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002179 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002180 break;
2181
Eric Christopher0b26a612010-03-02 02:41:08 +00002182 case llvm::Triple::mips:
2183 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002184 case llvm::Triple::mips64:
2185 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002186 AddMIPSTargetArgs(Args, CmdArgs);
2187 break;
2188
Hal Finkel8eb59282012-06-11 22:35:19 +00002189 case llvm::Triple::ppc:
2190 case llvm::Triple::ppc64:
2191 AddPPCTargetArgs(Args, CmdArgs);
2192 break;
2193
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002194 case llvm::Triple::sparc:
2195 AddSparcTargetArgs(Args, CmdArgs);
2196 break;
2197
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002198 case llvm::Triple::x86:
2199 case llvm::Triple::x86_64:
2200 AddX86TargetArgs(Args, CmdArgs);
2201 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002202
2203 case llvm::Triple::hexagon:
2204 AddHexagonTargetArgs(Args, CmdArgs);
2205 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002206 }
2207
Tony Linthicum76329bf2011-12-12 21:14:55 +00002208
2209
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002210 // Pass the linker version in use.
2211 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2212 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002213 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002214 }
2215
Nick Lewycky75033772011-02-02 06:43:03 +00002216 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002217 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002218 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002219 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002220 CmdArgs.push_back("-momit-leaf-frame-pointer");
2221
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002222 // Explicitly error on some things we know we don't support and can't just
2223 // ignore.
2224 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002225 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2226 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002227 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002228 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002229 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002230 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2231 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002232 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002233 << Unsupported->getOption().getName();
2234 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002235 }
2236
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002237 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002238 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002239 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002240 CmdArgs.push_back("-header-include-file");
2241 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2242 D.CCPrintHeadersFilename : "-");
2243 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002244 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002245 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002246
Chad Rosierbe10f982011-08-02 17:58:04 +00002247 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002248 CmdArgs.push_back("-diagnostic-log-file");
2249 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2250 D.CCLogDiagnosticsFilename : "-");
2251 }
2252
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002253 // Use the last option from "-g" group. "-gline-tables-only"
2254 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002255 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002256 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002257 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002258 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002259 else if (!A->getOption().matches(options::OPT_g0) &&
2260 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002261 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002262 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002263
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002264 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2265 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002266 if (Args.hasArg(options::OPT_gcolumn_info))
2267 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002268
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002269 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2270 // splitting and extraction.
2271 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
2272 CmdArgs.push_back("-g");
2273 CmdArgs.push_back("-backend-option");
2274 CmdArgs.push_back("-split-dwarf=Enable");
2275 }
2276
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002277 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2278 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2279
Chris Lattner3c77a352010-06-22 00:03:40 +00002280 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2281
Nick Lewycky207bce32011-04-21 23:44:07 +00002282 if (Args.hasArg(options::OPT_ftest_coverage) ||
2283 Args.hasArg(options::OPT_coverage))
2284 CmdArgs.push_back("-femit-coverage-notes");
2285 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2286 Args.hasArg(options::OPT_coverage))
2287 CmdArgs.push_back("-femit-coverage-data");
2288
Nick Lewycky480cb992011-05-04 20:46:58 +00002289 if (C.getArgs().hasArg(options::OPT_c) ||
2290 C.getArgs().hasArg(options::OPT_S)) {
2291 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002292 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002293 SmallString<128> absFilename(Output.getFilename());
2294 llvm::sys::fs::make_absolute(absFilename);
2295 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002296 }
2297 }
2298
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002299 // Pass options for controlling the default header search paths.
2300 if (Args.hasArg(options::OPT_nostdinc)) {
2301 CmdArgs.push_back("-nostdsysteminc");
2302 CmdArgs.push_back("-nobuiltininc");
2303 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002304 if (Args.hasArg(options::OPT_nostdlibinc))
2305 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002306 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2307 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2308 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002309
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002310 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002311 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002312 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002313
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002314 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2315
Ted Kremenekf7639e12012-03-06 20:06:33 +00002316 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002317 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002318 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002319 options::OPT_ccc_arcmt_modify,
2320 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002321 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002322 switch (A->getOption().getID()) {
2323 default:
2324 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002325 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002326 CmdArgs.push_back("-arcmt-check");
2327 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002328 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002329 CmdArgs.push_back("-arcmt-modify");
2330 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002331 case options::OPT_ccc_arcmt_migrate:
2332 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002333 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002334 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002335
2336 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2337 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002338 break;
John McCalld70fb982011-06-15 23:25:17 +00002339 }
2340 }
2341 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002342
Ted Kremenekf7639e12012-03-06 20:06:33 +00002343 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2344 if (ARCMTEnabled) {
2345 D.Diag(diag::err_drv_argument_not_allowed_with)
2346 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2347 }
2348 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002349 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002350
2351 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2352 options::OPT_objcmt_migrate_subscripting)) {
2353 // None specified, means enable them all.
2354 CmdArgs.push_back("-objcmt-migrate-literals");
2355 CmdArgs.push_back("-objcmt-migrate-subscripting");
2356 } else {
2357 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2358 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2359 }
2360 }
2361
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002362 // Add preprocessing options like -I, -D, etc. if we are using the
2363 // preprocessor.
2364 //
2365 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002366 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002367 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002368
Rafael Espindolaa7431922011-07-21 23:40:37 +00002369 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2370 // that "The compiler can only warn and ignore the option if not recognized".
2371 // When building with ccache, it will pass -D options to clang even on
2372 // preprocessed inputs and configure concludes that -fPIC is not supported.
2373 Args.ClaimAllArgs(options::OPT_D);
2374
Daniel Dunbar58f78332009-09-17 06:53:36 +00002375 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002376 // others.
2377 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002378 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002379 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002380 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002381 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002382 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002383 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002384 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002385 }
2386
Chad Rosier86b82082012-12-12 20:06:31 +00002387 // Don't warn about unused -flto. This can happen when we're preprocessing or
2388 // precompiling.
2389 Args.ClaimAllArgs(options::OPT_flto);
2390
Daniel Dunbar945577c2009-10-29 02:24:45 +00002391 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002392 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2393 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002394 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002395 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002396
2397 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2398 // (-ansi is equivalent to -std=c89).
2399 //
2400 // If a std is supplied, only add -trigraphs if it follows the
2401 // option.
2402 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2403 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002404 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002405 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002406 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002407 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002408 else
2409 Std->render(Args, CmdArgs);
2410
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002411 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2412 options::OPT_trigraphs))
2413 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002414 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002415 } else {
2416 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002417 //
2418 // FIXME: Clang doesn't correctly handle -std= when the input language
2419 // doesn't match. For the time being just ignore this for C++ inputs;
2420 // eventually we want to do all the standard defaulting here instead of
2421 // splitting it between the driver and clang -cc1.
2422 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002423 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2424 "-std=", /*Joined=*/true);
2425 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2426 CmdArgs.push_back("-std=c++11");
2427
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002428 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002429 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002430
Chandler Carruthb009b142011-04-23 06:30:43 +00002431 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2432 // '-fconst-strings'; this better indicates its actual behavior.
2433 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2434 false)) {
2435 // For perfect compatibility with GCC, we do this even in the presence of
2436 // '-w'. This flag names something other than a warning for GCC.
2437 CmdArgs.push_back("-fconst-strings");
2438 }
2439
Chandler Carruth61fbf622011-04-23 09:27:53 +00002440 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002441 // during C++ compilation, which it is by default. GCC keeps this define even
2442 // in the presence of '-w', match this behavior bug-for-bug.
2443 if (types::isCXX(InputType) &&
2444 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2445 true)) {
2446 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002447 }
2448
Chandler Carruthe0391482010-05-22 02:21:53 +00002449 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2450 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2451 if (Asm->getOption().matches(options::OPT_fasm))
2452 CmdArgs.push_back("-fgnu-keywords");
2453 else
2454 CmdArgs.push_back("-fno-gnu-keywords");
2455 }
2456
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002457 if (ShouldDisableCFI(Args, getToolChain()))
2458 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002459
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002460 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2461 CmdArgs.push_back("-fno-dwarf-directory-asm");
2462
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002463 // Add in -fdebug-compilation-dir if necessary.
2464 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002465
Richard Smith9a568822011-11-21 19:36:32 +00002466 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2467 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002468 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002469 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002470 }
2471
Richard Smith9a568822011-11-21 19:36:32 +00002472 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2473 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002474 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002475 }
2476
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002477 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2478 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002479 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002480 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002481 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2482 } else
2483 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002484 }
2485
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002486
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002487 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002488 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002489
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002490 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2491 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002492 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002493 }
David Chisnall5778fce2009-08-31 16:41:57 +00002494
Chris Lattnere23003d2010-01-09 21:54:33 +00002495 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2496 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002497 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002498 }
2499
Chris Lattnerb35583d2010-04-07 20:49:23 +00002500 CmdArgs.push_back("-ferror-limit");
2501 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002502 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002503 else
2504 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002505
Chandler Carrutha77a7272010-05-06 04:55:18 +00002506 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2507 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002508 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002509 }
2510
2511 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2512 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002513 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002514 }
2515
Richard Smithf6f003a2011-12-16 19:06:07 +00002516 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2517 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002518 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002519 }
2520
Daniel Dunbar2c978472009-11-04 06:24:47 +00002521 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002522 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002523 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002524 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002525 } else {
2526 // If -fmessage-length=N was not specified, determine whether this is a
2527 // terminal and, if so, implicitly define -fmessage-length appropriately.
2528 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002529 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002530 }
2531
Daniel Dunbare357d562009-12-03 18:42:11 +00002532 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2533 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002534 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002535 }
2536
Douglas Gregor08329632010-06-15 17:05:35 +00002537 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002538
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002539 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2540
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002541 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002542 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2543 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002544 CmdArgs.push_back("-ffreestanding");
2545
Daniel Dunbare357d562009-12-03 18:42:11 +00002546 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002547 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002548 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002549 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002550 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002551 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002552 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002553 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2554 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002555
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002556 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002557 Sanitize.addArgs(Args, CmdArgs);
2558
Will Dietz3676d562012-12-30 20:53:28 +00002559 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2560 options::OPT_fno_sanitize_recover,
2561 true))
2562 CmdArgs.push_back("-fno-sanitize-recover");
2563
Chad Rosierae229d52013-01-29 23:31:22 +00002564 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2565 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2566 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2567 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2568
Chad Rosier864dfe12012-03-13 23:45:51 +00002569 // Report and error for -faltivec on anything other then PowerPC.
2570 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2571 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2572 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2573 D.Diag(diag::err_drv_argument_only_allowed_with)
2574 << A->getAsString(Args) << "ppc/ppc64";
2575
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002576 if (getToolChain().SupportsProfiling())
2577 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002578
2579 // -flax-vector-conversions is default.
2580 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2581 options::OPT_fno_lax_vector_conversions))
2582 CmdArgs.push_back("-fno-lax-vector-conversions");
2583
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002584 if (Args.getLastArg(options::OPT_fapple_kext))
2585 CmdArgs.push_back("-fapple-kext");
2586
David Blaikie690f21e2012-06-14 18:55:27 +00002587 if (Args.hasFlag(options::OPT_frewrite_includes,
2588 options::OPT_fno_rewrite_includes, false))
2589 CmdArgs.push_back("-frewrite-includes");
2590
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002591 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002592 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002593 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002594 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2595 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002596
2597 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2598 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002599 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002600 }
2601
Bob Wilson14adb362012-02-03 06:27:22 +00002602 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002603
Chandler Carruth6e501032011-03-27 00:04:55 +00002604 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2605 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2606 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2607 options::OPT_fno_wrapv)) {
2608 if (A->getOption().matches(options::OPT_fwrapv))
2609 CmdArgs.push_back("-fwrapv");
2610 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2611 options::OPT_fno_strict_overflow)) {
2612 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2613 CmdArgs.push_back("-fwrapv");
2614 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002615 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002616 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002617
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002618 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2619
Mahesha S6a682be42012-10-27 07:47:56 +00002620
Daniel Dunbar4930e332009-11-17 08:07:36 +00002621 // -stack-protector=0 is default.
2622 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002623 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2624 options::OPT_fstack_protector_all,
2625 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002626 if (A->getOption().matches(options::OPT_fstack_protector))
2627 StackProtectorLevel = 1;
2628 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2629 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002630 } else {
2631 StackProtectorLevel =
2632 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2633 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002634 if (StackProtectorLevel) {
2635 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002636 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002637 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002638
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002639 // --param ssp-buffer-size=
2640 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2641 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002642 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002643 if (Str.startswith("ssp-buffer-size=")) {
2644 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002645 CmdArgs.push_back("-stack-protector-buffer-size");
2646 // FIXME: Verify the argument is a valid integer.
2647 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002648 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002649 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002650 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002651 }
2652
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002653 // Translate -mstackrealign
2654 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2655 false)) {
2656 CmdArgs.push_back("-backend-option");
2657 CmdArgs.push_back("-force-align-stack");
2658 }
2659 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2660 false)) {
2661 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2662 }
2663
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002664 if (Args.hasArg(options::OPT_mstack_alignment)) {
2665 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2666 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002667 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002668 // -mkernel implies -mstrict-align; don't add the redundant option.
2669 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002670 CmdArgs.push_back("-backend-option");
2671 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002672 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002673
Daniel Dunbard18049a2009-04-07 21:16:11 +00002674 // Forward -f options with positive and negative forms; we translate
2675 // these by hand.
2676
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002677 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002678 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002679 CmdArgs.push_back("-fapple-kext");
2680 if (!Args.hasArg(options::OPT_fbuiltin))
2681 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002682 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002683 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002684 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002685 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002686 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002687
Nuno Lopes13c88c72009-12-16 16:59:22 +00002688 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2689 options::OPT_fno_assume_sane_operator_new))
2690 CmdArgs.push_back("-fno-assume-sane-operator-new");
2691
Daniel Dunbar4930e332009-11-17 08:07:36 +00002692 // -fblocks=0 is default.
2693 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002694 getToolChain().IsBlocksDefault()) ||
2695 (Args.hasArg(options::OPT_fgnu_runtime) &&
2696 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2697 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002698 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002699
2700 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2701 !getToolChain().hasBlocksRuntime())
2702 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002703 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002704
Douglas Gregor226173a2012-01-18 15:19:58 +00002705 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2706 // users must also pass -fcxx-modules. The latter flag will disappear once the
2707 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002708 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002709 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2710 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2711 options::OPT_fno_cxx_modules,
2712 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002713 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002714 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002715 HaveModules = true;
2716 }
2717 }
2718
2719 // -fmodules-autolink (on by default when modules is enabled) automatically
2720 // links against libraries for imported modules.
2721 if (HaveModules &&
2722 Args.hasFlag(options::OPT_fmodules_autolink,
2723 options::OPT_fno_modules_autolink,
2724 true)) {
2725 CmdArgs.push_back("-fmodules-autolink");
Douglas Gregor226173a2012-01-18 15:19:58 +00002726 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002727
John McCalldfea9982010-04-09 19:12:06 +00002728 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002729 if (Args.hasFlag(options::OPT_fno_access_control,
2730 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002731 false))
John McCall3155f572010-04-09 19:03:51 +00002732 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002733
Anders Carlssond470fef2010-11-21 00:09:52 +00002734 // -felide-constructors is the default.
2735 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2736 options::OPT_felide_constructors,
2737 false))
2738 CmdArgs.push_back("-fno-elide-constructors");
2739
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002740 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002741 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002742 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002743 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002744
Richard Smith52be6192012-11-05 22:04:41 +00002745 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002746 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002747 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002748 Args.getLastArg(options::OPT_mkernel,
2749 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002750 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002751 D.Diag(diag::err_drv_argument_not_allowed_with)
2752 << "-fsanitize=vptr" << NoRttiArg;
2753 }
2754 }
2755
Tony Linthicum76329bf2011-12-12 21:14:55 +00002756 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002757 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002758 options::OPT_fno_short_enums,
2759 getToolChain().getTriple().getArch() ==
2760 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002761 CmdArgs.push_back("-fshort-enums");
2762
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002763 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002764 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002765 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002766 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002767
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002768 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002769 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002770 options::OPT_fno_threadsafe_statics))
2771 CmdArgs.push_back("-fno-threadsafe-statics");
2772
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002773 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002774 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2775 options::OPT_fno_use_cxa_atexit,
2776 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002777 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002778 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2779 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002780 CmdArgs.push_back("-fno-use-cxa-atexit");
2781
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002782 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002783 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002784 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2785 CmdArgs.push_back("-fms-extensions");
2786
Francois Pichet1b4f1632011-09-17 04:32:15 +00002787 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002788 if (Args.hasFlag(options::OPT_fms_compatibility,
2789 options::OPT_fno_ms_compatibility,
2790 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2791 Args.hasFlag(options::OPT_fms_extensions,
2792 options::OPT_fno_ms_extensions,
2793 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002794 CmdArgs.push_back("-fms-compatibility");
2795
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002796 // -fmsc-version=1300 is default.
2797 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2798 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2799 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002800 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002801 if (msc_ver.empty())
2802 CmdArgs.push_back("-fmsc-version=1300");
2803 else
2804 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2805 }
2806
2807
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002808 // -fborland-extensions=0 is default.
2809 if (Args.hasFlag(options::OPT_fborland_extensions,
2810 options::OPT_fno_borland_extensions, false))
2811 CmdArgs.push_back("-fborland-extensions");
2812
Francois Pichet02744872011-09-01 16:38:08 +00002813 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2814 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002815 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2816 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002817 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002818 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002819
Chandler Carruthe03aa552010-04-17 20:17:31 +00002820 // -fgnu-keywords default varies depending on language; only pass if
2821 // specified.
2822 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002823 options::OPT_fno_gnu_keywords))
2824 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002825
Rafael Espindola922a6242011-06-02 17:30:53 +00002826 if (Args.hasFlag(options::OPT_fgnu89_inline,
2827 options::OPT_fno_gnu89_inline,
2828 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002829 CmdArgs.push_back("-fgnu89-inline");
2830
Chad Rosier9c76d242012-03-15 22:31:42 +00002831 if (Args.hasArg(options::OPT_fno_inline))
2832 CmdArgs.push_back("-fno-inline");
2833
Chad Rosier64d6be92012-03-06 21:17:19 +00002834 if (Args.hasArg(options::OPT_fno_inline_functions))
2835 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002836
John McCall5fb5df92012-06-20 06:18:46 +00002837 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002838
John McCall5fb5df92012-06-20 06:18:46 +00002839 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2840 // legacy is the default.
2841 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002842 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2843 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002844 objcRuntime.isLegacyDispatchDefaultForArch(
2845 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002846 if (getToolChain().UseObjCMixedDispatch())
2847 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2848 else
2849 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2850 }
2851 }
2852
Nico Weber97bd94b2012-03-09 21:19:44 +00002853 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2854 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002855 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002856 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2857 }
2858
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002859 // -fencode-extended-block-signature=1 is default.
2860 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2861 CmdArgs.push_back("-fencode-extended-block-signature");
2862 }
2863
John McCall24fc0de2011-07-06 00:26:06 +00002864 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2865 // NOTE: This logic is duplicated in ToolChains.cpp.
2866 bool ARC = isObjCAutoRefCount(Args);
2867 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002868 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002869
John McCall24fc0de2011-07-06 00:26:06 +00002870 CmdArgs.push_back("-fobjc-arc");
2871
Chandler Carruth491db322011-11-04 07:34:47 +00002872 // FIXME: It seems like this entire block, and several around it should be
2873 // wrapped in isObjC, but for now we just use it here as this is where it
2874 // was being used previously.
2875 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2876 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2877 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2878 else
2879 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2880 }
2881
John McCall24fc0de2011-07-06 00:26:06 +00002882 // Allow the user to enable full exceptions code emission.
2883 // We define off for Objective-CC, on for Objective-C++.
2884 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2885 options::OPT_fno_objc_arc_exceptions,
2886 /*default*/ types::isCXX(InputType)))
2887 CmdArgs.push_back("-fobjc-arc-exceptions");
2888 }
2889
2890 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2891 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002892 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002893 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002894
John McCall24fc0de2011-07-06 00:26:06 +00002895 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2896 // takes precedence.
2897 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2898 if (!GCArg)
2899 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2900 if (GCArg) {
2901 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002902 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002903 << GCArg->getAsString(Args);
2904 } else if (getToolChain().SupportsObjCGC()) {
2905 GCArg->render(Args, CmdArgs);
2906 } else {
2907 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002908 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002909 << GCArg->getAsString(Args);
2910 }
2911 }
2912
John McCallb5f652e2011-06-22 00:53:57 +00002913 // Add exception args.
2914 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002915 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002916
2917 if (getToolChain().UseSjLjExceptions())
2918 CmdArgs.push_back("-fsjlj-exceptions");
2919
2920 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002921 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2922 options::OPT_fno_assume_sane_operator_new))
2923 CmdArgs.push_back("-fno-assume-sane-operator-new");
2924
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002925 // -fconstant-cfstrings is default, and may be subject to argument translation
2926 // on Darwin.
2927 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2928 options::OPT_fno_constant_cfstrings) ||
2929 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2930 options::OPT_mno_constant_cfstrings))
2931 CmdArgs.push_back("-fno-constant-cfstrings");
2932
John Thompsoned4e2952009-11-05 20:14:16 +00002933 // -fshort-wchar default varies depending on platform; only
2934 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002935 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2936 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002937
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002938 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2939 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002940 //
2941 // FIXME: This is gross; that translation should be pulled from the
2942 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002943 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002944 options::OPT_fno_pascal_strings,
2945 false) ||
2946 Args.hasFlag(options::OPT_mpascal_strings,
2947 options::OPT_mno_pascal_strings,
2948 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002949 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002950
Daniel Dunbar096ed292011-10-05 21:04:55 +00002951 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2952 // -fno-pack-struct doesn't apply to -fpack-struct=.
2953 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002954 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002955 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002956 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002957 } else if (Args.hasFlag(options::OPT_fpack_struct,
2958 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002959 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002960 }
2961
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002962 if (Args.hasArg(options::OPT_mkernel) ||
2963 Args.hasArg(options::OPT_fapple_kext)) {
2964 if (!Args.hasArg(options::OPT_fcommon))
2965 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002966 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002967 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002968
Daniel Dunbard18049a2009-04-07 21:16:11 +00002969 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002970 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002971 CmdArgs.push_back("-fno-common");
2972
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002973 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002974 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002975 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002976 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002977 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002978 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2979
Daniel Dunbar6358d682010-10-15 22:30:42 +00002980 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2981 if (!Args.hasFlag(options::OPT_ffor_scope,
2982 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002983 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002984 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2985
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002986 // -fcaret-diagnostics is default.
2987 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2988 options::OPT_fno_caret_diagnostics, true))
2989 CmdArgs.push_back("-fno-caret-diagnostics");
2990
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002991 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002992 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002993 options::OPT_fno_diagnostics_fixit_info))
2994 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002995
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002996 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002997 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002998 options::OPT_fno_diagnostics_show_option))
2999 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003000
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003001 if (const Arg *A =
3002 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3003 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003004 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003005 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003006
Douglas Gregor643c9222011-05-21 17:07:29 +00003007 if (const Arg *A =
3008 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3009 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003010 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003011 }
3012
Chandler Carruthb6766f02011-03-27 01:50:55 +00003013 if (Arg *A = Args.getLastArg(
3014 options::OPT_fdiagnostics_show_note_include_stack,
3015 options::OPT_fno_diagnostics_show_note_include_stack)) {
3016 if (A->getOption().matches(
3017 options::OPT_fdiagnostics_show_note_include_stack))
3018 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3019 else
3020 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3021 }
3022
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003023 // Color diagnostics are the default, unless the terminal doesn't support
3024 // them.
3025 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00003026 options::OPT_fno_color_diagnostics,
3027 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003028 CmdArgs.push_back("-fcolor-diagnostics");
3029
Daniel Dunbardb097022009-06-08 21:13:54 +00003030 if (!Args.hasFlag(options::OPT_fshow_source_location,
3031 options::OPT_fno_show_source_location))
3032 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003033
Douglas Gregor643c9222011-05-21 17:07:29 +00003034 if (!Args.hasFlag(options::OPT_fshow_column,
3035 options::OPT_fno_show_column,
3036 true))
3037 CmdArgs.push_back("-fno-show-column");
3038
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003039 if (!Args.hasFlag(options::OPT_fspell_checking,
3040 options::OPT_fno_spell_checking))
3041 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003042
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003043
Chad Rosierc8e56e82012-12-05 21:08:21 +00003044 // -fno-asm-blocks is default.
3045 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3046 false))
3047 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003048
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003049 // -fvectorize is default.
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003050 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003051 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003052 CmdArgs.push_back("-backend-option");
3053 CmdArgs.push_back("-vectorize-loops");
3054 }
3055
Hal Finkel061f1652012-12-11 19:59:32 +00003056 // -fno-slp-vectorize is default.
3057 if (Args.hasFlag(options::OPT_fslp_vectorize,
3058 options::OPT_fno_slp_vectorize, false)) {
3059 CmdArgs.push_back("-backend-option");
3060 CmdArgs.push_back("-vectorize");
3061 }
3062
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003063 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3064 A->render(Args, CmdArgs);
3065
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003066 // -fdollars-in-identifiers default varies depending on platform and
3067 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003068 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003069 options::OPT_fno_dollars_in_identifiers)) {
3070 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003071 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003072 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003073 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003074 }
3075
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003076 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3077 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003078 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003079 options::OPT_fno_unit_at_a_time)) {
3080 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003081 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003082 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003083
Eli Friedman055c9702011-11-02 01:53:16 +00003084 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3085 options::OPT_fno_apple_pragma_pack, false))
3086 CmdArgs.push_back("-fapple-pragma-pack");
3087
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003088 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003089 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003090 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003091#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003092 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003093 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3094 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3095 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3096 CmdArgs.push_back("-fno-builtin-strcat");
3097 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3098 CmdArgs.push_back("-fno-builtin-strcpy");
3099 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003100#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003101
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003102 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003103 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003104 options::OPT_traditional_cpp)) {
3105 if (isa<PreprocessJobAction>(JA))
3106 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003107 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003108 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003109 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003110
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003111 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003112 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003113
3114 // Handle serialized diagnostics.
3115 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3116 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003117 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003118 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003119
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003120 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3121 CmdArgs.push_back("-fretain-comments-from-system-headers");
3122
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003123 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3124 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003125 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003126 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3127 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003128 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003129
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003130 // We translate this by hand to the -cc1 argument, since nightly test uses
3131 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003132 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003133 CmdArgs.push_back("-disable-llvm-optzns");
3134 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003135 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003136 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003137
Daniel Dunbard67a3222009-03-30 06:36:42 +00003138 if (Output.getType() == types::TY_Dependencies) {
3139 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003140 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003141 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003142 CmdArgs.push_back(Output.getFilename());
3143 } else {
3144 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003145 }
3146
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003147 for (InputInfoList::const_iterator
3148 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3149 const InputInfo &II = *it;
3150 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003151 if (Args.hasArg(options::OPT_rewrite_objc))
3152 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3153 else
3154 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003155 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003156 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003157 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003158 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003159 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003160
Chris Lattnere9d7d782009-11-03 19:50:27 +00003161 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3162
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003163 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003164
3165 // Optionally embed the -cc1 level arguments into the debug info, for build
3166 // analysis.
3167 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003168 ArgStringList OriginalArgs;
3169 for (ArgList::const_iterator it = Args.begin(),
3170 ie = Args.end(); it != ie; ++it)
3171 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003172
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003173 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003174 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003175 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003176 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003177 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003178 }
3179 CmdArgs.push_back("-dwarf-debug-flags");
3180 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3181 }
3182
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003183 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003184
Roman Divacky178e01602011-02-10 16:52:03 +00003185 if (Arg *A = Args.getLastArg(options::OPT_pg))
3186 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003187 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003188 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003189
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003190 // Claim some arguments which clang supports automatically.
3191
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003192 // -fpch-preprocess is used with gcc to add a special marker in the output to
3193 // include the PCH file. Clang's PTH solution is completely transparent, so we
3194 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003195 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003196
Daniel Dunbar17731772009-03-23 19:03:36 +00003197 // Claim some arguments which clang doesn't support, but we don't
3198 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003199 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3200 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003201
Rafael Espindolad95a8122011-03-01 05:25:27 +00003202 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003203 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003204 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003205}
3206
Jim Grosbach576452b2012-02-10 20:37:10 +00003207void ClangAs::AddARMTargetArgs(const ArgList &Args,
3208 ArgStringList &CmdArgs) const {
3209 const Driver &D = getToolChain().getDriver();
3210 llvm::Triple Triple = getToolChain().getTriple();
3211
3212 // Set the CPU based on -march= and -mcpu=.
3213 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003214 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003215
3216 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003217 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003218 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003219
3220 // Honor -mfpmath=.
3221 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003222 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003223}
3224
John McCall5fb5df92012-06-20 06:18:46 +00003225/// Add options related to the Objective-C runtime/ABI.
3226///
3227/// Returns true if the runtime is non-fragile.
3228ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3229 ArgStringList &cmdArgs,
3230 RewriteKind rewriteKind) const {
3231 // Look for the controlling runtime option.
3232 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3233 options::OPT_fgnu_runtime,
3234 options::OPT_fobjc_runtime_EQ);
3235
3236 // Just forward -fobjc-runtime= to the frontend. This supercedes
3237 // options about fragility.
3238 if (runtimeArg &&
3239 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3240 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003241 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003242 if (runtime.tryParse(value)) {
3243 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3244 << value;
3245 }
3246
3247 runtimeArg->render(args, cmdArgs);
3248 return runtime;
3249 }
3250
3251 // Otherwise, we'll need the ABI "version". Version numbers are
3252 // slightly confusing for historical reasons:
3253 // 1 - Traditional "fragile" ABI
3254 // 2 - Non-fragile ABI, version 1
3255 // 3 - Non-fragile ABI, version 2
3256 unsigned objcABIVersion = 1;
3257 // If -fobjc-abi-version= is present, use that to set the version.
3258 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003259 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003260 if (value == "1")
3261 objcABIVersion = 1;
3262 else if (value == "2")
3263 objcABIVersion = 2;
3264 else if (value == "3")
3265 objcABIVersion = 3;
3266 else
3267 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3268 << value;
3269 } else {
3270 // Otherwise, determine if we are using the non-fragile ABI.
3271 bool nonFragileABIIsDefault =
3272 (rewriteKind == RK_NonFragile ||
3273 (rewriteKind == RK_None &&
3274 getToolChain().IsObjCNonFragileABIDefault()));
3275 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3276 options::OPT_fno_objc_nonfragile_abi,
3277 nonFragileABIIsDefault)) {
3278 // Determine the non-fragile ABI version to use.
3279#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3280 unsigned nonFragileABIVersion = 1;
3281#else
3282 unsigned nonFragileABIVersion = 2;
3283#endif
3284
3285 if (Arg *abiArg = args.getLastArg(
3286 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003287 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003288 if (value == "1")
3289 nonFragileABIVersion = 1;
3290 else if (value == "2")
3291 nonFragileABIVersion = 2;
3292 else
3293 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3294 << value;
3295 }
3296
3297 objcABIVersion = 1 + nonFragileABIVersion;
3298 } else {
3299 objcABIVersion = 1;
3300 }
3301 }
3302
3303 // We don't actually care about the ABI version other than whether
3304 // it's non-fragile.
3305 bool isNonFragile = objcABIVersion != 1;
3306
3307 // If we have no runtime argument, ask the toolchain for its default runtime.
3308 // However, the rewriter only really supports the Mac runtime, so assume that.
3309 ObjCRuntime runtime;
3310 if (!runtimeArg) {
3311 switch (rewriteKind) {
3312 case RK_None:
3313 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3314 break;
3315 case RK_Fragile:
3316 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3317 break;
3318 case RK_NonFragile:
3319 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3320 break;
3321 }
3322
3323 // -fnext-runtime
3324 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3325 // On Darwin, make this use the default behavior for the toolchain.
3326 if (getToolChain().getTriple().isOSDarwin()) {
3327 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3328
3329 // Otherwise, build for a generic macosx port.
3330 } else {
3331 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3332 }
3333
3334 // -fgnu-runtime
3335 } else {
3336 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003337 // Legacy behaviour is to target the gnustep runtime if we are i
3338 // non-fragile mode or the GCC runtime in fragile mode.
3339 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003340 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003341 else
3342 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003343 }
3344
3345 cmdArgs.push_back(args.MakeArgString(
3346 "-fobjc-runtime=" + runtime.getAsString()));
3347 return runtime;
3348}
3349
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003350void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003351 const InputInfo &Output,
3352 const InputInfoList &Inputs,
3353 const ArgList &Args,
3354 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003355 ArgStringList CmdArgs;
3356
3357 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3358 const InputInfo &Input = Inputs[0];
3359
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003360 // Don't warn about "clang -w -c foo.s"
3361 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003362 // and "clang -emit-llvm -c foo.s"
3363 Args.ClaimAllArgs(options::OPT_emit_llvm);
3364 // and "clang -use-gold-plugin -c foo.s"
3365 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003366
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003367 // Invoke ourselves in -cc1as mode.
3368 //
3369 // FIXME: Implement custom jobs for internal actions.
3370 CmdArgs.push_back("-cc1as");
3371
3372 // Add the "effective" target triple.
3373 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003374 std::string TripleStr =
3375 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003376 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3377
3378 // Set the output mode, we currently only expect to be used as a real
3379 // assembler.
3380 CmdArgs.push_back("-filetype");
3381 CmdArgs.push_back("obj");
3382
Eric Christopher45f2e712012-12-18 00:31:10 +00003383 // Set the main file name, so that debug info works even with
3384 // -save-temps or preprocessed assembly.
3385 CmdArgs.push_back("-main-file-name");
3386 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3387
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003388 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003389 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003390
Jim Grosbach576452b2012-02-10 20:37:10 +00003391 // Add target specific cpu and features flags.
3392 switch(getToolChain().getTriple().getArch()) {
3393 default:
3394 break;
3395
3396 case llvm::Triple::arm:
3397 case llvm::Triple::thumb:
3398 AddARMTargetArgs(Args, CmdArgs);
3399 break;
3400 }
3401
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003402 // Ignore explicit -force_cpusubtype_ALL option.
3403 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003404
Eric Christopherfc3ee562012-01-10 00:38:01 +00003405 // Determine the original source input.
3406 const Action *SourceAction = &JA;
3407 while (SourceAction->getKind() != Action::InputClass) {
3408 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3409 SourceAction = SourceAction->getInputs()[0];
3410 }
3411
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003412 // Forward -g and handle debug info related flags, assuming we are dealing
3413 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003414 if (SourceAction->getType() == types::TY_Asm ||
3415 SourceAction->getType() == types::TY_PP_Asm) {
3416 Args.ClaimAllArgs(options::OPT_g_Group);
3417 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3418 if (!A->getOption().matches(options::OPT_g0))
3419 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003420
3421 // Add the -fdebug-compilation-dir flag if needed.
3422 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003423
3424 // Set the AT_producer to the clang version when using the integrated
3425 // assembler on assembly source files.
3426 CmdArgs.push_back("-dwarf-debug-producer");
3427 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003428 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003429
3430 // Optionally embed the -cc1as level arguments into the debug info, for build
3431 // analysis.
3432 if (getToolChain().UseDwarfDebugFlags()) {
3433 ArgStringList OriginalArgs;
3434 for (ArgList::const_iterator it = Args.begin(),
3435 ie = Args.end(); it != ie; ++it)
3436 (*it)->render(Args, OriginalArgs);
3437
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003438 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003439 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3440 Flags += Exec;
3441 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3442 Flags += " ";
3443 Flags += OriginalArgs[i];
3444 }
3445 CmdArgs.push_back("-dwarf-debug-flags");
3446 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3447 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003448
3449 // FIXME: Add -static support, once we have it.
3450
3451 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3452 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003453 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003454
3455 assert(Output.isFilename() && "Unexpected lipo output.");
3456 CmdArgs.push_back("-o");
3457 CmdArgs.push_back(Output.getFilename());
3458
Daniel Dunbarb440f562010-08-02 02:38:21 +00003459 assert(Input.isFilename() && "Invalid input.");
3460 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003461
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003462 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003463 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003464}
3465
Daniel Dunbara3246a02009-03-18 08:07:30 +00003466void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003467 const InputInfo &Output,
3468 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003469 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003470 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003471 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003472 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003473
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003474 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003475 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003476 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003477 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003478 // Don't forward any -g arguments to assembly steps.
3479 if (isa<AssembleJobAction>(JA) &&
3480 A->getOption().matches(options::OPT_g_Group))
3481 continue;
3482
Daniel Dunbar2da02722009-03-19 07:55:12 +00003483 // It is unfortunate that we have to claim here, as this means
3484 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003485 // platforms using a generic gcc, even if we are just using gcc
3486 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003487 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003488 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003489 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003490 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003491
Daniel Dunbar4e295052010-01-25 22:35:08 +00003492 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003493
3494 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003495 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003496 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003497 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003498
3499 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003500 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003501 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003502 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003503 CmdArgs.push_back("ppc64");
3504 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003505 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003506 }
3507
Daniel Dunbar5716d872009-05-02 21:41:52 +00003508 // Try to force gcc to match the tool chain we want, if we recognize
3509 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003510 //
3511 // FIXME: The triple class should directly provide the information we want
3512 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003513 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003514 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003515 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003516 CmdArgs.push_back("-m64");
3517
Daniel Dunbarb440f562010-08-02 02:38:21 +00003518 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003519 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003520 CmdArgs.push_back(Output.getFilename());
3521 } else {
3522 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003523 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003524 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003525
Tony Linthicum76329bf2011-12-12 21:14:55 +00003526 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3527 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003528
3529 // Only pass -x if gcc will understand it; otherwise hope gcc
3530 // understands the suffix correctly. The main use case this would go
3531 // wrong in is for linker inputs if they happened to have an odd
3532 // suffix; really the only way to get this to happen is a command
3533 // like '-x foobar a.c' which will treat a.c like a linker input.
3534 //
3535 // FIXME: For the linker case specifically, can we safely convert
3536 // inputs into '-Wl,' options?
3537 for (InputInfoList::const_iterator
3538 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3539 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003540
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003541 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003542 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3543 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003544 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003545 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003546 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003547 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003548 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003549
Daniel Dunbara3246a02009-03-18 08:07:30 +00003550 if (types::canTypeBeUserSpecified(II.getType())) {
3551 CmdArgs.push_back("-x");
3552 CmdArgs.push_back(types::getTypeName(II.getType()));
3553 }
3554
Daniel Dunbarb440f562010-08-02 02:38:21 +00003555 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003556 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003557 else {
3558 const Arg &A = II.getInputArg();
3559
3560 // Reverse translate some rewritten options.
3561 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3562 CmdArgs.push_back("-lstdc++");
3563 continue;
3564 }
3565
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003566 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003567 A.render(Args, CmdArgs);
3568 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003569 }
3570
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003571 const std::string customGCCName = D.getCCCGenericGCCName();
3572 const char *GCCName;
3573 if (!customGCCName.empty())
3574 GCCName = customGCCName.c_str();
3575 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003576 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003577 } else
3578 GCCName = "gcc";
3579
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003580 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003581 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003582 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003583}
3584
Daniel Dunbar4e295052010-01-25 22:35:08 +00003585void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3586 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003587 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003588}
3589
Daniel Dunbar4e295052010-01-25 22:35:08 +00003590void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3591 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003592 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003593}
3594
Daniel Dunbar4e295052010-01-25 22:35:08 +00003595void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3596 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003597 const Driver &D = getToolChain().getDriver();
3598
Daniel Dunbar4e295052010-01-25 22:35:08 +00003599 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003600 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3601 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003602 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003603 else {
3604 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003605 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003606 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003607
Daniel Dunbar4e295052010-01-25 22:35:08 +00003608 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003609 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003610}
3611
Daniel Dunbar4e295052010-01-25 22:35:08 +00003612void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3613 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003614 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003615}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003616
Daniel Dunbar4e295052010-01-25 22:35:08 +00003617void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3618 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003619 // The types are (hopefully) good enough.
3620}
3621
Tony Linthicum76329bf2011-12-12 21:14:55 +00003622// Hexagon tools start.
3623void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3624 ArgStringList &CmdArgs) const {
3625
3626}
3627void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3628 const InputInfo &Output,
3629 const InputInfoList &Inputs,
3630 const ArgList &Args,
3631 const char *LinkingOutput) const {
3632
3633 const Driver &D = getToolChain().getDriver();
3634 ArgStringList CmdArgs;
3635
3636 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003637 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003638 CmdArgs.push_back(Args.MakeArgString(MarchString));
3639
3640 RenderExtraToolArgs(JA, CmdArgs);
3641
3642 if (Output.isFilename()) {
3643 CmdArgs.push_back("-o");
3644 CmdArgs.push_back(Output.getFilename());
3645 } else {
3646 assert(Output.isNothing() && "Unexpected output");
3647 CmdArgs.push_back("-fsyntax-only");
3648 }
3649
Matthew Curtise8f80a12012-12-06 17:49:03 +00003650 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3651 if (!SmallDataThreshold.empty())
3652 CmdArgs.push_back(
3653 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003654
Matthew Curtise5df3812012-12-07 17:23:04 +00003655 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3656 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3657 options::OPT_Xassembler);
3658
Tony Linthicum76329bf2011-12-12 21:14:55 +00003659 // Only pass -x if gcc will understand it; otherwise hope gcc
3660 // understands the suffix correctly. The main use case this would go
3661 // wrong in is for linker inputs if they happened to have an odd
3662 // suffix; really the only way to get this to happen is a command
3663 // like '-x foobar a.c' which will treat a.c like a linker input.
3664 //
3665 // FIXME: For the linker case specifically, can we safely convert
3666 // inputs into '-Wl,' options?
3667 for (InputInfoList::const_iterator
3668 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3669 const InputInfo &II = *it;
3670
3671 // Don't try to pass LLVM or AST inputs to a generic gcc.
3672 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3673 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3674 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3675 << getToolChain().getTripleString();
3676 else if (II.getType() == types::TY_AST)
3677 D.Diag(clang::diag::err_drv_no_ast_support)
3678 << getToolChain().getTripleString();
3679
3680 if (II.isFilename())
3681 CmdArgs.push_back(II.getFilename());
3682 else
3683 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3684 II.getInputArg().render(Args, CmdArgs);
3685 }
3686
3687 const char *GCCName = "hexagon-as";
3688 const char *Exec =
3689 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3690 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3691
3692}
3693void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3694 ArgStringList &CmdArgs) const {
3695 // The types are (hopefully) good enough.
3696}
3697
3698void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3699 const InputInfo &Output,
3700 const InputInfoList &Inputs,
3701 const ArgList &Args,
3702 const char *LinkingOutput) const {
3703
Matthew Curtise689b052012-12-06 15:46:07 +00003704 const toolchains::Hexagon_TC& ToolChain =
3705 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3706 const Driver &D = ToolChain.getDriver();
3707
Tony Linthicum76329bf2011-12-12 21:14:55 +00003708 ArgStringList CmdArgs;
3709
Matthew Curtise689b052012-12-06 15:46:07 +00003710 //----------------------------------------------------------------------------
3711 //
3712 //----------------------------------------------------------------------------
3713 bool hasStaticArg = Args.hasArg(options::OPT_static);
3714 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00003715 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00003716 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3717 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3718 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3719 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003720
Matthew Curtise689b052012-12-06 15:46:07 +00003721 //----------------------------------------------------------------------------
3722 // Silence warnings for various options
3723 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00003724
Matthew Curtise689b052012-12-06 15:46:07 +00003725 Args.ClaimAllArgs(options::OPT_g_Group);
3726 Args.ClaimAllArgs(options::OPT_emit_llvm);
3727 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
3728 // handled somewhere else.
3729 Args.ClaimAllArgs(options::OPT_static_libgcc);
3730
3731 //----------------------------------------------------------------------------
3732 //
3733 //----------------------------------------------------------------------------
3734 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
3735 e = ToolChain.ExtraOpts.end();
3736 i != e; ++i)
3737 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003738
Matthew Curtisf10a5952012-12-06 14:16:43 +00003739 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
3740 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00003741
Matthew Curtise689b052012-12-06 15:46:07 +00003742 if (buildingLib) {
3743 CmdArgs.push_back("-shared");
3744 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
3745 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00003746 }
3747
Matthew Curtise689b052012-12-06 15:46:07 +00003748 if (hasStaticArg)
3749 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003750
Matthew Curtise8f80a12012-12-06 17:49:03 +00003751 if (buildPIE && !buildingLib)
3752 CmdArgs.push_back("-pie");
3753
3754 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3755 if (!SmallDataThreshold.empty()) {
3756 CmdArgs.push_back(
3757 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
3758 }
3759
Matthew Curtise689b052012-12-06 15:46:07 +00003760 //----------------------------------------------------------------------------
3761 //
3762 //----------------------------------------------------------------------------
3763 CmdArgs.push_back("-o");
3764 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003765
Matthew Curtise689b052012-12-06 15:46:07 +00003766 const std::string MarchSuffix = "/" + MarchString;
3767 const std::string G0Suffix = "/G0";
3768 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
3769 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
3770 + "/";
3771 const std::string StartFilesDir = RootDir
3772 + "hexagon/lib"
3773 + (buildingLib
3774 ? MarchG0Suffix : MarchSuffix);
3775
3776 //----------------------------------------------------------------------------
3777 // moslib
3778 //----------------------------------------------------------------------------
3779 std::vector<std::string> oslibs;
3780 bool hasStandalone= false;
3781
3782 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
3783 ie = Args.filtered_end(); it != ie; ++it) {
3784 (*it)->claim();
3785 oslibs.push_back((*it)->getValue());
3786 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003787 }
Matthew Curtise689b052012-12-06 15:46:07 +00003788 if (oslibs.empty()) {
3789 oslibs.push_back("standalone");
3790 hasStandalone = true;
3791 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00003792
Matthew Curtise689b052012-12-06 15:46:07 +00003793 //----------------------------------------------------------------------------
3794 // Start Files
3795 //----------------------------------------------------------------------------
3796 if (incStdLib && incStartFiles) {
3797
3798 if (!buildingLib) {
3799 if (hasStandalone) {
3800 CmdArgs.push_back(
3801 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
3802 }
3803 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
3804 }
3805 std::string initObj = useShared ? "/initS.o" : "/init.o";
3806 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
3807 }
3808
3809 //----------------------------------------------------------------------------
3810 // Library Search Paths
3811 //----------------------------------------------------------------------------
3812 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
3813 for (ToolChain::path_list::const_iterator
3814 i = LibPaths.begin(),
3815 e = LibPaths.end();
3816 i != e;
3817 ++i)
3818 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
3819
3820 //----------------------------------------------------------------------------
3821 //
3822 //----------------------------------------------------------------------------
3823 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3824 Args.AddAllArgs(CmdArgs, options::OPT_e);
3825 Args.AddAllArgs(CmdArgs, options::OPT_s);
3826 Args.AddAllArgs(CmdArgs, options::OPT_t);
3827 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
3828
3829 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
3830
3831 //----------------------------------------------------------------------------
3832 // Libraries
3833 //----------------------------------------------------------------------------
3834 if (incStdLib && incDefLibs) {
3835 if (D.CCCIsCXX) {
3836 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
3837 CmdArgs.push_back("-lm");
3838 }
3839
3840 CmdArgs.push_back("--start-group");
3841
3842 if (!buildingLib) {
3843 for(std::vector<std::string>::iterator i = oslibs.begin(),
3844 e = oslibs.end(); i != e; ++i)
3845 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
3846 CmdArgs.push_back("-lc");
3847 }
3848 CmdArgs.push_back("-lgcc");
3849
3850 CmdArgs.push_back("--end-group");
3851 }
3852
3853 //----------------------------------------------------------------------------
3854 // End files
3855 //----------------------------------------------------------------------------
3856 if (incStdLib && incStartFiles) {
3857 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
3858 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
3859 }
3860
3861 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
3862 C.addCommand(
3863 new Command(
3864 JA, *this,
3865 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003866}
3867// Hexagon tools end.
3868
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003869llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3870 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3871 // archs which Darwin doesn't use.
3872
3873 // The matching this routine does is fairly pointless, since it is neither the
3874 // complete architecture list, nor a reasonable subset. The problem is that
3875 // historically the driver driver accepts this and also ties its -march=
3876 // handling to the architecture name, so we need to be careful before removing
3877 // support for it.
3878
3879 // This code must be kept in sync with Clang's Darwin specific argument
3880 // translation.
3881
3882 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3883 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3884 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3885 .Case("ppc64", llvm::Triple::ppc64)
3886 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3887 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3888 llvm::Triple::x86)
3889 .Case("x86_64", llvm::Triple::x86_64)
3890 // This is derived from the driver driver.
3891 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3892 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3893 .Case("r600", llvm::Triple::r600)
3894 .Case("nvptx", llvm::Triple::nvptx)
3895 .Case("nvptx64", llvm::Triple::nvptx64)
3896 .Case("amdil", llvm::Triple::amdil)
3897 .Case("spir", llvm::Triple::spir)
3898 .Default(llvm::Triple::UnknownArch);
3899}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003900
Bob Wilsondecc03e2012-11-23 06:14:39 +00003901const char *Clang::getBaseInputName(const ArgList &Args,
3902 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003903 return Args.MakeArgString(
3904 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003905}
3906
Bob Wilsondecc03e2012-11-23 06:14:39 +00003907const char *Clang::getBaseInputStem(const ArgList &Args,
3908 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003909 const char *Str = getBaseInputName(Args, Inputs);
3910
Chris Lattner906bb902011-01-16 08:14:11 +00003911 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003912 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003913
3914 return Str;
3915}
3916
Bob Wilsondecc03e2012-11-23 06:14:39 +00003917const char *Clang::getDependencyFileName(const ArgList &Args,
3918 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003919 // FIXME: Think about this more.
3920 std::string Res;
3921
3922 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003923 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003924 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003925 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00003926 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003927 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003928 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003929}
3930
Daniel Dunbarbe220842009-03-20 16:06:39 +00003931void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003932 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003933 const InputInfoList &Inputs,
3934 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00003935 const char *LinkingOutput) const {
3936 ArgStringList CmdArgs;
3937
3938 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3939 const InputInfo &Input = Inputs[0];
3940
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003941 // Determine the original source input.
3942 const Action *SourceAction = &JA;
3943 while (SourceAction->getKind() != Action::InputClass) {
3944 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3945 SourceAction = SourceAction->getInputs()[0];
3946 }
3947
3948 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00003949 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003950 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003951 if (Args.hasArg(options::OPT_gstabs))
3952 CmdArgs.push_back("--gstabs");
3953 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00003954 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003955 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003956
Daniel Dunbarbe220842009-03-20 16:06:39 +00003957 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003958 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00003959
Daniel Dunbar6d484762010-07-22 01:47:22 +00003960 // Use -force_cpusubtype_ALL on x86 by default.
3961 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3962 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003963 Args.hasArg(options::OPT_force__cpusubtype__ALL))
3964 CmdArgs.push_back("-force_cpusubtype_ALL");
3965
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00003966 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003967 (((Args.hasArg(options::OPT_mkernel) ||
3968 Args.hasArg(options::OPT_fapple_kext)) &&
3969 (!getDarwinToolChain().isTargetIPhoneOS() ||
3970 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
3971 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003972 CmdArgs.push_back("-static");
3973
Daniel Dunbarbe220842009-03-20 16:06:39 +00003974 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3975 options::OPT_Xassembler);
3976
3977 assert(Output.isFilename() && "Unexpected lipo output.");
3978 CmdArgs.push_back("-o");
3979 CmdArgs.push_back(Output.getFilename());
3980
Daniel Dunbarb440f562010-08-02 02:38:21 +00003981 assert(Input.isFilename() && "Invalid input.");
3982 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00003983
3984 // asm_final spec is empty.
3985
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003986 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003987 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003988 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00003989}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00003990
David Blaikie68e081d2011-12-20 02:48:34 +00003991void darwin::DarwinTool::anchor() {}
3992
Daniel Dunbare9ded432009-09-09 18:36:20 +00003993void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3994 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003995 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003996
Daniel Dunbarc1964212009-03-26 16:23:12 +00003997 // Derived from darwin_arch spec.
3998 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003999 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004000
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004001 // FIXME: Is this needed anymore?
4002 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004003 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004004}
4005
Bill Wendling3b2000f2012-10-02 18:02:50 +00004006bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4007 // We only need to generate a temp path for LTO if we aren't compiling object
4008 // files. When compiling source files, we run 'dsymutil' after linking. We
4009 // don't run 'dsymutil' when compiling object files.
4010 for (InputInfoList::const_iterator
4011 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4012 if (it->getType() != types::TY_Object)
4013 return true;
4014
4015 return false;
4016}
4017
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004018void darwin::Link::AddLinkArgs(Compilation &C,
4019 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004020 ArgStringList &CmdArgs,
4021 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004022 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004023 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004024
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004025 unsigned Version[3] = { 0, 0, 0 };
4026 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4027 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004028 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004029 Version[1], Version[2], HadExtra) ||
4030 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004031 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004032 << A->getAsString(Args);
4033 }
4034
4035 // Newer linkers support -demangle, pass it if supported and not disabled by
4036 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004037 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004038 // Don't pass -demangle to ld_classic.
4039 //
4040 // FIXME: This is a temporary workaround, ld should be handling this.
4041 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4042 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004043 if (getToolChain().getArch() == llvm::Triple::x86) {
4044 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4045 options::OPT_Wl_COMMA),
4046 ie = Args.filtered_end(); it != ie; ++it) {
4047 const Arg *A = *it;
4048 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004049 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004050 UsesLdClassic = true;
4051 }
4052 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004053 if (!UsesLdClassic)
4054 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004055 }
4056
Bill Wendling313b6bf2012-11-16 23:03:00 +00004057 // If we are using LTO, then automatically create a temporary file path for
4058 // the linker to use, so that it's lifetime will extend past a possible
4059 // dsymutil step.
4060 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4061 const char *TmpPath = C.getArgs().MakeArgString(
4062 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4063 C.addTempFile(TmpPath);
4064 CmdArgs.push_back("-object_path_lto");
4065 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004066 }
4067
Daniel Dunbarc1964212009-03-26 16:23:12 +00004068 // Derived from the "link" spec.
4069 Args.AddAllArgs(CmdArgs, options::OPT_static);
4070 if (!Args.hasArg(options::OPT_static))
4071 CmdArgs.push_back("-dynamic");
4072 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4073 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4074 // here. How do we wish to handle such things?
4075 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004076
Daniel Dunbarc1964212009-03-26 16:23:12 +00004077 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004078 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004079 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004080 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004081
4082 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4083 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4084 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4085
4086 Arg *A;
4087 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4088 (A = Args.getLastArg(options::OPT_current__version)) ||
4089 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004090 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004091 << A->getAsString(Args) << "-dynamiclib";
4092
4093 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4094 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4095 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4096 } else {
4097 CmdArgs.push_back("-dylib");
4098
4099 Arg *A;
4100 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4101 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4102 (A = Args.getLastArg(options::OPT_client__name)) ||
4103 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4104 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4105 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004106 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004107 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004108
Daniel Dunbarc1964212009-03-26 16:23:12 +00004109 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4110 "-dylib_compatibility_version");
4111 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4112 "-dylib_current_version");
4113
Daniel Dunbara48823f2010-01-22 02:04:52 +00004114 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004115
4116 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4117 "-dylib_install_name");
4118 }
4119
4120 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4121 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4122 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004123 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004124 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004125 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4126 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4127 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4128 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4129 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4130 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004131 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004132 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4133 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4134 Args.AddAllArgs(CmdArgs, options::OPT_init);
4135
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004136 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004137 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004138
4139 // If we had an explicit -mios-simulator-version-min argument, honor that,
4140 // otherwise use the traditional deployment targets. We can't just check the
4141 // is-sim attribute because existing code follows this path, and the linker
4142 // may not handle the argument.
4143 //
4144 // FIXME: We may be able to remove this, once we can verify no one depends on
4145 // it.
4146 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4147 CmdArgs.push_back("-ios_simulator_version_min");
4148 else if (DarwinTC.isTargetIPhoneOS())
4149 CmdArgs.push_back("-iphoneos_version_min");
4150 else
4151 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004152 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004153
Daniel Dunbarc1964212009-03-26 16:23:12 +00004154 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4155 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4156 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4157 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4158 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004159
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004160 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4161 options::OPT_fno_pie,
4162 options::OPT_fno_PIE)) {
4163 if (A->getOption().matches(options::OPT_fpie) ||
4164 A->getOption().matches(options::OPT_fPIE))
4165 CmdArgs.push_back("-pie");
4166 else
4167 CmdArgs.push_back("-no_pie");
4168 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004169
4170 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4171 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4172 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4173 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4174 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4175 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4176 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4177 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4178 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4179 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4180 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4181 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4182 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4183 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4184 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4185 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004186
Daniel Dunbar84384642011-05-02 21:03:47 +00004187 // Give --sysroot= preference, over the Apple specific behavior to also use
4188 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004189 StringRef sysroot = C.getSysRoot();
4190 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004191 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004192 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004193 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4194 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004195 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004196 }
4197
Daniel Dunbarc1964212009-03-26 16:23:12 +00004198 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4199 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4200 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4201 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4202 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004203 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004204 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4205 Args.AddAllArgs(CmdArgs, options::OPT_y);
4206 Args.AddLastArg(CmdArgs, options::OPT_w);
4207 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4208 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4209 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4210 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4211 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4212 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4213 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4214 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4215 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4216 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4217 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4218 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4219}
4220
4221void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004222 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004223 const InputInfoList &Inputs,
4224 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004225 const char *LinkingOutput) const {
4226 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004227
Daniel Dunbarc1964212009-03-26 16:23:12 +00004228 // The logic here is derived from gcc's behavior; most of which
4229 // comes from specs (starting with link_command). Consult gcc for
4230 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004231 ArgStringList CmdArgs;
4232
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004233 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4234 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4235 options::OPT_ccc_arcmt_migrate)) {
4236 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4237 (*I)->claim();
4238 const char *Exec =
4239 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4240 CmdArgs.push_back(Output.getFilename());
4241 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4242 return;
4243 }
4244
Daniel Dunbarc1964212009-03-26 16:23:12 +00004245 // I'm not sure why this particular decomposition exists in gcc, but
4246 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004247 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004248
Daniel Dunbarc1964212009-03-26 16:23:12 +00004249 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4250 Args.AddAllArgs(CmdArgs, options::OPT_s);
4251 Args.AddAllArgs(CmdArgs, options::OPT_t);
4252 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4253 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004254 Args.AddLastArg(CmdArgs, options::OPT_e);
4255 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4256 Args.AddAllArgs(CmdArgs, options::OPT_r);
4257
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004258 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4259 // members of static archive libraries which implement Objective-C classes or
4260 // categories.
4261 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4262 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004263
Bill Wendling58979742012-12-10 21:48:41 +00004264 if (Args.hasArg(options::OPT_rdynamic))
4265 CmdArgs.push_back("-export_dynamic");
4266
Daniel Dunbarc1964212009-03-26 16:23:12 +00004267 CmdArgs.push_back("-o");
4268 CmdArgs.push_back(Output.getFilename());
4269
Chad Rosier06fd3c62012-05-16 23:45:12 +00004270 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004271 !Args.hasArg(options::OPT_nostartfiles)) {
4272 // Derived from startfile spec.
4273 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004274 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004275 if (getDarwinToolChain().isTargetIOSSimulator()) {
4276 // The simulator doesn't have a versioned crt1 file.
4277 CmdArgs.push_back("-ldylib1.o");
4278 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004279 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4280 CmdArgs.push_back("-ldylib1.o");
4281 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004282 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004283 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004284 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004285 CmdArgs.push_back("-ldylib1.10.5.o");
4286 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004287 } else {
4288 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004289 if (!Args.hasArg(options::OPT_static)) {
4290 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004291 if (getDarwinToolChain().isTargetIOSSimulator()) {
4292 // The simulator doesn't have a versioned crt1 file.
4293 CmdArgs.push_back("-lbundle1.o");
4294 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004295 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4296 CmdArgs.push_back("-lbundle1.o");
4297 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004298 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004299 CmdArgs.push_back("-lbundle1.o");
4300 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004301 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004302 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004303 if (Args.hasArg(options::OPT_pg) &&
4304 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004305 if (Args.hasArg(options::OPT_static) ||
4306 Args.hasArg(options::OPT_object) ||
4307 Args.hasArg(options::OPT_preload)) {
4308 CmdArgs.push_back("-lgcrt0.o");
4309 } else {
4310 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004311
Daniel Dunbarc1964212009-03-26 16:23:12 +00004312 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004313 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004314 // By default on OS X 10.8 and later, we don't link with a crt1.o
4315 // file and the linker knows to use _main as the entry point. But,
4316 // when compiling with -pg, we need to link with the gcrt1.o file,
4317 // so pass the -no_new_main option to tell the linker to use the
4318 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004319 if (getDarwinToolChain().isTargetMacOS() &&
4320 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4321 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004322 } else {
4323 if (Args.hasArg(options::OPT_static) ||
4324 Args.hasArg(options::OPT_object) ||
4325 Args.hasArg(options::OPT_preload)) {
4326 CmdArgs.push_back("-lcrt0.o");
4327 } else {
4328 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004329 if (getDarwinToolChain().isTargetIOSSimulator()) {
4330 // The simulator doesn't have a versioned crt1 file.
4331 CmdArgs.push_back("-lcrt1.o");
4332 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004333 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4334 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004335 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004336 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004337 } else {
4338 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4339 CmdArgs.push_back("-lcrt1.o");
4340 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4341 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004342 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004343 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004344
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004345 // darwin_crt2 spec is empty.
4346 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004347 }
4348 }
4349 }
4350 }
4351
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004352 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4353 Args.hasArg(options::OPT_shared_libgcc) &&
4354 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004355 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004356 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004357 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004358 }
4359 }
4360
4361 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004362
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004363 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004364 // If we're building a dynamic lib with -fsanitize=address,
4365 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004366 // of them as dynamic_lookup. Linking executables is handled in
4367 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004368 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004369 if (Args.hasArg(options::OPT_dynamiclib) ||
4370 Args.hasArg(options::OPT_bundle)) {
4371 CmdArgs.push_back("-undefined");
4372 CmdArgs.push_back("dynamic_lookup");
4373 }
4374 }
4375
Daniel Dunbarc1964212009-03-26 16:23:12 +00004376 if (Args.hasArg(options::OPT_fopenmp))
4377 // This is more complicated in gcc...
4378 CmdArgs.push_back("-lgomp");
4379
Douglas Gregor9295df02012-05-15 21:00:27 +00004380 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4381
Bob Wilson16d93952012-05-15 18:57:39 +00004382 if (isObjCRuntimeLinked(Args) &&
4383 !Args.hasArg(options::OPT_nostdlib) &&
4384 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004385 // Avoid linking compatibility stubs on i386 mac.
4386 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004387 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004388 // If we don't have ARC or subscripting runtime support, link in the
4389 // runtime stubs. We have to do this *before* adding any of the normal
4390 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004391 ObjCRuntime runtime =
4392 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004393 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004394 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004395 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004396 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004397 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004398 CmdArgs.push_back("-framework");
4399 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004400 // Link libobj.
4401 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004402 }
John McCall31168b02011-06-15 23:02:42 +00004403
Daniel Dunbarc1964212009-03-26 16:23:12 +00004404 if (LinkingOutput) {
4405 CmdArgs.push_back("-arch_multiple");
4406 CmdArgs.push_back("-final_output");
4407 CmdArgs.push_back(LinkingOutput);
4408 }
4409
Daniel Dunbarc1964212009-03-26 16:23:12 +00004410 if (Args.hasArg(options::OPT_fnested_functions))
4411 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004412
Daniel Dunbarc1964212009-03-26 16:23:12 +00004413 if (!Args.hasArg(options::OPT_nostdlib) &&
4414 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004415 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004416 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004417
Daniel Dunbarc1964212009-03-26 16:23:12 +00004418 // link_ssp spec is empty.
4419
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004420 // Let the tool chain choose which runtime library to link.
4421 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004422 }
4423
Chad Rosier06fd3c62012-05-16 23:45:12 +00004424 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004425 !Args.hasArg(options::OPT_nostartfiles)) {
4426 // endfile_spec is empty.
4427 }
4428
4429 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4430 Args.AddAllArgs(CmdArgs, options::OPT_F);
4431
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004432 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004433 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004434 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004435}
4436
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004437void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004438 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004439 const InputInfoList &Inputs,
4440 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004441 const char *LinkingOutput) const {
4442 ArgStringList CmdArgs;
4443
4444 CmdArgs.push_back("-create");
4445 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004446
4447 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004448 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004449
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004450 for (InputInfoList::const_iterator
4451 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4452 const InputInfo &II = *it;
4453 assert(II.isFilename() && "Unexpected lipo input.");
4454 CmdArgs.push_back(II.getFilename());
4455 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004456 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004457 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004458 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004459}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004460
Daniel Dunbar88299622010-06-04 18:28:36 +00004461void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004462 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004463 const InputInfoList &Inputs,
4464 const ArgList &Args,
4465 const char *LinkingOutput) const {
4466 ArgStringList CmdArgs;
4467
Daniel Dunbareb86b042011-05-09 17:23:16 +00004468 CmdArgs.push_back("-o");
4469 CmdArgs.push_back(Output.getFilename());
4470
Daniel Dunbar88299622010-06-04 18:28:36 +00004471 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4472 const InputInfo &Input = Inputs[0];
4473 assert(Input.isFilename() && "Unexpected dsymutil input.");
4474 CmdArgs.push_back(Input.getFilename());
4475
Daniel Dunbar88299622010-06-04 18:28:36 +00004476 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004477 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004478 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004479}
4480
Eric Christopher551ef452011-08-23 17:56:55 +00004481void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004482 const InputInfo &Output,
4483 const InputInfoList &Inputs,
4484 const ArgList &Args,
4485 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004486 ArgStringList CmdArgs;
4487 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004488 CmdArgs.push_back("--debug-info");
4489 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004490 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004491
4492 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4493 const InputInfo &Input = Inputs[0];
4494 assert(Input.isFilename() && "Unexpected verify input");
4495
4496 // Grabbing the output of the earlier dsymutil run.
4497 CmdArgs.push_back(Input.getFilename());
4498
4499 const char *Exec =
4500 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4501 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4502}
4503
David Chisnallf571cde2012-02-15 13:39:01 +00004504void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4505 const InputInfo &Output,
4506 const InputInfoList &Inputs,
4507 const ArgList &Args,
4508 const char *LinkingOutput) const {
4509 ArgStringList CmdArgs;
4510
4511 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4512 options::OPT_Xassembler);
4513
4514 CmdArgs.push_back("-o");
4515 CmdArgs.push_back(Output.getFilename());
4516
4517 for (InputInfoList::const_iterator
4518 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4519 const InputInfo &II = *it;
4520 CmdArgs.push_back(II.getFilename());
4521 }
4522
4523 const char *Exec =
4524 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4525 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4526}
4527
4528
4529void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4530 const InputInfo &Output,
4531 const InputInfoList &Inputs,
4532 const ArgList &Args,
4533 const char *LinkingOutput) const {
4534 // FIXME: Find a real GCC, don't hard-code versions here
4535 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4536 const llvm::Triple &T = getToolChain().getTriple();
4537 std::string LibPath = "/usr/lib/";
4538 llvm::Triple::ArchType Arch = T.getArch();
4539 switch (Arch) {
4540 case llvm::Triple::x86:
4541 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4542 T.getOSName()).str() + "/4.5.2/";
4543 break;
4544 case llvm::Triple::x86_64:
4545 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4546 T.getOSName()).str();
4547 GCCLibPath += "/4.5.2/amd64/";
4548 LibPath += "amd64/";
4549 break;
4550 default:
4551 assert(0 && "Unsupported architecture");
4552 }
4553
4554 ArgStringList CmdArgs;
4555
David Chisnall272a0712012-02-29 15:06:12 +00004556 // Demangle C++ names in errors
4557 CmdArgs.push_back("-C");
4558
David Chisnallf571cde2012-02-15 13:39:01 +00004559 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4560 (!Args.hasArg(options::OPT_shared))) {
4561 CmdArgs.push_back("-e");
4562 CmdArgs.push_back("_start");
4563 }
4564
4565 if (Args.hasArg(options::OPT_static)) {
4566 CmdArgs.push_back("-Bstatic");
4567 CmdArgs.push_back("-dn");
4568 } else {
4569 CmdArgs.push_back("-Bdynamic");
4570 if (Args.hasArg(options::OPT_shared)) {
4571 CmdArgs.push_back("-shared");
4572 } else {
4573 CmdArgs.push_back("--dynamic-linker");
4574 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4575 }
4576 }
4577
4578 if (Output.isFilename()) {
4579 CmdArgs.push_back("-o");
4580 CmdArgs.push_back(Output.getFilename());
4581 } else {
4582 assert(Output.isNothing() && "Invalid output.");
4583 }
4584
4585 if (!Args.hasArg(options::OPT_nostdlib) &&
4586 !Args.hasArg(options::OPT_nostartfiles)) {
4587 if (!Args.hasArg(options::OPT_shared)) {
4588 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4589 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004590 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004591 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4592 } else {
4593 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004594 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4595 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004596 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004597 if (getToolChain().getDriver().CCCIsCXX)
4598 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004599 }
4600
4601 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4602
4603 Args.AddAllArgs(CmdArgs, options::OPT_L);
4604 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4605 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004606 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004607
4608 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4609
4610 if (!Args.hasArg(options::OPT_nostdlib) &&
4611 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004612 if (getToolChain().getDriver().CCCIsCXX)
4613 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004614 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004615 if (!Args.hasArg(options::OPT_shared)) {
4616 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004617 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004618 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004619 }
David Chisnallf571cde2012-02-15 13:39:01 +00004620 }
4621
4622 if (!Args.hasArg(options::OPT_nostdlib) &&
4623 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004624 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004625 }
David Chisnall96de9932012-02-16 16:00:47 +00004626 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004627
4628 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4629
4630 const char *Exec =
4631 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4632 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4633}
4634
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004635void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004636 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004637 const InputInfoList &Inputs,
4638 const ArgList &Args,
4639 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004640 ArgStringList CmdArgs;
4641
4642 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4643 options::OPT_Xassembler);
4644
4645 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004646 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004647
4648 for (InputInfoList::const_iterator
4649 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4650 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004651 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004652 }
4653
4654 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004655 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004656 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004657}
4658
4659void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004660 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004661 const InputInfoList &Inputs,
4662 const ArgList &Args,
4663 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004664 ArgStringList CmdArgs;
4665
4666 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004667 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004668 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004669 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004670 }
4671
4672 if (Args.hasArg(options::OPT_static)) {
4673 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004674 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004675 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004676// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004677 CmdArgs.push_back("-Bdynamic");
4678 if (Args.hasArg(options::OPT_shared)) {
4679 CmdArgs.push_back("-shared");
4680 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004681 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004682 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4683 }
4684 }
4685
Daniel Dunbarb440f562010-08-02 02:38:21 +00004686 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004687 CmdArgs.push_back("-o");
4688 CmdArgs.push_back(Output.getFilename());
4689 } else {
4690 assert(Output.isNothing() && "Invalid output.");
4691 }
4692
4693 if (!Args.hasArg(options::OPT_nostdlib) &&
4694 !Args.hasArg(options::OPT_nostartfiles)) {
4695 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004696 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004697 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004698 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004699 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004700 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004701 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004702 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004703 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004704 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004705 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004706 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004707 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004708 }
4709
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004710 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4711 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004712 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004713
4714 Args.AddAllArgs(CmdArgs, options::OPT_L);
4715 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4716 Args.AddAllArgs(CmdArgs, options::OPT_e);
4717
Daniel Dunbar54423b22010-09-17 00:24:54 +00004718 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004719
4720 if (!Args.hasArg(options::OPT_nostdlib) &&
4721 !Args.hasArg(options::OPT_nodefaultlibs)) {
4722 // FIXME: For some reason GCC passes -lgcc before adding
4723 // the default system libraries. Just mimic this for now.
4724 CmdArgs.push_back("-lgcc");
4725
4726 if (Args.hasArg(options::OPT_pthread))
4727 CmdArgs.push_back("-pthread");
4728 if (!Args.hasArg(options::OPT_shared))
4729 CmdArgs.push_back("-lc");
4730 CmdArgs.push_back("-lgcc");
4731 }
4732
4733 if (!Args.hasArg(options::OPT_nostdlib) &&
4734 !Args.hasArg(options::OPT_nostartfiles)) {
4735 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004736 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004737 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004738 }
4739
Bill Wendling08760582011-06-27 19:15:03 +00004740 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004741
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004742 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004743 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004744 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004745}
4746
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004747void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004748 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004749 const InputInfoList &Inputs,
4750 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004751 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004752 ArgStringList CmdArgs;
4753
4754 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4755 options::OPT_Xassembler);
4756
4757 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004758 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004759
4760 for (InputInfoList::const_iterator
4761 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4762 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004763 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004764 }
4765
4766 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004767 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004768 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004769}
4770
4771void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004772 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004773 const InputInfoList &Inputs,
4774 const ArgList &Args,
4775 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004776 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004777 ArgStringList CmdArgs;
4778
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004779 // Silence warning for "clang -g foo.o -o foo"
4780 Args.ClaimAllArgs(options::OPT_g_Group);
4781 // and "clang -emit-llvm foo.o -o foo"
4782 Args.ClaimAllArgs(options::OPT_emit_llvm);
4783 // and for "clang -w foo.o -o foo". Other warning options are already
4784 // handled somewhere else.
4785 Args.ClaimAllArgs(options::OPT_w);
4786
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004787 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004788 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004789 CmdArgs.push_back("-e");
4790 CmdArgs.push_back("__start");
4791 }
4792
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004793 if (Args.hasArg(options::OPT_static)) {
4794 CmdArgs.push_back("-Bstatic");
4795 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004796 if (Args.hasArg(options::OPT_rdynamic))
4797 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004798 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004799 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004800 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004801 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004802 } else {
4803 CmdArgs.push_back("-dynamic-linker");
4804 CmdArgs.push_back("/usr/libexec/ld.so");
4805 }
4806 }
4807
Daniel Dunbarb440f562010-08-02 02:38:21 +00004808 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004809 CmdArgs.push_back("-o");
4810 CmdArgs.push_back(Output.getFilename());
4811 } else {
4812 assert(Output.isNothing() && "Invalid output.");
4813 }
4814
4815 if (!Args.hasArg(options::OPT_nostdlib) &&
4816 !Args.hasArg(options::OPT_nostartfiles)) {
4817 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004818 if (Args.hasArg(options::OPT_pg))
4819 CmdArgs.push_back(Args.MakeArgString(
4820 getToolChain().GetFilePath("gcrt0.o")));
4821 else
4822 CmdArgs.push_back(Args.MakeArgString(
4823 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004824 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004825 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004826 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004827 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004828 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004829 }
4830 }
4831
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004832 std::string Triple = getToolChain().getTripleString();
4833 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004834 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004835 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004836 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004837
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004838 Args.AddAllArgs(CmdArgs, options::OPT_L);
4839 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4840 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004841 Args.AddAllArgs(CmdArgs, options::OPT_s);
4842 Args.AddAllArgs(CmdArgs, options::OPT_t);
4843 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4844 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004845
Daniel Dunbar54423b22010-09-17 00:24:54 +00004846 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004847
4848 if (!Args.hasArg(options::OPT_nostdlib) &&
4849 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004850 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004851 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004852 if (Args.hasArg(options::OPT_pg))
4853 CmdArgs.push_back("-lm_p");
4854 else
4855 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004856 }
4857
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004858 // FIXME: For some reason GCC passes -lgcc before adding
4859 // the default system libraries. Just mimic this for now.
4860 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004861
Eric Christopher17674ec2012-09-13 06:32:34 +00004862 if (Args.hasArg(options::OPT_pthread)) {
4863 if (!Args.hasArg(options::OPT_shared) &&
4864 Args.hasArg(options::OPT_pg))
4865 CmdArgs.push_back("-lpthread_p");
4866 else
4867 CmdArgs.push_back("-lpthread");
4868 }
4869
Chandler Carruth45661652011-12-17 22:32:42 +00004870 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004871 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004872 CmdArgs.push_back("-lc_p");
4873 else
4874 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004875 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004876
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004877 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004878 }
4879
4880 if (!Args.hasArg(options::OPT_nostdlib) &&
4881 !Args.hasArg(options::OPT_nostartfiles)) {
4882 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004883 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004884 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004885 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004886 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004887 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004888 }
4889
4890 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004891 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004893}
Ed Schoutene33194b2009-04-02 19:13:12 +00004894
Eli Friedman9fa28852012-08-08 23:57:20 +00004895void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4896 const InputInfo &Output,
4897 const InputInfoList &Inputs,
4898 const ArgList &Args,
4899 const char *LinkingOutput) const {
4900 ArgStringList CmdArgs;
4901
4902 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4903 options::OPT_Xassembler);
4904
4905 CmdArgs.push_back("-o");
4906 CmdArgs.push_back(Output.getFilename());
4907
4908 for (InputInfoList::const_iterator
4909 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4910 const InputInfo &II = *it;
4911 CmdArgs.push_back(II.getFilename());
4912 }
4913
4914 const char *Exec =
4915 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4916 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4917}
4918
4919void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4920 const InputInfo &Output,
4921 const InputInfoList &Inputs,
4922 const ArgList &Args,
4923 const char *LinkingOutput) const {
4924 const Driver &D = getToolChain().getDriver();
4925 ArgStringList CmdArgs;
4926
4927 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4928 (!Args.hasArg(options::OPT_shared))) {
4929 CmdArgs.push_back("-e");
4930 CmdArgs.push_back("__start");
4931 }
4932
4933 if (Args.hasArg(options::OPT_static)) {
4934 CmdArgs.push_back("-Bstatic");
4935 } else {
4936 if (Args.hasArg(options::OPT_rdynamic))
4937 CmdArgs.push_back("-export-dynamic");
4938 CmdArgs.push_back("--eh-frame-hdr");
4939 CmdArgs.push_back("-Bdynamic");
4940 if (Args.hasArg(options::OPT_shared)) {
4941 CmdArgs.push_back("-shared");
4942 } else {
4943 CmdArgs.push_back("-dynamic-linker");
4944 CmdArgs.push_back("/usr/libexec/ld.so");
4945 }
4946 }
4947
4948 if (Output.isFilename()) {
4949 CmdArgs.push_back("-o");
4950 CmdArgs.push_back(Output.getFilename());
4951 } else {
4952 assert(Output.isNothing() && "Invalid output.");
4953 }
4954
4955 if (!Args.hasArg(options::OPT_nostdlib) &&
4956 !Args.hasArg(options::OPT_nostartfiles)) {
4957 if (!Args.hasArg(options::OPT_shared)) {
4958 if (Args.hasArg(options::OPT_pg))
4959 CmdArgs.push_back(Args.MakeArgString(
4960 getToolChain().GetFilePath("gcrt0.o")));
4961 else
4962 CmdArgs.push_back(Args.MakeArgString(
4963 getToolChain().GetFilePath("crt0.o")));
4964 CmdArgs.push_back(Args.MakeArgString(
4965 getToolChain().GetFilePath("crtbegin.o")));
4966 } else {
4967 CmdArgs.push_back(Args.MakeArgString(
4968 getToolChain().GetFilePath("crtbeginS.o")));
4969 }
4970 }
4971
4972 Args.AddAllArgs(CmdArgs, options::OPT_L);
4973 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4974 Args.AddAllArgs(CmdArgs, options::OPT_e);
4975
4976 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4977
4978 if (!Args.hasArg(options::OPT_nostdlib) &&
4979 !Args.hasArg(options::OPT_nodefaultlibs)) {
4980 if (D.CCCIsCXX) {
4981 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4982 if (Args.hasArg(options::OPT_pg))
4983 CmdArgs.push_back("-lm_p");
4984 else
4985 CmdArgs.push_back("-lm");
4986 }
4987
Rafael Espindola1ad26f02012-10-23 17:07:31 +00004988 if (Args.hasArg(options::OPT_pthread)) {
4989 if (!Args.hasArg(options::OPT_shared) &&
4990 Args.hasArg(options::OPT_pg))
4991 CmdArgs.push_back("-lpthread_p");
4992 else
4993 CmdArgs.push_back("-lpthread");
4994 }
4995
Eli Friedman9fa28852012-08-08 23:57:20 +00004996 if (!Args.hasArg(options::OPT_shared)) {
4997 if (Args.hasArg(options::OPT_pg))
4998 CmdArgs.push_back("-lc_p");
4999 else
5000 CmdArgs.push_back("-lc");
5001 }
5002
5003 std::string myarch = "-lclang_rt.";
5004 const llvm::Triple &T = getToolChain().getTriple();
5005 llvm::Triple::ArchType Arch = T.getArch();
5006 switch (Arch) {
5007 case llvm::Triple::arm:
5008 myarch += ("arm");
5009 break;
5010 case llvm::Triple::x86:
5011 myarch += ("i386");
5012 break;
5013 case llvm::Triple::x86_64:
5014 myarch += ("amd64");
5015 break;
5016 default:
5017 assert(0 && "Unsupported architecture");
5018 }
5019 CmdArgs.push_back(Args.MakeArgString(myarch));
5020 }
5021
5022 if (!Args.hasArg(options::OPT_nostdlib) &&
5023 !Args.hasArg(options::OPT_nostartfiles)) {
5024 if (!Args.hasArg(options::OPT_shared))
5025 CmdArgs.push_back(Args.MakeArgString(
5026 getToolChain().GetFilePath("crtend.o")));
5027 else
5028 CmdArgs.push_back(Args.MakeArgString(
5029 getToolChain().GetFilePath("crtendS.o")));
5030 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005031
5032 const char *Exec =
5033 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5034 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005035}
5036
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005037void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005038 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005039 const InputInfoList &Inputs,
5040 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005041 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005042 ArgStringList CmdArgs;
5043
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005044 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5045 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005046 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005047 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005048 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005049 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005050 else if (getToolChain().getArch() == llvm::Triple::mips ||
5051 getToolChain().getArch() == llvm::Triple::mipsel ||
5052 getToolChain().getArch() == llvm::Triple::mips64 ||
5053 getToolChain().getArch() == llvm::Triple::mips64el) {
5054 StringRef CPUName;
5055 StringRef ABIName;
5056 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005057
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005058 CmdArgs.push_back("-march");
5059 CmdArgs.push_back(CPUName.data());
5060
5061 // Convert ABI name to the GNU tools acceptable variant.
5062 if (ABIName == "o32")
5063 ABIName = "32";
5064 else if (ABIName == "n64")
5065 ABIName = "64";
5066
5067 CmdArgs.push_back("-mabi");
5068 CmdArgs.push_back(ABIName.data());
5069
5070 if (getToolChain().getArch() == llvm::Triple::mips ||
5071 getToolChain().getArch() == llvm::Triple::mips64)
5072 CmdArgs.push_back("-EB");
5073 else
5074 CmdArgs.push_back("-EL");
5075
5076 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5077 options::OPT_fpic, options::OPT_fno_pic,
5078 options::OPT_fPIE, options::OPT_fno_PIE,
5079 options::OPT_fpie, options::OPT_fno_pie);
5080 if (LastPICArg &&
5081 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5082 LastPICArg->getOption().matches(options::OPT_fpic) ||
5083 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5084 LastPICArg->getOption().matches(options::OPT_fpie))) {
5085 CmdArgs.push_back("-KPIC");
5086 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005087 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5088 getToolChain().getArch() == llvm::Triple::thumb) {
5089 CmdArgs.push_back("-mfpu=softvfp");
5090 switch(getToolChain().getTriple().getEnvironment()) {
5091 case llvm::Triple::GNUEABI:
5092 case llvm::Triple::EABI:
5093 break;
5094
5095 default:
5096 CmdArgs.push_back("-matpcs");
5097 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005098 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005099
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005100 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5101 options::OPT_Xassembler);
5102
5103 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005104 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005105
5106 for (InputInfoList::const_iterator
5107 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5108 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005109 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005110 }
5111
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005112 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005113 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005114 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005115}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005116
5117void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005118 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005119 const InputInfoList &Inputs,
5120 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005121 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005122 const toolchains::FreeBSD& ToolChain =
5123 static_cast<const toolchains::FreeBSD&>(getToolChain());
5124 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005125 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005126
5127 // Silence warning for "clang -g foo.o -o foo"
5128 Args.ClaimAllArgs(options::OPT_g_Group);
5129 // and "clang -emit-llvm foo.o -o foo"
5130 Args.ClaimAllArgs(options::OPT_emit_llvm);
5131 // and for "clang -w foo.o -o foo". Other warning options are already
5132 // handled somewhere else.
5133 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005134
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005135 if (!D.SysRoot.empty())
5136 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5137
Roman Divackyafe2f232012-08-28 15:09:03 +00005138 if (Args.hasArg(options::OPT_pie))
5139 CmdArgs.push_back("-pie");
5140
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005141 if (Args.hasArg(options::OPT_static)) {
5142 CmdArgs.push_back("-Bstatic");
5143 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005144 if (Args.hasArg(options::OPT_rdynamic))
5145 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005146 CmdArgs.push_back("--eh-frame-hdr");
5147 if (Args.hasArg(options::OPT_shared)) {
5148 CmdArgs.push_back("-Bshareable");
5149 } else {
5150 CmdArgs.push_back("-dynamic-linker");
5151 CmdArgs.push_back("/libexec/ld-elf.so.1");
5152 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005153 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5154 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005155 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5156 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5157 CmdArgs.push_back("--hash-style=both");
5158 }
5159 }
5160 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005161 }
5162
5163 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5164 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005165 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005166 CmdArgs.push_back("-m");
5167 CmdArgs.push_back("elf_i386_fbsd");
5168 }
5169
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005170 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005171 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005172 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005173 }
5174
Daniel Dunbarb440f562010-08-02 02:38:21 +00005175 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005176 CmdArgs.push_back("-o");
5177 CmdArgs.push_back(Output.getFilename());
5178 } else {
5179 assert(Output.isNothing() && "Invalid output.");
5180 }
5181
5182 if (!Args.hasArg(options::OPT_nostdlib) &&
5183 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005184 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005185 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005186 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005187 crt1 = "gcrt1.o";
5188 else if (Args.hasArg(options::OPT_pie))
5189 crt1 = "Scrt1.o";
5190 else
5191 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005192 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005193 if (crt1)
5194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5195
5196 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5197
5198 const char *crtbegin = NULL;
5199 if (Args.hasArg(options::OPT_static))
5200 crtbegin = "crtbeginT.o";
5201 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5202 crtbegin = "crtbeginS.o";
5203 else
5204 crtbegin = "crtbegin.o";
5205
5206 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005207 }
5208
5209 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005210 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005211 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5212 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005213 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005214 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5215 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005216 Args.AddAllArgs(CmdArgs, options::OPT_s);
5217 Args.AddAllArgs(CmdArgs, options::OPT_t);
5218 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5219 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005220
Roman Divackyafe2f232012-08-28 15:09:03 +00005221 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005222
5223 if (!Args.hasArg(options::OPT_nostdlib) &&
5224 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005225 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005226 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005227 if (Args.hasArg(options::OPT_pg))
5228 CmdArgs.push_back("-lm_p");
5229 else
5230 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005231 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005232 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5233 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005234 if (Args.hasArg(options::OPT_pg))
5235 CmdArgs.push_back("-lgcc_p");
5236 else
5237 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005238 if (Args.hasArg(options::OPT_static)) {
5239 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005240 } else if (Args.hasArg(options::OPT_pg)) {
5241 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005242 } else {
5243 CmdArgs.push_back("--as-needed");
5244 CmdArgs.push_back("-lgcc_s");
5245 CmdArgs.push_back("--no-as-needed");
5246 }
5247
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005248 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005249 if (Args.hasArg(options::OPT_pg))
5250 CmdArgs.push_back("-lpthread_p");
5251 else
5252 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005253 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005254
Roman Divacky66f22762011-02-10 16:59:40 +00005255 if (Args.hasArg(options::OPT_pg)) {
5256 if (Args.hasArg(options::OPT_shared))
5257 CmdArgs.push_back("-lc");
5258 else
5259 CmdArgs.push_back("-lc_p");
5260 CmdArgs.push_back("-lgcc_p");
5261 } else {
5262 CmdArgs.push_back("-lc");
5263 CmdArgs.push_back("-lgcc");
5264 }
5265
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005266 if (Args.hasArg(options::OPT_static)) {
5267 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005268 } else if (Args.hasArg(options::OPT_pg)) {
5269 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005270 } else {
5271 CmdArgs.push_back("--as-needed");
5272 CmdArgs.push_back("-lgcc_s");
5273 CmdArgs.push_back("--no-as-needed");
5274 }
5275 }
5276
5277 if (!Args.hasArg(options::OPT_nostdlib) &&
5278 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005279 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005280 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005281 else
5282 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005283 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005284 }
5285
Roman Divackyafe2f232012-08-28 15:09:03 +00005286 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005287
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005288 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005289 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005290 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005291}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005292
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005293void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5294 const InputInfo &Output,
5295 const InputInfoList &Inputs,
5296 const ArgList &Args,
5297 const char *LinkingOutput) const {
5298 ArgStringList CmdArgs;
5299
5300 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5301 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005302 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005303 CmdArgs.push_back("--32");
5304
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005305 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005306 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005307 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005308 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005309 CmdArgs.push_back("-EL");
5310
5311 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5312 options::OPT_Xassembler);
5313
5314 CmdArgs.push_back("-o");
5315 CmdArgs.push_back(Output.getFilename());
5316
5317 for (InputInfoList::const_iterator
5318 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5319 const InputInfo &II = *it;
5320 CmdArgs.push_back(II.getFilename());
5321 }
5322
David Chisnallddbd68f2011-09-27 22:03:18 +00005323 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005324 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5325}
5326
5327void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5328 const InputInfo &Output,
5329 const InputInfoList &Inputs,
5330 const ArgList &Args,
5331 const char *LinkingOutput) const {
5332 const Driver &D = getToolChain().getDriver();
5333 ArgStringList CmdArgs;
5334
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005335 if (!D.SysRoot.empty())
5336 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5337
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005338 if (Args.hasArg(options::OPT_static)) {
5339 CmdArgs.push_back("-Bstatic");
5340 } else {
5341 if (Args.hasArg(options::OPT_rdynamic))
5342 CmdArgs.push_back("-export-dynamic");
5343 CmdArgs.push_back("--eh-frame-hdr");
5344 if (Args.hasArg(options::OPT_shared)) {
5345 CmdArgs.push_back("-Bshareable");
5346 } else {
5347 CmdArgs.push_back("-dynamic-linker");
5348 CmdArgs.push_back("/libexec/ld.elf_so");
5349 }
5350 }
5351
5352 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5353 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005354 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005355 CmdArgs.push_back("-m");
5356 CmdArgs.push_back("elf_i386");
5357 }
5358
5359 if (Output.isFilename()) {
5360 CmdArgs.push_back("-o");
5361 CmdArgs.push_back(Output.getFilename());
5362 } else {
5363 assert(Output.isNothing() && "Invalid output.");
5364 }
5365
5366 if (!Args.hasArg(options::OPT_nostdlib) &&
5367 !Args.hasArg(options::OPT_nostartfiles)) {
5368 if (!Args.hasArg(options::OPT_shared)) {
5369 CmdArgs.push_back(Args.MakeArgString(
5370 getToolChain().GetFilePath("crt0.o")));
5371 CmdArgs.push_back(Args.MakeArgString(
5372 getToolChain().GetFilePath("crti.o")));
5373 CmdArgs.push_back(Args.MakeArgString(
5374 getToolChain().GetFilePath("crtbegin.o")));
5375 } else {
5376 CmdArgs.push_back(Args.MakeArgString(
5377 getToolChain().GetFilePath("crti.o")));
5378 CmdArgs.push_back(Args.MakeArgString(
5379 getToolChain().GetFilePath("crtbeginS.o")));
5380 }
5381 }
5382
5383 Args.AddAllArgs(CmdArgs, options::OPT_L);
5384 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5385 Args.AddAllArgs(CmdArgs, options::OPT_e);
5386 Args.AddAllArgs(CmdArgs, options::OPT_s);
5387 Args.AddAllArgs(CmdArgs, options::OPT_t);
5388 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5389 Args.AddAllArgs(CmdArgs, options::OPT_r);
5390
5391 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5392
5393 if (!Args.hasArg(options::OPT_nostdlib) &&
5394 !Args.hasArg(options::OPT_nodefaultlibs)) {
5395 if (D.CCCIsCXX) {
5396 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5397 CmdArgs.push_back("-lm");
5398 }
5399 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5400 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005401 if (Args.hasArg(options::OPT_static)) {
5402 CmdArgs.push_back("-lgcc_eh");
5403 } else {
5404 CmdArgs.push_back("--as-needed");
5405 CmdArgs.push_back("-lgcc_s");
5406 CmdArgs.push_back("--no-as-needed");
5407 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005408 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005409
5410 if (Args.hasArg(options::OPT_pthread))
5411 CmdArgs.push_back("-lpthread");
5412 CmdArgs.push_back("-lc");
5413
5414 CmdArgs.push_back("-lgcc");
5415 if (Args.hasArg(options::OPT_static)) {
5416 CmdArgs.push_back("-lgcc_eh");
5417 } else {
5418 CmdArgs.push_back("--as-needed");
5419 CmdArgs.push_back("-lgcc_s");
5420 CmdArgs.push_back("--no-as-needed");
5421 }
5422 }
5423
5424 if (!Args.hasArg(options::OPT_nostdlib) &&
5425 !Args.hasArg(options::OPT_nostartfiles)) {
5426 if (!Args.hasArg(options::OPT_shared))
5427 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5428 "crtend.o")));
5429 else
5430 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5431 "crtendS.o")));
5432 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5433 "crtn.o")));
5434 }
5435
Bill Wendling08760582011-06-27 19:15:03 +00005436 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005437
David Chisnallddbd68f2011-09-27 22:03:18 +00005438 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005439 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5440}
5441
Rafael Espindola92b00932010-08-10 00:25:48 +00005442void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5443 const InputInfo &Output,
5444 const InputInfoList &Inputs,
5445 const ArgList &Args,
5446 const char *LinkingOutput) const {
5447 ArgStringList CmdArgs;
5448
5449 // Add --32/--64 to make sure we get the format we want.
5450 // This is incomplete
5451 if (getToolChain().getArch() == llvm::Triple::x86) {
5452 CmdArgs.push_back("--32");
5453 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5454 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005455 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5456 CmdArgs.push_back("-a32");
5457 CmdArgs.push_back("-mppc");
5458 CmdArgs.push_back("-many");
5459 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5460 CmdArgs.push_back("-a64");
5461 CmdArgs.push_back("-mppc64");
5462 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005463 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005464 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005465 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5466 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005467
5468 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5469 getToolChain().getTriple());
5470 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005471
5472 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5473 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5474 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005475 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5476 getToolChain().getArch() == llvm::Triple::mipsel ||
5477 getToolChain().getArch() == llvm::Triple::mips64 ||
5478 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005479 StringRef CPUName;
5480 StringRef ABIName;
5481 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005482
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005483 CmdArgs.push_back("-march");
5484 CmdArgs.push_back(CPUName.data());
5485
5486 // Convert ABI name to the GNU tools acceptable variant.
5487 if (ABIName == "o32")
5488 ABIName = "32";
5489 else if (ABIName == "n64")
5490 ABIName = "64";
5491
5492 CmdArgs.push_back("-mabi");
5493 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005494
5495 if (getToolChain().getArch() == llvm::Triple::mips ||
5496 getToolChain().getArch() == llvm::Triple::mips64)
5497 CmdArgs.push_back("-EB");
5498 else
5499 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005500
5501 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5502 options::OPT_fpic, options::OPT_fno_pic,
5503 options::OPT_fPIE, options::OPT_fno_PIE,
5504 options::OPT_fpie, options::OPT_fno_pie);
5505 if (LastPICArg &&
5506 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5507 LastPICArg->getOption().matches(options::OPT_fpic) ||
5508 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5509 LastPICArg->getOption().matches(options::OPT_fpie))) {
5510 CmdArgs.push_back("-KPIC");
5511 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005512 }
5513
5514 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5515 options::OPT_Xassembler);
5516
5517 CmdArgs.push_back("-o");
5518 CmdArgs.push_back(Output.getFilename());
5519
5520 for (InputInfoList::const_iterator
5521 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5522 const InputInfo &II = *it;
5523 CmdArgs.push_back(II.getFilename());
5524 }
5525
5526 const char *Exec =
5527 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5528 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5529}
5530
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005531static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5532 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005533 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien3d3373c2012-11-19 12:04:11 +00005534 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5535 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolacc354322011-10-17 21:39:04 +00005536 if (!D.CCCIsCXX)
5537 CmdArgs.push_back("-lgcc");
5538
Logan Chien3d3373c2012-11-19 12:04:11 +00005539 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005540 if (D.CCCIsCXX)
5541 CmdArgs.push_back("-lgcc");
5542 } else {
5543 if (!D.CCCIsCXX)
5544 CmdArgs.push_back("--as-needed");
5545 CmdArgs.push_back("-lgcc_s");
5546 if (!D.CCCIsCXX)
5547 CmdArgs.push_back("--no-as-needed");
5548 }
5549
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005550 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005551 CmdArgs.push_back("-lgcc_eh");
5552 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5553 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005554
5555 // According to Android ABI, we have to link with libdl if we are
5556 // linking with non-static libgcc.
5557 //
5558 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5559 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5560 if (isAndroid && !StaticLibgcc)
5561 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005562}
5563
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005564static bool hasMipsN32ABIArg(const ArgList &Args) {
5565 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005566 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005567}
5568
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005569void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5570 const InputInfo &Output,
5571 const InputInfoList &Inputs,
5572 const ArgList &Args,
5573 const char *LinkingOutput) const {
5574 const toolchains::Linux& ToolChain =
5575 static_cast<const toolchains::Linux&>(getToolChain());
5576 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005577 const bool isAndroid =
5578 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005579
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005580 ArgStringList CmdArgs;
5581
Rafael Espindolad1002f62010-11-15 18:28:16 +00005582 // Silence warning for "clang -g foo.o -o foo"
5583 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005584 // and "clang -emit-llvm foo.o -o foo"
5585 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005586 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005587 // handled somewhere else.
5588 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005589
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005590 if (!D.SysRoot.empty())
5591 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005592
Peter Collingbourne24c67c62013-01-17 20:17:16 +00005593 if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared))
Rafael Espindolad47ac232010-11-17 22:26:15 +00005594 CmdArgs.push_back("-pie");
5595
Rafael Espindola1c76c592010-11-07 22:57:16 +00005596 if (Args.hasArg(options::OPT_rdynamic))
5597 CmdArgs.push_back("-export-dynamic");
5598
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005599 if (Args.hasArg(options::OPT_s))
5600 CmdArgs.push_back("-s");
5601
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005602 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5603 e = ToolChain.ExtraOpts.end();
5604 i != e; ++i)
5605 CmdArgs.push_back(i->c_str());
5606
5607 if (!Args.hasArg(options::OPT_static)) {
5608 CmdArgs.push_back("--eh-frame-hdr");
5609 }
5610
5611 CmdArgs.push_back("-m");
5612 if (ToolChain.getArch() == llvm::Triple::x86)
5613 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005614 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5615 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005616 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005617 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005618 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005619 else if (ToolChain.getArch() == llvm::Triple::ppc)
5620 CmdArgs.push_back("elf32ppclinux");
5621 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5622 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005623 else if (ToolChain.getArch() == llvm::Triple::mips)
5624 CmdArgs.push_back("elf32btsmip");
5625 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5626 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005627 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5628 if (hasMipsN32ABIArg(Args))
5629 CmdArgs.push_back("elf32btsmipn32");
5630 else
5631 CmdArgs.push_back("elf64btsmip");
5632 }
5633 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5634 if (hasMipsN32ABIArg(Args))
5635 CmdArgs.push_back("elf32ltsmipn32");
5636 else
5637 CmdArgs.push_back("elf64ltsmip");
5638 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005639 else
5640 CmdArgs.push_back("elf_x86_64");
5641
5642 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005643 if (ToolChain.getArch() == llvm::Triple::arm
5644 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005645 CmdArgs.push_back("-Bstatic");
5646 else
5647 CmdArgs.push_back("-static");
5648 } else if (Args.hasArg(options::OPT_shared)) {
5649 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005650 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005651 CmdArgs.push_back("-Bsymbolic");
5652 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005653 }
5654
5655 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005656 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005657 (!Args.hasArg(options::OPT_static) &&
5658 !Args.hasArg(options::OPT_shared))) {
5659 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005660 if (isAndroid)
5661 CmdArgs.push_back("/system/bin/linker");
5662 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005663 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005664 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5665 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005666 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005667 ToolChain.getArch() == llvm::Triple::thumb) {
5668 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5669 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5670 else
5671 CmdArgs.push_back("/lib/ld-linux.so.3");
5672 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005673 else if (ToolChain.getArch() == llvm::Triple::mips ||
5674 ToolChain.getArch() == llvm::Triple::mipsel)
5675 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005676 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005677 ToolChain.getArch() == llvm::Triple::mips64el) {
5678 if (hasMipsN32ABIArg(Args))
5679 CmdArgs.push_back("/lib32/ld.so.1");
5680 else
5681 CmdArgs.push_back("/lib64/ld.so.1");
5682 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005683 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005684 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005685 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005686 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005687 else
5688 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5689 }
5690
5691 CmdArgs.push_back("-o");
5692 CmdArgs.push_back(Output.getFilename());
5693
Rafael Espindola81937ec2010-12-01 01:52:43 +00005694 if (!Args.hasArg(options::OPT_nostdlib) &&
5695 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005696 if (!isAndroid) {
5697 const char *crt1 = NULL;
5698 if (!Args.hasArg(options::OPT_shared)){
5699 if (Args.hasArg(options::OPT_pie))
5700 crt1 = "Scrt1.o";
5701 else
5702 crt1 = "crt1.o";
5703 }
5704 if (crt1)
5705 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005706
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005707 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5708 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005709
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005710 const char *crtbegin;
5711 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005712 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005713 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005714 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005715 else if (Args.hasArg(options::OPT_pie))
5716 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005717 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005718 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005719 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005720
5721 // Add crtfastmath.o if available and fast math is enabled.
5722 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005723 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005724
5725 Args.AddAllArgs(CmdArgs, options::OPT_L);
5726
5727 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5728
Roman Divackyee8188a2011-03-01 17:53:14 +00005729 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5730 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005731 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005732
Rafael Espindola9446d762012-04-09 23:53:34 +00005733 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5734 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5735 // forward.
5736 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5737 CmdArgs.push_back("-plugin");
5738 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5739 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00005740
5741 // Try to pass driver level flags relevant to LTO code generation down to
5742 // the plugin.
5743
5744 // Handle architecture-specific flags for selecting CPU variants.
5745 if (ToolChain.getArch() == llvm::Triple::x86 ||
5746 ToolChain.getArch() == llvm::Triple::x86_64)
5747 CmdArgs.push_back(
5748 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5749 getX86TargetCPU(Args, ToolChain.getTriple())));
5750 else if (ToolChain.getArch() == llvm::Triple::arm ||
5751 ToolChain.getArch() == llvm::Triple::thumb)
5752 CmdArgs.push_back(
5753 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5754 getARMTargetCPU(Args, ToolChain.getTriple())));
5755
5756 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
5757 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00005758 }
5759
Chandler Carruth953fb082013-01-13 11:46:33 +00005760
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005761 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5762 CmdArgs.push_back("--no-demangle");
5763
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005764 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5765
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005766 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005767
Eric Christopher04997782012-11-29 18:51:05 +00005768 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005769 if (Sanitize.needsUbsanRt())
5770 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Eric Christopher04997782012-11-29 18:51:05 +00005771 if (Sanitize.needsAsanRt())
5772 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5773 if (Sanitize.needsTsanRt())
5774 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00005775 if (Sanitize.needsMsanRt())
5776 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005777
Chandler Carruth94a32012012-05-14 18:31:18 +00005778 if (D.CCCIsCXX &&
5779 !Args.hasArg(options::OPT_nostdlib) &&
5780 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005781 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5782 !Args.hasArg(options::OPT_static);
5783 if (OnlyLibstdcxxStatic)
5784 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005785 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005786 if (OnlyLibstdcxxStatic)
5787 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005788 CmdArgs.push_back("-lm");
5789 }
5790
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005791 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005792 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5793 if (Args.hasArg(options::OPT_static))
5794 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005795
Chandler Carruth01538002013-01-17 13:19:29 +00005796 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
5797 if (OpenMP) {
5798 CmdArgs.push_back("-lgomp");
5799
5800 // FIXME: Exclude this for platforms whith libgomp that doesn't require
5801 // librt. Most modern Linux platfroms require it, but some may not.
5802 CmdArgs.push_back("-lrt");
5803 }
5804
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005805 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005806
Chandler Carruth94a32012012-05-14 18:31:18 +00005807 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00005808 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00005809 CmdArgs.push_back("-lpthread");
5810
5811 CmdArgs.push_back("-lc");
5812
5813 if (Args.hasArg(options::OPT_static))
5814 CmdArgs.push_back("--end-group");
5815 else
5816 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5817 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005818
Rafael Espindola81937ec2010-12-01 01:52:43 +00005819 if (!Args.hasArg(options::OPT_nostartfiles)) {
5820 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005821 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005822 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005823 else if (Args.hasArg(options::OPT_pie))
5824 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005825 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005826 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005827
Rafael Espindola81937ec2010-12-01 01:52:43 +00005828 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005829 if (!isAndroid)
5830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005831 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005832 }
5833
Bill Wendling08760582011-06-27 19:15:03 +00005834 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005835
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005836 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5837}
Rafael Espindola92b00932010-08-10 00:25:48 +00005838
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00005839void linuxtools::SplitDebug::ConstructJob(Compilation &C, const JobAction &JA,
5840 const InputInfo &Output,
5841 const InputInfoList &Inputs,
5842 const ArgList &Args,
5843 const char *LinkingOutput) const {
5844 // Assert some invariants.
5845 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5846 const InputInfo &Input = Inputs[0];
5847 assert(Input.isFilename() && "Unexpected verify input");
5848
5849 ArgStringList ExtractArgs;
5850 ExtractArgs.push_back("--extract-dwo");
5851
5852 ArgStringList StripArgs;
5853 StripArgs.push_back("--strip-dwo");
5854
5855 // Grabbing the output of the earlier compile step.
5856 StripArgs.push_back(Input.getFilename());
5857 ExtractArgs.push_back(Input.getFilename());
5858
5859 // Add an output for the extract.
5860 SmallString<128> T(Inputs[0].getBaseInput());
5861 llvm::sys::path::replace_extension(T, "dwo");
5862 const char *OutFile = Args.MakeArgString(T);
5863 ExtractArgs.push_back(OutFile);
5864
5865 const char *Exec =
5866 Args.MakeArgString(getToolChain().GetProgramPath("objcopy"));
5867
5868 // First extract the dwo sections.
5869 C.addCommand(new Command(JA, *this, Exec, ExtractArgs));
5870
5871 // Then remove them from the original .o file.
5872 C.addCommand(new Command(JA, *this, Exec, StripArgs));
5873}
5874
Chris Lattner3e2ee142010-07-07 16:01:42 +00005875void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005876 const InputInfo &Output,
5877 const InputInfoList &Inputs,
5878 const ArgList &Args,
5879 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005880 ArgStringList CmdArgs;
5881
5882 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5883 options::OPT_Xassembler);
5884
5885 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005886 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005887
5888 for (InputInfoList::const_iterator
5889 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5890 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005891 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005892 }
5893
5894 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005895 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005896 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005897}
5898
5899void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005900 const InputInfo &Output,
5901 const InputInfoList &Inputs,
5902 const ArgList &Args,
5903 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005904 const Driver &D = getToolChain().getDriver();
5905 ArgStringList CmdArgs;
5906
Daniel Dunbarb440f562010-08-02 02:38:21 +00005907 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005908 CmdArgs.push_back("-o");
5909 CmdArgs.push_back(Output.getFilename());
5910 } else {
5911 assert(Output.isNothing() && "Invalid output.");
5912 }
5913
5914 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005915 !Args.hasArg(options::OPT_nostartfiles)) {
5916 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5917 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5918 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5919 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5920 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005921
5922 Args.AddAllArgs(CmdArgs, options::OPT_L);
5923 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5924 Args.AddAllArgs(CmdArgs, options::OPT_e);
5925
Daniel Dunbar54423b22010-09-17 00:24:54 +00005926 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005927
Eli Friedman83de5132011-12-08 23:54:21 +00005928 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5929
Chris Lattner3e2ee142010-07-07 16:01:42 +00005930 if (!Args.hasArg(options::OPT_nostdlib) &&
5931 !Args.hasArg(options::OPT_nodefaultlibs)) {
5932 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005933 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005934 CmdArgs.push_back("-lm");
5935 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005936 }
5937
5938 if (!Args.hasArg(options::OPT_nostdlib) &&
5939 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005940 if (Args.hasArg(options::OPT_pthread))
5941 CmdArgs.push_back("-lpthread");
5942 CmdArgs.push_back("-lc");
5943 CmdArgs.push_back("-lCompilerRT-Generic");
5944 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5945 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00005946 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005947 }
5948
Eli Friedman83de5132011-12-08 23:54:21 +00005949 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005950 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005951}
5952
Daniel Dunbarcc912342009-05-02 18:28:39 +00005953/// DragonFly Tools
5954
5955// For now, DragonFly Assemble does just about the same as for
5956// FreeBSD, but this may change soon.
5957void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005958 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005959 const InputInfoList &Inputs,
5960 const ArgList &Args,
5961 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005962 ArgStringList CmdArgs;
5963
5964 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5965 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005966 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00005967 CmdArgs.push_back("--32");
5968
5969 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5970 options::OPT_Xassembler);
5971
5972 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005973 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005974
5975 for (InputInfoList::const_iterator
5976 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5977 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005978 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005979 }
5980
5981 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005982 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005983 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005984}
5985
5986void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005987 const InputInfo &Output,
5988 const InputInfoList &Inputs,
5989 const ArgList &Args,
5990 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005991 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005992 ArgStringList CmdArgs;
5993
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005994 if (!D.SysRoot.empty())
5995 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5996
Daniel Dunbarcc912342009-05-02 18:28:39 +00005997 if (Args.hasArg(options::OPT_static)) {
5998 CmdArgs.push_back("-Bstatic");
5999 } else {
6000 if (Args.hasArg(options::OPT_shared))
6001 CmdArgs.push_back("-Bshareable");
6002 else {
6003 CmdArgs.push_back("-dynamic-linker");
6004 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6005 }
6006 }
6007
6008 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6009 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006010 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006011 CmdArgs.push_back("-m");
6012 CmdArgs.push_back("elf_i386");
6013 }
6014
Daniel Dunbarb440f562010-08-02 02:38:21 +00006015 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006016 CmdArgs.push_back("-o");
6017 CmdArgs.push_back(Output.getFilename());
6018 } else {
6019 assert(Output.isNothing() && "Invalid output.");
6020 }
6021
6022 if (!Args.hasArg(options::OPT_nostdlib) &&
6023 !Args.hasArg(options::OPT_nostartfiles)) {
6024 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006025 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006026 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006027 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006028 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006029 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006030 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006031 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006032 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006033 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006034 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006035 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006036 }
6037 }
6038
6039 Args.AddAllArgs(CmdArgs, options::OPT_L);
6040 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6041 Args.AddAllArgs(CmdArgs, options::OPT_e);
6042
Daniel Dunbar54423b22010-09-17 00:24:54 +00006043 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006044
6045 if (!Args.hasArg(options::OPT_nostdlib) &&
6046 !Args.hasArg(options::OPT_nodefaultlibs)) {
6047 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6048 // rpaths
6049 CmdArgs.push_back("-L/usr/lib/gcc41");
6050
6051 if (!Args.hasArg(options::OPT_static)) {
6052 CmdArgs.push_back("-rpath");
6053 CmdArgs.push_back("/usr/lib/gcc41");
6054
6055 CmdArgs.push_back("-rpath-link");
6056 CmdArgs.push_back("/usr/lib/gcc41");
6057
6058 CmdArgs.push_back("-rpath");
6059 CmdArgs.push_back("/usr/lib");
6060
6061 CmdArgs.push_back("-rpath-link");
6062 CmdArgs.push_back("/usr/lib");
6063 }
6064
Rafael Espindola38360b32010-07-20 12:59:03 +00006065 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006066 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006067 CmdArgs.push_back("-lm");
6068 }
6069
Daniel Dunbarcc912342009-05-02 18:28:39 +00006070 if (Args.hasArg(options::OPT_shared)) {
6071 CmdArgs.push_back("-lgcc_pic");
6072 } else {
6073 CmdArgs.push_back("-lgcc");
6074 }
6075
6076
6077 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006078 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006079
6080 if (!Args.hasArg(options::OPT_nolibc)) {
6081 CmdArgs.push_back("-lc");
6082 }
6083
6084 if (Args.hasArg(options::OPT_shared)) {
6085 CmdArgs.push_back("-lgcc_pic");
6086 } else {
6087 CmdArgs.push_back("-lgcc");
6088 }
6089 }
6090
6091 if (!Args.hasArg(options::OPT_nostdlib) &&
6092 !Args.hasArg(options::OPT_nostartfiles)) {
6093 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006094 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006095 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006096 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006097 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006098 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006099 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006100 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006101 }
6102
Bill Wendling08760582011-06-27 19:15:03 +00006103 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006104
Daniel Dunbarcc912342009-05-02 18:28:39 +00006105 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006106 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006107 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006108}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006109
6110void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6111 const InputInfo &Output,
6112 const InputInfoList &Inputs,
6113 const ArgList &Args,
6114 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006115 ArgStringList CmdArgs;
6116
6117 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006118 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6119 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006120 } else {
6121 assert(Output.isNothing() && "Invalid output.");
6122 }
6123
6124 if (!Args.hasArg(options::OPT_nostdlib) &&
6125 !Args.hasArg(options::OPT_nostartfiles)) {
6126 CmdArgs.push_back("-defaultlib:libcmt");
6127 }
6128
6129 CmdArgs.push_back("-nologo");
6130
Michael J. Spencere2f49362012-06-18 16:56:04 +00006131 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6132
6133 // Add filenames immediately.
6134 for (InputInfoList::const_iterator
6135 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6136 if (it->isFilename())
6137 CmdArgs.push_back(it->getFilename());
6138 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006139
6140 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006141 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006142 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6143}