blob: dbd25dfbea3b67dc3ffeb49a284a739a6d58cb37 [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
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002253 // Use the last option from "-g" group. "-gline-tables-only" is
2254 // 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)) {
2257 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2258 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +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");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002262 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002263 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002264
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002265 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2266 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002267 if (Args.hasArg(options::OPT_gcolumn_info))
2268 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002269
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002270 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2271 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2272
Chris Lattner3c77a352010-06-22 00:03:40 +00002273 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2274
Nick Lewycky207bce32011-04-21 23:44:07 +00002275 if (Args.hasArg(options::OPT_ftest_coverage) ||
2276 Args.hasArg(options::OPT_coverage))
2277 CmdArgs.push_back("-femit-coverage-notes");
2278 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2279 Args.hasArg(options::OPT_coverage))
2280 CmdArgs.push_back("-femit-coverage-data");
2281
Nick Lewycky480cb992011-05-04 20:46:58 +00002282 if (C.getArgs().hasArg(options::OPT_c) ||
2283 C.getArgs().hasArg(options::OPT_S)) {
2284 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002285 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002286 SmallString<128> absFilename(Output.getFilename());
2287 llvm::sys::fs::make_absolute(absFilename);
2288 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002289 }
2290 }
2291
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002292 // Pass options for controlling the default header search paths.
2293 if (Args.hasArg(options::OPT_nostdinc)) {
2294 CmdArgs.push_back("-nostdsysteminc");
2295 CmdArgs.push_back("-nobuiltininc");
2296 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002297 if (Args.hasArg(options::OPT_nostdlibinc))
2298 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002299 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2300 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2301 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002302
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002303 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002304 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002305 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002306
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002307 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2308
Ted Kremenekf7639e12012-03-06 20:06:33 +00002309 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002310 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002311 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002312 options::OPT_ccc_arcmt_modify,
2313 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002314 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002315 switch (A->getOption().getID()) {
2316 default:
2317 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002318 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002319 CmdArgs.push_back("-arcmt-check");
2320 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002321 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002322 CmdArgs.push_back("-arcmt-modify");
2323 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002324 case options::OPT_ccc_arcmt_migrate:
2325 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002326 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002327 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002328
2329 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2330 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002331 break;
John McCalld70fb982011-06-15 23:25:17 +00002332 }
2333 }
2334 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002335
Ted Kremenekf7639e12012-03-06 20:06:33 +00002336 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2337 if (ARCMTEnabled) {
2338 D.Diag(diag::err_drv_argument_not_allowed_with)
2339 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2340 }
2341 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002342 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002343
2344 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2345 options::OPT_objcmt_migrate_subscripting)) {
2346 // None specified, means enable them all.
2347 CmdArgs.push_back("-objcmt-migrate-literals");
2348 CmdArgs.push_back("-objcmt-migrate-subscripting");
2349 } else {
2350 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2351 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2352 }
2353 }
2354
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002355 // Add preprocessing options like -I, -D, etc. if we are using the
2356 // preprocessor.
2357 //
2358 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002359 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002360 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002361
Rafael Espindolaa7431922011-07-21 23:40:37 +00002362 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2363 // that "The compiler can only warn and ignore the option if not recognized".
2364 // When building with ccache, it will pass -D options to clang even on
2365 // preprocessed inputs and configure concludes that -fPIC is not supported.
2366 Args.ClaimAllArgs(options::OPT_D);
2367
Daniel Dunbar58f78332009-09-17 06:53:36 +00002368 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002369 // others.
2370 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002371 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002372 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002373 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002374 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002375 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002376 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002377 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002378 }
2379
Chad Rosier86b82082012-12-12 20:06:31 +00002380 // Don't warn about unused -flto. This can happen when we're preprocessing or
2381 // precompiling.
2382 Args.ClaimAllArgs(options::OPT_flto);
2383
Daniel Dunbar945577c2009-10-29 02:24:45 +00002384 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002385 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2386 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002387 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002388 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002389
2390 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2391 // (-ansi is equivalent to -std=c89).
2392 //
2393 // If a std is supplied, only add -trigraphs if it follows the
2394 // option.
2395 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2396 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002397 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002398 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002399 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002400 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002401 else
2402 Std->render(Args, CmdArgs);
2403
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002404 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2405 options::OPT_trigraphs))
2406 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002407 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002408 } else {
2409 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002410 //
2411 // FIXME: Clang doesn't correctly handle -std= when the input language
2412 // doesn't match. For the time being just ignore this for C++ inputs;
2413 // eventually we want to do all the standard defaulting here instead of
2414 // splitting it between the driver and clang -cc1.
2415 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002416 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2417 "-std=", /*Joined=*/true);
2418 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2419 CmdArgs.push_back("-std=c++11");
2420
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002421 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002422 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002423
Chandler Carruthb009b142011-04-23 06:30:43 +00002424 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2425 // '-fconst-strings'; this better indicates its actual behavior.
2426 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2427 false)) {
2428 // For perfect compatibility with GCC, we do this even in the presence of
2429 // '-w'. This flag names something other than a warning for GCC.
2430 CmdArgs.push_back("-fconst-strings");
2431 }
2432
Chandler Carruth61fbf622011-04-23 09:27:53 +00002433 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002434 // during C++ compilation, which it is by default. GCC keeps this define even
2435 // in the presence of '-w', match this behavior bug-for-bug.
2436 if (types::isCXX(InputType) &&
2437 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2438 true)) {
2439 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002440 }
2441
Chandler Carruthe0391482010-05-22 02:21:53 +00002442 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2443 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2444 if (Asm->getOption().matches(options::OPT_fasm))
2445 CmdArgs.push_back("-fgnu-keywords");
2446 else
2447 CmdArgs.push_back("-fno-gnu-keywords");
2448 }
2449
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002450 if (ShouldDisableCFI(Args, getToolChain()))
2451 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002452
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002453 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2454 CmdArgs.push_back("-fno-dwarf-directory-asm");
2455
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002456 // Add in -fdebug-compilation-dir if necessary.
2457 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002458
Richard Smith9a568822011-11-21 19:36:32 +00002459 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2460 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002461 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002462 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002463 }
2464
Richard Smith9a568822011-11-21 19:36:32 +00002465 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2466 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002467 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002468 }
2469
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002470 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2471 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002472 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002473 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002474 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2475 } else
2476 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002477 }
2478
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002479
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002480 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002481 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002482
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002483 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2484 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002485 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002486 }
David Chisnall5778fce2009-08-31 16:41:57 +00002487
Chris Lattnere23003d2010-01-09 21:54:33 +00002488 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2489 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002490 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002491 }
2492
Chris Lattnerb35583d2010-04-07 20:49:23 +00002493 CmdArgs.push_back("-ferror-limit");
2494 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002495 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002496 else
2497 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002498
Chandler Carrutha77a7272010-05-06 04:55:18 +00002499 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2500 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002501 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002502 }
2503
2504 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2505 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002506 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002507 }
2508
Richard Smithf6f003a2011-12-16 19:06:07 +00002509 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2510 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002511 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002512 }
2513
Daniel Dunbar2c978472009-11-04 06:24:47 +00002514 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002515 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002516 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002517 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002518 } else {
2519 // If -fmessage-length=N was not specified, determine whether this is a
2520 // terminal and, if so, implicitly define -fmessage-length appropriately.
2521 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002522 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002523 }
2524
Daniel Dunbare357d562009-12-03 18:42:11 +00002525 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2526 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002527 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002528 }
2529
Douglas Gregor08329632010-06-15 17:05:35 +00002530 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002531
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002532 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2533
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002534 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002535 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2536 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002537 CmdArgs.push_back("-ffreestanding");
2538
Daniel Dunbare357d562009-12-03 18:42:11 +00002539 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002540 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002541 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002542 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002543 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002544 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002545 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002546 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2547 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002548
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002549 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002550 Sanitize.addArgs(Args, CmdArgs);
2551
Will Dietz3676d562012-12-30 20:53:28 +00002552 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2553 options::OPT_fno_sanitize_recover,
2554 true))
2555 CmdArgs.push_back("-fno-sanitize-recover");
2556
Chad Rosierae229d52013-01-29 23:31:22 +00002557 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2558 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2559 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2560 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2561
Chad Rosier864dfe12012-03-13 23:45:51 +00002562 // Report and error for -faltivec on anything other then PowerPC.
2563 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2564 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2565 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2566 D.Diag(diag::err_drv_argument_only_allowed_with)
2567 << A->getAsString(Args) << "ppc/ppc64";
2568
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002569 if (getToolChain().SupportsProfiling())
2570 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002571
2572 // -flax-vector-conversions is default.
2573 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2574 options::OPT_fno_lax_vector_conversions))
2575 CmdArgs.push_back("-fno-lax-vector-conversions");
2576
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002577 if (Args.getLastArg(options::OPT_fapple_kext))
2578 CmdArgs.push_back("-fapple-kext");
2579
David Blaikie690f21e2012-06-14 18:55:27 +00002580 if (Args.hasFlag(options::OPT_frewrite_includes,
2581 options::OPT_fno_rewrite_includes, false))
2582 CmdArgs.push_back("-frewrite-includes");
2583
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002584 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002585 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002586 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002587 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2588 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002589
2590 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2591 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002592 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002593 }
2594
Bob Wilson14adb362012-02-03 06:27:22 +00002595 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002596
Chandler Carruth6e501032011-03-27 00:04:55 +00002597 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2598 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2599 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2600 options::OPT_fno_wrapv)) {
2601 if (A->getOption().matches(options::OPT_fwrapv))
2602 CmdArgs.push_back("-fwrapv");
2603 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2604 options::OPT_fno_strict_overflow)) {
2605 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2606 CmdArgs.push_back("-fwrapv");
2607 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002608 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002609 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002610
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002611 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2612
Mahesha S6a682be42012-10-27 07:47:56 +00002613
Daniel Dunbar4930e332009-11-17 08:07:36 +00002614 // -stack-protector=0 is default.
2615 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002616 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2617 options::OPT_fstack_protector_all,
2618 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002619 if (A->getOption().matches(options::OPT_fstack_protector))
2620 StackProtectorLevel = 1;
2621 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2622 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002623 } else {
2624 StackProtectorLevel =
2625 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2626 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002627 if (StackProtectorLevel) {
2628 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002629 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002630 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002631
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002632 // --param ssp-buffer-size=
2633 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2634 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002635 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002636 if (Str.startswith("ssp-buffer-size=")) {
2637 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002638 CmdArgs.push_back("-stack-protector-buffer-size");
2639 // FIXME: Verify the argument is a valid integer.
2640 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002641 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002642 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002643 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002644 }
2645
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002646 // Translate -mstackrealign
2647 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2648 false)) {
2649 CmdArgs.push_back("-backend-option");
2650 CmdArgs.push_back("-force-align-stack");
2651 }
2652 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2653 false)) {
2654 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2655 }
2656
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002657 if (Args.hasArg(options::OPT_mstack_alignment)) {
2658 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2659 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002660 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002661 // -mkernel implies -mstrict-align; don't add the redundant option.
2662 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002663 CmdArgs.push_back("-backend-option");
2664 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002665 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002666
Daniel Dunbard18049a2009-04-07 21:16:11 +00002667 // Forward -f options with positive and negative forms; we translate
2668 // these by hand.
2669
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002670 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002671 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002672 CmdArgs.push_back("-fapple-kext");
2673 if (!Args.hasArg(options::OPT_fbuiltin))
2674 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002675 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002676 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002677 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002678 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002679 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002680
Nuno Lopes13c88c72009-12-16 16:59:22 +00002681 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2682 options::OPT_fno_assume_sane_operator_new))
2683 CmdArgs.push_back("-fno-assume-sane-operator-new");
2684
Daniel Dunbar4930e332009-11-17 08:07:36 +00002685 // -fblocks=0 is default.
2686 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002687 getToolChain().IsBlocksDefault()) ||
2688 (Args.hasArg(options::OPT_fgnu_runtime) &&
2689 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2690 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002691 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002692
2693 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2694 !getToolChain().hasBlocksRuntime())
2695 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002696 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002697
Douglas Gregor226173a2012-01-18 15:19:58 +00002698 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2699 // users must also pass -fcxx-modules. The latter flag will disappear once the
2700 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002701 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002702 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2703 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2704 options::OPT_fno_cxx_modules,
2705 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002706 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002707 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002708 HaveModules = true;
2709 }
2710 }
2711
2712 // -fmodules-autolink (on by default when modules is enabled) automatically
2713 // links against libraries for imported modules.
2714 if (HaveModules &&
2715 Args.hasFlag(options::OPT_fmodules_autolink,
2716 options::OPT_fno_modules_autolink,
2717 true)) {
2718 CmdArgs.push_back("-fmodules-autolink");
Douglas Gregor226173a2012-01-18 15:19:58 +00002719 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002720
John McCalldfea9982010-04-09 19:12:06 +00002721 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002722 if (Args.hasFlag(options::OPT_fno_access_control,
2723 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002724 false))
John McCall3155f572010-04-09 19:03:51 +00002725 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002726
Anders Carlssond470fef2010-11-21 00:09:52 +00002727 // -felide-constructors is the default.
2728 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2729 options::OPT_felide_constructors,
2730 false))
2731 CmdArgs.push_back("-fno-elide-constructors");
2732
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002733 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002734 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002735 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002736 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002737
Richard Smith52be6192012-11-05 22:04:41 +00002738 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002739 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002740 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002741 Args.getLastArg(options::OPT_mkernel,
2742 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002743 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002744 D.Diag(diag::err_drv_argument_not_allowed_with)
2745 << "-fsanitize=vptr" << NoRttiArg;
2746 }
2747 }
2748
Tony Linthicum76329bf2011-12-12 21:14:55 +00002749 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002750 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002751 options::OPT_fno_short_enums,
2752 getToolChain().getTriple().getArch() ==
2753 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002754 CmdArgs.push_back("-fshort-enums");
2755
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002756 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002757 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002758 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002759 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002760
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002761 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002762 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002763 options::OPT_fno_threadsafe_statics))
2764 CmdArgs.push_back("-fno-threadsafe-statics");
2765
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002766 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002767 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2768 options::OPT_fno_use_cxa_atexit,
2769 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002770 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002771 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2772 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002773 CmdArgs.push_back("-fno-use-cxa-atexit");
2774
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002775 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002776 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002777 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2778 CmdArgs.push_back("-fms-extensions");
2779
Francois Pichet1b4f1632011-09-17 04:32:15 +00002780 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002781 if (Args.hasFlag(options::OPT_fms_compatibility,
2782 options::OPT_fno_ms_compatibility,
2783 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2784 Args.hasFlag(options::OPT_fms_extensions,
2785 options::OPT_fno_ms_extensions,
2786 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002787 CmdArgs.push_back("-fms-compatibility");
2788
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002789 // -fmsc-version=1300 is default.
2790 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2791 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2792 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002793 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002794 if (msc_ver.empty())
2795 CmdArgs.push_back("-fmsc-version=1300");
2796 else
2797 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2798 }
2799
2800
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002801 // -fborland-extensions=0 is default.
2802 if (Args.hasFlag(options::OPT_fborland_extensions,
2803 options::OPT_fno_borland_extensions, false))
2804 CmdArgs.push_back("-fborland-extensions");
2805
Francois Pichet02744872011-09-01 16:38:08 +00002806 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2807 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002808 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2809 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002810 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002811 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002812
Chandler Carruthe03aa552010-04-17 20:17:31 +00002813 // -fgnu-keywords default varies depending on language; only pass if
2814 // specified.
2815 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002816 options::OPT_fno_gnu_keywords))
2817 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002818
Rafael Espindola922a6242011-06-02 17:30:53 +00002819 if (Args.hasFlag(options::OPT_fgnu89_inline,
2820 options::OPT_fno_gnu89_inline,
2821 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002822 CmdArgs.push_back("-fgnu89-inline");
2823
Chad Rosier9c76d242012-03-15 22:31:42 +00002824 if (Args.hasArg(options::OPT_fno_inline))
2825 CmdArgs.push_back("-fno-inline");
2826
Chad Rosier64d6be92012-03-06 21:17:19 +00002827 if (Args.hasArg(options::OPT_fno_inline_functions))
2828 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002829
John McCall5fb5df92012-06-20 06:18:46 +00002830 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002831
John McCall5fb5df92012-06-20 06:18:46 +00002832 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2833 // legacy is the default.
2834 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002835 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2836 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002837 objcRuntime.isLegacyDispatchDefaultForArch(
2838 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002839 if (getToolChain().UseObjCMixedDispatch())
2840 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2841 else
2842 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2843 }
2844 }
2845
Nico Weber97bd94b2012-03-09 21:19:44 +00002846 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2847 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002848 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002849 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2850 }
2851
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002852 // -fencode-extended-block-signature=1 is default.
2853 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2854 CmdArgs.push_back("-fencode-extended-block-signature");
2855 }
2856
John McCall24fc0de2011-07-06 00:26:06 +00002857 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2858 // NOTE: This logic is duplicated in ToolChains.cpp.
2859 bool ARC = isObjCAutoRefCount(Args);
2860 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002861 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002862
John McCall24fc0de2011-07-06 00:26:06 +00002863 CmdArgs.push_back("-fobjc-arc");
2864
Chandler Carruth491db322011-11-04 07:34:47 +00002865 // FIXME: It seems like this entire block, and several around it should be
2866 // wrapped in isObjC, but for now we just use it here as this is where it
2867 // was being used previously.
2868 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2869 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2870 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2871 else
2872 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2873 }
2874
John McCall24fc0de2011-07-06 00:26:06 +00002875 // Allow the user to enable full exceptions code emission.
2876 // We define off for Objective-CC, on for Objective-C++.
2877 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2878 options::OPT_fno_objc_arc_exceptions,
2879 /*default*/ types::isCXX(InputType)))
2880 CmdArgs.push_back("-fobjc-arc-exceptions");
2881 }
2882
2883 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2884 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002885 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002886 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002887
John McCall24fc0de2011-07-06 00:26:06 +00002888 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2889 // takes precedence.
2890 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2891 if (!GCArg)
2892 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2893 if (GCArg) {
2894 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002895 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002896 << GCArg->getAsString(Args);
2897 } else if (getToolChain().SupportsObjCGC()) {
2898 GCArg->render(Args, CmdArgs);
2899 } else {
2900 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002901 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002902 << GCArg->getAsString(Args);
2903 }
2904 }
2905
John McCallb5f652e2011-06-22 00:53:57 +00002906 // Add exception args.
2907 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002908 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002909
2910 if (getToolChain().UseSjLjExceptions())
2911 CmdArgs.push_back("-fsjlj-exceptions");
2912
2913 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002914 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2915 options::OPT_fno_assume_sane_operator_new))
2916 CmdArgs.push_back("-fno-assume-sane-operator-new");
2917
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002918 // -fconstant-cfstrings is default, and may be subject to argument translation
2919 // on Darwin.
2920 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2921 options::OPT_fno_constant_cfstrings) ||
2922 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2923 options::OPT_mno_constant_cfstrings))
2924 CmdArgs.push_back("-fno-constant-cfstrings");
2925
John Thompsoned4e2952009-11-05 20:14:16 +00002926 // -fshort-wchar default varies depending on platform; only
2927 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002928 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2929 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002930
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002931 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2932 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002933 //
2934 // FIXME: This is gross; that translation should be pulled from the
2935 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002936 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002937 options::OPT_fno_pascal_strings,
2938 false) ||
2939 Args.hasFlag(options::OPT_mpascal_strings,
2940 options::OPT_mno_pascal_strings,
2941 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002942 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002943
Daniel Dunbar096ed292011-10-05 21:04:55 +00002944 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2945 // -fno-pack-struct doesn't apply to -fpack-struct=.
2946 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002947 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002948 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002949 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002950 } else if (Args.hasFlag(options::OPT_fpack_struct,
2951 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002952 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002953 }
2954
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002955 if (Args.hasArg(options::OPT_mkernel) ||
2956 Args.hasArg(options::OPT_fapple_kext)) {
2957 if (!Args.hasArg(options::OPT_fcommon))
2958 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002959 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002960 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002961
Daniel Dunbard18049a2009-04-07 21:16:11 +00002962 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002963 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002964 CmdArgs.push_back("-fno-common");
2965
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002966 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002967 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002968 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002969 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002970 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002971 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2972
Daniel Dunbar6358d682010-10-15 22:30:42 +00002973 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2974 if (!Args.hasFlag(options::OPT_ffor_scope,
2975 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002976 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002977 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2978
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002979 // -fcaret-diagnostics is default.
2980 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2981 options::OPT_fno_caret_diagnostics, true))
2982 CmdArgs.push_back("-fno-caret-diagnostics");
2983
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002984 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002985 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002986 options::OPT_fno_diagnostics_fixit_info))
2987 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002988
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002989 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002990 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002991 options::OPT_fno_diagnostics_show_option))
2992 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002993
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002994 if (const Arg *A =
2995 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2996 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00002997 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002998 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002999
Douglas Gregor643c9222011-05-21 17:07:29 +00003000 if (const Arg *A =
3001 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3002 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003003 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003004 }
3005
Chandler Carruthb6766f02011-03-27 01:50:55 +00003006 if (Arg *A = Args.getLastArg(
3007 options::OPT_fdiagnostics_show_note_include_stack,
3008 options::OPT_fno_diagnostics_show_note_include_stack)) {
3009 if (A->getOption().matches(
3010 options::OPT_fdiagnostics_show_note_include_stack))
3011 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3012 else
3013 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3014 }
3015
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003016 // Color diagnostics are the default, unless the terminal doesn't support
3017 // them.
3018 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00003019 options::OPT_fno_color_diagnostics,
3020 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003021 CmdArgs.push_back("-fcolor-diagnostics");
3022
Daniel Dunbardb097022009-06-08 21:13:54 +00003023 if (!Args.hasFlag(options::OPT_fshow_source_location,
3024 options::OPT_fno_show_source_location))
3025 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003026
Douglas Gregor643c9222011-05-21 17:07:29 +00003027 if (!Args.hasFlag(options::OPT_fshow_column,
3028 options::OPT_fno_show_column,
3029 true))
3030 CmdArgs.push_back("-fno-show-column");
3031
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003032 if (!Args.hasFlag(options::OPT_fspell_checking,
3033 options::OPT_fno_spell_checking))
3034 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003035
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003036
Chad Rosierc8e56e82012-12-05 21:08:21 +00003037 // -fno-asm-blocks is default.
3038 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3039 false))
3040 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003041
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003042 // -fvectorize is default.
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003043 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003044 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003045 CmdArgs.push_back("-backend-option");
3046 CmdArgs.push_back("-vectorize-loops");
3047 }
3048
Hal Finkel061f1652012-12-11 19:59:32 +00003049 // -fno-slp-vectorize is default.
3050 if (Args.hasFlag(options::OPT_fslp_vectorize,
3051 options::OPT_fno_slp_vectorize, false)) {
3052 CmdArgs.push_back("-backend-option");
3053 CmdArgs.push_back("-vectorize");
3054 }
3055
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003056 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3057 A->render(Args, CmdArgs);
3058
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003059 // -fdollars-in-identifiers default varies depending on platform and
3060 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003061 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003062 options::OPT_fno_dollars_in_identifiers)) {
3063 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003064 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003065 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003066 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003067 }
3068
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003069 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3070 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003071 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003072 options::OPT_fno_unit_at_a_time)) {
3073 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003074 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003075 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003076
Eli Friedman055c9702011-11-02 01:53:16 +00003077 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3078 options::OPT_fno_apple_pragma_pack, false))
3079 CmdArgs.push_back("-fapple-pragma-pack");
3080
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003081 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003082 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003083 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003084#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003085 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003086 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3087 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3088 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3089 CmdArgs.push_back("-fno-builtin-strcat");
3090 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3091 CmdArgs.push_back("-fno-builtin-strcpy");
3092 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003093#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003094
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003095 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003096 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003097 options::OPT_traditional_cpp)) {
3098 if (isa<PreprocessJobAction>(JA))
3099 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003100 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003101 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003102 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003103
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003104 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003105 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003106
3107 // Handle serialized diagnostics.
3108 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3109 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003110 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003111 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003112
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003113 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3114 CmdArgs.push_back("-fretain-comments-from-system-headers");
3115
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003116 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3117 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003118 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003119 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3120 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003121 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003122
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003123 // We translate this by hand to the -cc1 argument, since nightly test uses
3124 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003125 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003126 CmdArgs.push_back("-disable-llvm-optzns");
3127 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003128 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003129 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003130
Daniel Dunbard67a3222009-03-30 06:36:42 +00003131 if (Output.getType() == types::TY_Dependencies) {
3132 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003133 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003134 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003135 CmdArgs.push_back(Output.getFilename());
3136 } else {
3137 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003138 }
3139
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003140 for (InputInfoList::const_iterator
3141 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3142 const InputInfo &II = *it;
3143 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003144 if (Args.hasArg(options::OPT_rewrite_objc))
3145 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3146 else
3147 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003148 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003149 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003150 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003151 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003152 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003153
Chris Lattnere9d7d782009-11-03 19:50:27 +00003154 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3155
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003156 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003157
3158 // Optionally embed the -cc1 level arguments into the debug info, for build
3159 // analysis.
3160 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003161 ArgStringList OriginalArgs;
3162 for (ArgList::const_iterator it = Args.begin(),
3163 ie = Args.end(); it != ie; ++it)
3164 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003165
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003166 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003167 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003168 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003169 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003170 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003171 }
3172 CmdArgs.push_back("-dwarf-debug-flags");
3173 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3174 }
3175
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003176 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003177
Roman Divacky178e01602011-02-10 16:52:03 +00003178 if (Arg *A = Args.getLastArg(options::OPT_pg))
3179 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003180 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003181 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003182
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003183 // Claim some arguments which clang supports automatically.
3184
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003185 // -fpch-preprocess is used with gcc to add a special marker in the output to
3186 // include the PCH file. Clang's PTH solution is completely transparent, so we
3187 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003188 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003189
Daniel Dunbar17731772009-03-23 19:03:36 +00003190 // Claim some arguments which clang doesn't support, but we don't
3191 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003192 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3193 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003194
Rafael Espindolad95a8122011-03-01 05:25:27 +00003195 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003196 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003197 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003198}
3199
Jim Grosbach576452b2012-02-10 20:37:10 +00003200void ClangAs::AddARMTargetArgs(const ArgList &Args,
3201 ArgStringList &CmdArgs) const {
3202 const Driver &D = getToolChain().getDriver();
3203 llvm::Triple Triple = getToolChain().getTriple();
3204
3205 // Set the CPU based on -march= and -mcpu=.
3206 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003207 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003208
3209 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003210 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003211 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003212
3213 // Honor -mfpmath=.
3214 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003215 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003216}
3217
John McCall5fb5df92012-06-20 06:18:46 +00003218/// Add options related to the Objective-C runtime/ABI.
3219///
3220/// Returns true if the runtime is non-fragile.
3221ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3222 ArgStringList &cmdArgs,
3223 RewriteKind rewriteKind) const {
3224 // Look for the controlling runtime option.
3225 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3226 options::OPT_fgnu_runtime,
3227 options::OPT_fobjc_runtime_EQ);
3228
3229 // Just forward -fobjc-runtime= to the frontend. This supercedes
3230 // options about fragility.
3231 if (runtimeArg &&
3232 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3233 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003234 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003235 if (runtime.tryParse(value)) {
3236 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3237 << value;
3238 }
3239
3240 runtimeArg->render(args, cmdArgs);
3241 return runtime;
3242 }
3243
3244 // Otherwise, we'll need the ABI "version". Version numbers are
3245 // slightly confusing for historical reasons:
3246 // 1 - Traditional "fragile" ABI
3247 // 2 - Non-fragile ABI, version 1
3248 // 3 - Non-fragile ABI, version 2
3249 unsigned objcABIVersion = 1;
3250 // If -fobjc-abi-version= is present, use that to set the version.
3251 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003252 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003253 if (value == "1")
3254 objcABIVersion = 1;
3255 else if (value == "2")
3256 objcABIVersion = 2;
3257 else if (value == "3")
3258 objcABIVersion = 3;
3259 else
3260 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3261 << value;
3262 } else {
3263 // Otherwise, determine if we are using the non-fragile ABI.
3264 bool nonFragileABIIsDefault =
3265 (rewriteKind == RK_NonFragile ||
3266 (rewriteKind == RK_None &&
3267 getToolChain().IsObjCNonFragileABIDefault()));
3268 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3269 options::OPT_fno_objc_nonfragile_abi,
3270 nonFragileABIIsDefault)) {
3271 // Determine the non-fragile ABI version to use.
3272#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3273 unsigned nonFragileABIVersion = 1;
3274#else
3275 unsigned nonFragileABIVersion = 2;
3276#endif
3277
3278 if (Arg *abiArg = args.getLastArg(
3279 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003280 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003281 if (value == "1")
3282 nonFragileABIVersion = 1;
3283 else if (value == "2")
3284 nonFragileABIVersion = 2;
3285 else
3286 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3287 << value;
3288 }
3289
3290 objcABIVersion = 1 + nonFragileABIVersion;
3291 } else {
3292 objcABIVersion = 1;
3293 }
3294 }
3295
3296 // We don't actually care about the ABI version other than whether
3297 // it's non-fragile.
3298 bool isNonFragile = objcABIVersion != 1;
3299
3300 // If we have no runtime argument, ask the toolchain for its default runtime.
3301 // However, the rewriter only really supports the Mac runtime, so assume that.
3302 ObjCRuntime runtime;
3303 if (!runtimeArg) {
3304 switch (rewriteKind) {
3305 case RK_None:
3306 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3307 break;
3308 case RK_Fragile:
3309 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3310 break;
3311 case RK_NonFragile:
3312 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3313 break;
3314 }
3315
3316 // -fnext-runtime
3317 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3318 // On Darwin, make this use the default behavior for the toolchain.
3319 if (getToolChain().getTriple().isOSDarwin()) {
3320 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3321
3322 // Otherwise, build for a generic macosx port.
3323 } else {
3324 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3325 }
3326
3327 // -fgnu-runtime
3328 } else {
3329 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003330 // Legacy behaviour is to target the gnustep runtime if we are i
3331 // non-fragile mode or the GCC runtime in fragile mode.
3332 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003333 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003334 else
3335 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003336 }
3337
3338 cmdArgs.push_back(args.MakeArgString(
3339 "-fobjc-runtime=" + runtime.getAsString()));
3340 return runtime;
3341}
3342
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003343void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003344 const InputInfo &Output,
3345 const InputInfoList &Inputs,
3346 const ArgList &Args,
3347 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003348 ArgStringList CmdArgs;
3349
3350 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3351 const InputInfo &Input = Inputs[0];
3352
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003353 // Don't warn about "clang -w -c foo.s"
3354 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003355 // and "clang -emit-llvm -c foo.s"
3356 Args.ClaimAllArgs(options::OPT_emit_llvm);
3357 // and "clang -use-gold-plugin -c foo.s"
3358 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003359
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003360 // Invoke ourselves in -cc1as mode.
3361 //
3362 // FIXME: Implement custom jobs for internal actions.
3363 CmdArgs.push_back("-cc1as");
3364
3365 // Add the "effective" target triple.
3366 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003367 std::string TripleStr =
3368 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003369 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3370
3371 // Set the output mode, we currently only expect to be used as a real
3372 // assembler.
3373 CmdArgs.push_back("-filetype");
3374 CmdArgs.push_back("obj");
3375
Eric Christopher45f2e712012-12-18 00:31:10 +00003376 // Set the main file name, so that debug info works even with
3377 // -save-temps or preprocessed assembly.
3378 CmdArgs.push_back("-main-file-name");
3379 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3380
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003381 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003382 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003383
Jim Grosbach576452b2012-02-10 20:37:10 +00003384 // Add target specific cpu and features flags.
3385 switch(getToolChain().getTriple().getArch()) {
3386 default:
3387 break;
3388
3389 case llvm::Triple::arm:
3390 case llvm::Triple::thumb:
3391 AddARMTargetArgs(Args, CmdArgs);
3392 break;
3393 }
3394
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003395 // Ignore explicit -force_cpusubtype_ALL option.
3396 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003397
Eric Christopherfc3ee562012-01-10 00:38:01 +00003398 // Determine the original source input.
3399 const Action *SourceAction = &JA;
3400 while (SourceAction->getKind() != Action::InputClass) {
3401 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3402 SourceAction = SourceAction->getInputs()[0];
3403 }
3404
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003405 // Forward -g and handle debug info related flags, assuming we are dealing
3406 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003407 if (SourceAction->getType() == types::TY_Asm ||
3408 SourceAction->getType() == types::TY_PP_Asm) {
3409 Args.ClaimAllArgs(options::OPT_g_Group);
3410 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3411 if (!A->getOption().matches(options::OPT_g0))
3412 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003413
3414 // Add the -fdebug-compilation-dir flag if needed.
3415 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003416
3417 // Set the AT_producer to the clang version when using the integrated
3418 // assembler on assembly source files.
3419 CmdArgs.push_back("-dwarf-debug-producer");
3420 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003421 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003422
3423 // Optionally embed the -cc1as level arguments into the debug info, for build
3424 // analysis.
3425 if (getToolChain().UseDwarfDebugFlags()) {
3426 ArgStringList OriginalArgs;
3427 for (ArgList::const_iterator it = Args.begin(),
3428 ie = Args.end(); it != ie; ++it)
3429 (*it)->render(Args, OriginalArgs);
3430
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003431 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003432 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3433 Flags += Exec;
3434 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3435 Flags += " ";
3436 Flags += OriginalArgs[i];
3437 }
3438 CmdArgs.push_back("-dwarf-debug-flags");
3439 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3440 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003441
3442 // FIXME: Add -static support, once we have it.
3443
3444 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3445 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003446 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003447
3448 assert(Output.isFilename() && "Unexpected lipo output.");
3449 CmdArgs.push_back("-o");
3450 CmdArgs.push_back(Output.getFilename());
3451
Daniel Dunbarb440f562010-08-02 02:38:21 +00003452 assert(Input.isFilename() && "Invalid input.");
3453 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003454
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003455 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003456 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003457}
3458
Daniel Dunbara3246a02009-03-18 08:07:30 +00003459void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003460 const InputInfo &Output,
3461 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003462 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003463 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003464 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003465 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003466
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003467 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003468 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003469 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003470 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003471 // Don't forward any -g arguments to assembly steps.
3472 if (isa<AssembleJobAction>(JA) &&
3473 A->getOption().matches(options::OPT_g_Group))
3474 continue;
3475
Daniel Dunbar2da02722009-03-19 07:55:12 +00003476 // It is unfortunate that we have to claim here, as this means
3477 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003478 // platforms using a generic gcc, even if we are just using gcc
3479 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003480 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003481 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003482 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003483 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003484
Daniel Dunbar4e295052010-01-25 22:35:08 +00003485 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003486
3487 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003488 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003489 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003490 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003491
3492 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003493 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003494 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003495 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003496 CmdArgs.push_back("ppc64");
3497 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003498 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003499 }
3500
Daniel Dunbar5716d872009-05-02 21:41:52 +00003501 // Try to force gcc to match the tool chain we want, if we recognize
3502 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003503 //
3504 // FIXME: The triple class should directly provide the information we want
3505 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003506 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003507 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003508 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003509 CmdArgs.push_back("-m64");
3510
Daniel Dunbarb440f562010-08-02 02:38:21 +00003511 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003512 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003513 CmdArgs.push_back(Output.getFilename());
3514 } else {
3515 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003516 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003517 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003518
Tony Linthicum76329bf2011-12-12 21:14:55 +00003519 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3520 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003521
3522 // Only pass -x if gcc will understand it; otherwise hope gcc
3523 // understands the suffix correctly. The main use case this would go
3524 // wrong in is for linker inputs if they happened to have an odd
3525 // suffix; really the only way to get this to happen is a command
3526 // like '-x foobar a.c' which will treat a.c like a linker input.
3527 //
3528 // FIXME: For the linker case specifically, can we safely convert
3529 // inputs into '-Wl,' options?
3530 for (InputInfoList::const_iterator
3531 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3532 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003533
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003534 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003535 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3536 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003537 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003538 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003539 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003540 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003541 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003542
Daniel Dunbara3246a02009-03-18 08:07:30 +00003543 if (types::canTypeBeUserSpecified(II.getType())) {
3544 CmdArgs.push_back("-x");
3545 CmdArgs.push_back(types::getTypeName(II.getType()));
3546 }
3547
Daniel Dunbarb440f562010-08-02 02:38:21 +00003548 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003549 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003550 else {
3551 const Arg &A = II.getInputArg();
3552
3553 // Reverse translate some rewritten options.
3554 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3555 CmdArgs.push_back("-lstdc++");
3556 continue;
3557 }
3558
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003559 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003560 A.render(Args, CmdArgs);
3561 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003562 }
3563
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003564 const std::string customGCCName = D.getCCCGenericGCCName();
3565 const char *GCCName;
3566 if (!customGCCName.empty())
3567 GCCName = customGCCName.c_str();
3568 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003569 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003570 } else
3571 GCCName = "gcc";
3572
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003573 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003574 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003575 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003576}
3577
Daniel Dunbar4e295052010-01-25 22:35:08 +00003578void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3579 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003580 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003581}
3582
Daniel Dunbar4e295052010-01-25 22:35:08 +00003583void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3584 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003585 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003586}
3587
Daniel Dunbar4e295052010-01-25 22:35:08 +00003588void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3589 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003590 const Driver &D = getToolChain().getDriver();
3591
Daniel Dunbar4e295052010-01-25 22:35:08 +00003592 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003593 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3594 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003595 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003596 else {
3597 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003598 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003599 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003600
Daniel Dunbar4e295052010-01-25 22:35:08 +00003601 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003602 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003603}
3604
Daniel Dunbar4e295052010-01-25 22:35:08 +00003605void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3606 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003607 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003608}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003609
Daniel Dunbar4e295052010-01-25 22:35:08 +00003610void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3611 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003612 // The types are (hopefully) good enough.
3613}
3614
Tony Linthicum76329bf2011-12-12 21:14:55 +00003615// Hexagon tools start.
3616void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3617 ArgStringList &CmdArgs) const {
3618
3619}
3620void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3621 const InputInfo &Output,
3622 const InputInfoList &Inputs,
3623 const ArgList &Args,
3624 const char *LinkingOutput) const {
3625
3626 const Driver &D = getToolChain().getDriver();
3627 ArgStringList CmdArgs;
3628
3629 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003630 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003631 CmdArgs.push_back(Args.MakeArgString(MarchString));
3632
3633 RenderExtraToolArgs(JA, CmdArgs);
3634
3635 if (Output.isFilename()) {
3636 CmdArgs.push_back("-o");
3637 CmdArgs.push_back(Output.getFilename());
3638 } else {
3639 assert(Output.isNothing() && "Unexpected output");
3640 CmdArgs.push_back("-fsyntax-only");
3641 }
3642
Matthew Curtise8f80a12012-12-06 17:49:03 +00003643 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3644 if (!SmallDataThreshold.empty())
3645 CmdArgs.push_back(
3646 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003647
Matthew Curtise5df3812012-12-07 17:23:04 +00003648 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3649 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3650 options::OPT_Xassembler);
3651
Tony Linthicum76329bf2011-12-12 21:14:55 +00003652 // Only pass -x if gcc will understand it; otherwise hope gcc
3653 // understands the suffix correctly. The main use case this would go
3654 // wrong in is for linker inputs if they happened to have an odd
3655 // suffix; really the only way to get this to happen is a command
3656 // like '-x foobar a.c' which will treat a.c like a linker input.
3657 //
3658 // FIXME: For the linker case specifically, can we safely convert
3659 // inputs into '-Wl,' options?
3660 for (InputInfoList::const_iterator
3661 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3662 const InputInfo &II = *it;
3663
3664 // Don't try to pass LLVM or AST inputs to a generic gcc.
3665 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3666 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3667 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3668 << getToolChain().getTripleString();
3669 else if (II.getType() == types::TY_AST)
3670 D.Diag(clang::diag::err_drv_no_ast_support)
3671 << getToolChain().getTripleString();
3672
3673 if (II.isFilename())
3674 CmdArgs.push_back(II.getFilename());
3675 else
3676 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3677 II.getInputArg().render(Args, CmdArgs);
3678 }
3679
3680 const char *GCCName = "hexagon-as";
3681 const char *Exec =
3682 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3683 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3684
3685}
3686void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3687 ArgStringList &CmdArgs) const {
3688 // The types are (hopefully) good enough.
3689}
3690
3691void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3692 const InputInfo &Output,
3693 const InputInfoList &Inputs,
3694 const ArgList &Args,
3695 const char *LinkingOutput) const {
3696
Matthew Curtise689b052012-12-06 15:46:07 +00003697 const toolchains::Hexagon_TC& ToolChain =
3698 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3699 const Driver &D = ToolChain.getDriver();
3700
Tony Linthicum76329bf2011-12-12 21:14:55 +00003701 ArgStringList CmdArgs;
3702
Matthew Curtise689b052012-12-06 15:46:07 +00003703 //----------------------------------------------------------------------------
3704 //
3705 //----------------------------------------------------------------------------
3706 bool hasStaticArg = Args.hasArg(options::OPT_static);
3707 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00003708 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00003709 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3710 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3711 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3712 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003713
Matthew Curtise689b052012-12-06 15:46:07 +00003714 //----------------------------------------------------------------------------
3715 // Silence warnings for various options
3716 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00003717
Matthew Curtise689b052012-12-06 15:46:07 +00003718 Args.ClaimAllArgs(options::OPT_g_Group);
3719 Args.ClaimAllArgs(options::OPT_emit_llvm);
3720 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
3721 // handled somewhere else.
3722 Args.ClaimAllArgs(options::OPT_static_libgcc);
3723
3724 //----------------------------------------------------------------------------
3725 //
3726 //----------------------------------------------------------------------------
3727 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
3728 e = ToolChain.ExtraOpts.end();
3729 i != e; ++i)
3730 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003731
Matthew Curtisf10a5952012-12-06 14:16:43 +00003732 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
3733 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00003734
Matthew Curtise689b052012-12-06 15:46:07 +00003735 if (buildingLib) {
3736 CmdArgs.push_back("-shared");
3737 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
3738 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00003739 }
3740
Matthew Curtise689b052012-12-06 15:46:07 +00003741 if (hasStaticArg)
3742 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003743
Matthew Curtise8f80a12012-12-06 17:49:03 +00003744 if (buildPIE && !buildingLib)
3745 CmdArgs.push_back("-pie");
3746
3747 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3748 if (!SmallDataThreshold.empty()) {
3749 CmdArgs.push_back(
3750 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
3751 }
3752
Matthew Curtise689b052012-12-06 15:46:07 +00003753 //----------------------------------------------------------------------------
3754 //
3755 //----------------------------------------------------------------------------
3756 CmdArgs.push_back("-o");
3757 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003758
Matthew Curtise689b052012-12-06 15:46:07 +00003759 const std::string MarchSuffix = "/" + MarchString;
3760 const std::string G0Suffix = "/G0";
3761 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
3762 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
3763 + "/";
3764 const std::string StartFilesDir = RootDir
3765 + "hexagon/lib"
3766 + (buildingLib
3767 ? MarchG0Suffix : MarchSuffix);
3768
3769 //----------------------------------------------------------------------------
3770 // moslib
3771 //----------------------------------------------------------------------------
3772 std::vector<std::string> oslibs;
3773 bool hasStandalone= false;
3774
3775 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
3776 ie = Args.filtered_end(); it != ie; ++it) {
3777 (*it)->claim();
3778 oslibs.push_back((*it)->getValue());
3779 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003780 }
Matthew Curtise689b052012-12-06 15:46:07 +00003781 if (oslibs.empty()) {
3782 oslibs.push_back("standalone");
3783 hasStandalone = true;
3784 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00003785
Matthew Curtise689b052012-12-06 15:46:07 +00003786 //----------------------------------------------------------------------------
3787 // Start Files
3788 //----------------------------------------------------------------------------
3789 if (incStdLib && incStartFiles) {
3790
3791 if (!buildingLib) {
3792 if (hasStandalone) {
3793 CmdArgs.push_back(
3794 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
3795 }
3796 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
3797 }
3798 std::string initObj = useShared ? "/initS.o" : "/init.o";
3799 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
3800 }
3801
3802 //----------------------------------------------------------------------------
3803 // Library Search Paths
3804 //----------------------------------------------------------------------------
3805 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
3806 for (ToolChain::path_list::const_iterator
3807 i = LibPaths.begin(),
3808 e = LibPaths.end();
3809 i != e;
3810 ++i)
3811 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
3812
3813 //----------------------------------------------------------------------------
3814 //
3815 //----------------------------------------------------------------------------
3816 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3817 Args.AddAllArgs(CmdArgs, options::OPT_e);
3818 Args.AddAllArgs(CmdArgs, options::OPT_s);
3819 Args.AddAllArgs(CmdArgs, options::OPT_t);
3820 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
3821
3822 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
3823
3824 //----------------------------------------------------------------------------
3825 // Libraries
3826 //----------------------------------------------------------------------------
3827 if (incStdLib && incDefLibs) {
3828 if (D.CCCIsCXX) {
3829 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
3830 CmdArgs.push_back("-lm");
3831 }
3832
3833 CmdArgs.push_back("--start-group");
3834
3835 if (!buildingLib) {
3836 for(std::vector<std::string>::iterator i = oslibs.begin(),
3837 e = oslibs.end(); i != e; ++i)
3838 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
3839 CmdArgs.push_back("-lc");
3840 }
3841 CmdArgs.push_back("-lgcc");
3842
3843 CmdArgs.push_back("--end-group");
3844 }
3845
3846 //----------------------------------------------------------------------------
3847 // End files
3848 //----------------------------------------------------------------------------
3849 if (incStdLib && incStartFiles) {
3850 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
3851 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
3852 }
3853
3854 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
3855 C.addCommand(
3856 new Command(
3857 JA, *this,
3858 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003859}
3860// Hexagon tools end.
3861
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003862llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3863 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3864 // archs which Darwin doesn't use.
3865
3866 // The matching this routine does is fairly pointless, since it is neither the
3867 // complete architecture list, nor a reasonable subset. The problem is that
3868 // historically the driver driver accepts this and also ties its -march=
3869 // handling to the architecture name, so we need to be careful before removing
3870 // support for it.
3871
3872 // This code must be kept in sync with Clang's Darwin specific argument
3873 // translation.
3874
3875 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3876 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3877 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3878 .Case("ppc64", llvm::Triple::ppc64)
3879 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3880 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3881 llvm::Triple::x86)
3882 .Case("x86_64", llvm::Triple::x86_64)
3883 // This is derived from the driver driver.
3884 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3885 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3886 .Case("r600", llvm::Triple::r600)
3887 .Case("nvptx", llvm::Triple::nvptx)
3888 .Case("nvptx64", llvm::Triple::nvptx64)
3889 .Case("amdil", llvm::Triple::amdil)
3890 .Case("spir", llvm::Triple::spir)
3891 .Default(llvm::Triple::UnknownArch);
3892}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003893
Bob Wilsondecc03e2012-11-23 06:14:39 +00003894const char *Clang::getBaseInputName(const ArgList &Args,
3895 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003896 return Args.MakeArgString(
3897 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003898}
3899
Bob Wilsondecc03e2012-11-23 06:14:39 +00003900const char *Clang::getBaseInputStem(const ArgList &Args,
3901 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003902 const char *Str = getBaseInputName(Args, Inputs);
3903
Chris Lattner906bb902011-01-16 08:14:11 +00003904 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003905 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003906
3907 return Str;
3908}
3909
Bob Wilsondecc03e2012-11-23 06:14:39 +00003910const char *Clang::getDependencyFileName(const ArgList &Args,
3911 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003912 // FIXME: Think about this more.
3913 std::string Res;
3914
3915 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003916 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003917 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003918 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00003919 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003920 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003921 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003922}
3923
Daniel Dunbarbe220842009-03-20 16:06:39 +00003924void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003925 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003926 const InputInfoList &Inputs,
3927 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00003928 const char *LinkingOutput) const {
3929 ArgStringList CmdArgs;
3930
3931 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3932 const InputInfo &Input = Inputs[0];
3933
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003934 // Determine the original source input.
3935 const Action *SourceAction = &JA;
3936 while (SourceAction->getKind() != Action::InputClass) {
3937 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3938 SourceAction = SourceAction->getInputs()[0];
3939 }
3940
3941 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00003942 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003943 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003944 if (Args.hasArg(options::OPT_gstabs))
3945 CmdArgs.push_back("--gstabs");
3946 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00003947 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003948 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003949
Daniel Dunbarbe220842009-03-20 16:06:39 +00003950 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003951 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00003952
Daniel Dunbar6d484762010-07-22 01:47:22 +00003953 // Use -force_cpusubtype_ALL on x86 by default.
3954 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3955 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003956 Args.hasArg(options::OPT_force__cpusubtype__ALL))
3957 CmdArgs.push_back("-force_cpusubtype_ALL");
3958
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00003959 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003960 (((Args.hasArg(options::OPT_mkernel) ||
3961 Args.hasArg(options::OPT_fapple_kext)) &&
3962 (!getDarwinToolChain().isTargetIPhoneOS() ||
3963 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
3964 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003965 CmdArgs.push_back("-static");
3966
Daniel Dunbarbe220842009-03-20 16:06:39 +00003967 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3968 options::OPT_Xassembler);
3969
3970 assert(Output.isFilename() && "Unexpected lipo output.");
3971 CmdArgs.push_back("-o");
3972 CmdArgs.push_back(Output.getFilename());
3973
Daniel Dunbarb440f562010-08-02 02:38:21 +00003974 assert(Input.isFilename() && "Invalid input.");
3975 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00003976
3977 // asm_final spec is empty.
3978
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003979 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003980 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003981 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00003982}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00003983
David Blaikie68e081d2011-12-20 02:48:34 +00003984void darwin::DarwinTool::anchor() {}
3985
Daniel Dunbare9ded432009-09-09 18:36:20 +00003986void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3987 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003988 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003989
Daniel Dunbarc1964212009-03-26 16:23:12 +00003990 // Derived from darwin_arch spec.
3991 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003992 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003993
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003994 // FIXME: Is this needed anymore?
3995 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003996 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00003997}
3998
Bill Wendling3b2000f2012-10-02 18:02:50 +00003999bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4000 // We only need to generate a temp path for LTO if we aren't compiling object
4001 // files. When compiling source files, we run 'dsymutil' after linking. We
4002 // don't run 'dsymutil' when compiling object files.
4003 for (InputInfoList::const_iterator
4004 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4005 if (it->getType() != types::TY_Object)
4006 return true;
4007
4008 return false;
4009}
4010
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004011void darwin::Link::AddLinkArgs(Compilation &C,
4012 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004013 ArgStringList &CmdArgs,
4014 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004015 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004016 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004017
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004018 unsigned Version[3] = { 0, 0, 0 };
4019 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4020 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004021 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004022 Version[1], Version[2], HadExtra) ||
4023 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004024 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004025 << A->getAsString(Args);
4026 }
4027
4028 // Newer linkers support -demangle, pass it if supported and not disabled by
4029 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004030 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004031 // Don't pass -demangle to ld_classic.
4032 //
4033 // FIXME: This is a temporary workaround, ld should be handling this.
4034 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4035 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004036 if (getToolChain().getArch() == llvm::Triple::x86) {
4037 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4038 options::OPT_Wl_COMMA),
4039 ie = Args.filtered_end(); it != ie; ++it) {
4040 const Arg *A = *it;
4041 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004042 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004043 UsesLdClassic = true;
4044 }
4045 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004046 if (!UsesLdClassic)
4047 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004048 }
4049
Bill Wendling313b6bf2012-11-16 23:03:00 +00004050 // If we are using LTO, then automatically create a temporary file path for
4051 // the linker to use, so that it's lifetime will extend past a possible
4052 // dsymutil step.
4053 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4054 const char *TmpPath = C.getArgs().MakeArgString(
4055 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4056 C.addTempFile(TmpPath);
4057 CmdArgs.push_back("-object_path_lto");
4058 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004059 }
4060
Daniel Dunbarc1964212009-03-26 16:23:12 +00004061 // Derived from the "link" spec.
4062 Args.AddAllArgs(CmdArgs, options::OPT_static);
4063 if (!Args.hasArg(options::OPT_static))
4064 CmdArgs.push_back("-dynamic");
4065 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4066 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4067 // here. How do we wish to handle such things?
4068 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004069
Daniel Dunbarc1964212009-03-26 16:23:12 +00004070 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004071 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004072 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004073 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004074
4075 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4076 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4077 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4078
4079 Arg *A;
4080 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4081 (A = Args.getLastArg(options::OPT_current__version)) ||
4082 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004083 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004084 << A->getAsString(Args) << "-dynamiclib";
4085
4086 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4087 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4088 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4089 } else {
4090 CmdArgs.push_back("-dylib");
4091
4092 Arg *A;
4093 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4094 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4095 (A = Args.getLastArg(options::OPT_client__name)) ||
4096 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4097 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4098 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004099 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004100 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004101
Daniel Dunbarc1964212009-03-26 16:23:12 +00004102 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4103 "-dylib_compatibility_version");
4104 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4105 "-dylib_current_version");
4106
Daniel Dunbara48823f2010-01-22 02:04:52 +00004107 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004108
4109 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4110 "-dylib_install_name");
4111 }
4112
4113 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4114 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4115 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004116 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004117 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004118 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4119 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4120 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4121 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4122 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4123 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004124 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004125 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4126 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4127 Args.AddAllArgs(CmdArgs, options::OPT_init);
4128
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004129 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004130 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004131
4132 // If we had an explicit -mios-simulator-version-min argument, honor that,
4133 // otherwise use the traditional deployment targets. We can't just check the
4134 // is-sim attribute because existing code follows this path, and the linker
4135 // may not handle the argument.
4136 //
4137 // FIXME: We may be able to remove this, once we can verify no one depends on
4138 // it.
4139 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4140 CmdArgs.push_back("-ios_simulator_version_min");
4141 else if (DarwinTC.isTargetIPhoneOS())
4142 CmdArgs.push_back("-iphoneos_version_min");
4143 else
4144 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004145 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004146
Daniel Dunbarc1964212009-03-26 16:23:12 +00004147 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4148 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4149 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4150 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4151 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004152
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004153 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4154 options::OPT_fno_pie,
4155 options::OPT_fno_PIE)) {
4156 if (A->getOption().matches(options::OPT_fpie) ||
4157 A->getOption().matches(options::OPT_fPIE))
4158 CmdArgs.push_back("-pie");
4159 else
4160 CmdArgs.push_back("-no_pie");
4161 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004162
4163 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4164 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4165 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4166 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4167 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4168 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4169 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4170 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4171 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4172 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4173 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4174 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4175 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4176 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4177 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4178 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004179
Daniel Dunbar84384642011-05-02 21:03:47 +00004180 // Give --sysroot= preference, over the Apple specific behavior to also use
4181 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004182 StringRef sysroot = C.getSysRoot();
4183 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004184 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004185 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004186 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4187 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004188 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004189 }
4190
Daniel Dunbarc1964212009-03-26 16:23:12 +00004191 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4192 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4193 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4194 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4195 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004196 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004197 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4198 Args.AddAllArgs(CmdArgs, options::OPT_y);
4199 Args.AddLastArg(CmdArgs, options::OPT_w);
4200 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4201 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4202 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4203 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4204 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4205 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4206 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4207 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4208 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4209 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4210 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4211 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4212}
4213
4214void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004215 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004216 const InputInfoList &Inputs,
4217 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004218 const char *LinkingOutput) const {
4219 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004220
Daniel Dunbarc1964212009-03-26 16:23:12 +00004221 // The logic here is derived from gcc's behavior; most of which
4222 // comes from specs (starting with link_command). Consult gcc for
4223 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004224 ArgStringList CmdArgs;
4225
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004226 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4227 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4228 options::OPT_ccc_arcmt_migrate)) {
4229 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4230 (*I)->claim();
4231 const char *Exec =
4232 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4233 CmdArgs.push_back(Output.getFilename());
4234 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4235 return;
4236 }
4237
Daniel Dunbarc1964212009-03-26 16:23:12 +00004238 // I'm not sure why this particular decomposition exists in gcc, but
4239 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004240 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004241
Daniel Dunbarc1964212009-03-26 16:23:12 +00004242 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4243 Args.AddAllArgs(CmdArgs, options::OPT_s);
4244 Args.AddAllArgs(CmdArgs, options::OPT_t);
4245 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4246 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004247 Args.AddLastArg(CmdArgs, options::OPT_e);
4248 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4249 Args.AddAllArgs(CmdArgs, options::OPT_r);
4250
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004251 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4252 // members of static archive libraries which implement Objective-C classes or
4253 // categories.
4254 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4255 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004256
Bill Wendling58979742012-12-10 21:48:41 +00004257 if (Args.hasArg(options::OPT_rdynamic))
4258 CmdArgs.push_back("-export_dynamic");
4259
Daniel Dunbarc1964212009-03-26 16:23:12 +00004260 CmdArgs.push_back("-o");
4261 CmdArgs.push_back(Output.getFilename());
4262
Chad Rosier06fd3c62012-05-16 23:45:12 +00004263 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004264 !Args.hasArg(options::OPT_nostartfiles)) {
4265 // Derived from startfile spec.
4266 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004267 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004268 if (getDarwinToolChain().isTargetIOSSimulator()) {
4269 // The simulator doesn't have a versioned crt1 file.
4270 CmdArgs.push_back("-ldylib1.o");
4271 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004272 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4273 CmdArgs.push_back("-ldylib1.o");
4274 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004275 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004276 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004277 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004278 CmdArgs.push_back("-ldylib1.10.5.o");
4279 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004280 } else {
4281 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004282 if (!Args.hasArg(options::OPT_static)) {
4283 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004284 if (getDarwinToolChain().isTargetIOSSimulator()) {
4285 // The simulator doesn't have a versioned crt1 file.
4286 CmdArgs.push_back("-lbundle1.o");
4287 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004288 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4289 CmdArgs.push_back("-lbundle1.o");
4290 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004291 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004292 CmdArgs.push_back("-lbundle1.o");
4293 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004294 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004295 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004296 if (Args.hasArg(options::OPT_pg) &&
4297 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004298 if (Args.hasArg(options::OPT_static) ||
4299 Args.hasArg(options::OPT_object) ||
4300 Args.hasArg(options::OPT_preload)) {
4301 CmdArgs.push_back("-lgcrt0.o");
4302 } else {
4303 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004304
Daniel Dunbarc1964212009-03-26 16:23:12 +00004305 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004306 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004307 // By default on OS X 10.8 and later, we don't link with a crt1.o
4308 // file and the linker knows to use _main as the entry point. But,
4309 // when compiling with -pg, we need to link with the gcrt1.o file,
4310 // so pass the -no_new_main option to tell the linker to use the
4311 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004312 if (getDarwinToolChain().isTargetMacOS() &&
4313 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4314 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004315 } else {
4316 if (Args.hasArg(options::OPT_static) ||
4317 Args.hasArg(options::OPT_object) ||
4318 Args.hasArg(options::OPT_preload)) {
4319 CmdArgs.push_back("-lcrt0.o");
4320 } else {
4321 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004322 if (getDarwinToolChain().isTargetIOSSimulator()) {
4323 // The simulator doesn't have a versioned crt1 file.
4324 CmdArgs.push_back("-lcrt1.o");
4325 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004326 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4327 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004328 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004329 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004330 } else {
4331 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4332 CmdArgs.push_back("-lcrt1.o");
4333 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4334 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004335 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004336 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004337
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004338 // darwin_crt2 spec is empty.
4339 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004340 }
4341 }
4342 }
4343 }
4344
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004345 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4346 Args.hasArg(options::OPT_shared_libgcc) &&
4347 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004348 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004349 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004350 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004351 }
4352 }
4353
4354 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004355
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004356 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004357 // If we're building a dynamic lib with -fsanitize=address,
4358 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004359 // of them as dynamic_lookup. Linking executables is handled in
4360 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004361 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004362 if (Args.hasArg(options::OPT_dynamiclib) ||
4363 Args.hasArg(options::OPT_bundle)) {
4364 CmdArgs.push_back("-undefined");
4365 CmdArgs.push_back("dynamic_lookup");
4366 }
4367 }
4368
Daniel Dunbarc1964212009-03-26 16:23:12 +00004369 if (Args.hasArg(options::OPT_fopenmp))
4370 // This is more complicated in gcc...
4371 CmdArgs.push_back("-lgomp");
4372
Douglas Gregor9295df02012-05-15 21:00:27 +00004373 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4374
Bob Wilson16d93952012-05-15 18:57:39 +00004375 if (isObjCRuntimeLinked(Args) &&
4376 !Args.hasArg(options::OPT_nostdlib) &&
4377 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004378 // Avoid linking compatibility stubs on i386 mac.
4379 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004380 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004381 // If we don't have ARC or subscripting runtime support, link in the
4382 // runtime stubs. We have to do this *before* adding any of the normal
4383 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004384 ObjCRuntime runtime =
4385 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004386 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004387 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004388 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004389 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004390 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004391 CmdArgs.push_back("-framework");
4392 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004393 // Link libobj.
4394 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004395 }
John McCall31168b02011-06-15 23:02:42 +00004396
Daniel Dunbarc1964212009-03-26 16:23:12 +00004397 if (LinkingOutput) {
4398 CmdArgs.push_back("-arch_multiple");
4399 CmdArgs.push_back("-final_output");
4400 CmdArgs.push_back(LinkingOutput);
4401 }
4402
Daniel Dunbarc1964212009-03-26 16:23:12 +00004403 if (Args.hasArg(options::OPT_fnested_functions))
4404 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004405
Daniel Dunbarc1964212009-03-26 16:23:12 +00004406 if (!Args.hasArg(options::OPT_nostdlib) &&
4407 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004408 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004409 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004410
Daniel Dunbarc1964212009-03-26 16:23:12 +00004411 // link_ssp spec is empty.
4412
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004413 // Let the tool chain choose which runtime library to link.
4414 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004415 }
4416
Chad Rosier06fd3c62012-05-16 23:45:12 +00004417 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004418 !Args.hasArg(options::OPT_nostartfiles)) {
4419 // endfile_spec is empty.
4420 }
4421
4422 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4423 Args.AddAllArgs(CmdArgs, options::OPT_F);
4424
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004425 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004426 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004428}
4429
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004430void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004431 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004432 const InputInfoList &Inputs,
4433 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004434 const char *LinkingOutput) const {
4435 ArgStringList CmdArgs;
4436
4437 CmdArgs.push_back("-create");
4438 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004439
4440 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004441 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004442
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004443 for (InputInfoList::const_iterator
4444 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4445 const InputInfo &II = *it;
4446 assert(II.isFilename() && "Unexpected lipo input.");
4447 CmdArgs.push_back(II.getFilename());
4448 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004449 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004450 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004451 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004452}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004453
Daniel Dunbar88299622010-06-04 18:28:36 +00004454void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004455 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004456 const InputInfoList &Inputs,
4457 const ArgList &Args,
4458 const char *LinkingOutput) const {
4459 ArgStringList CmdArgs;
4460
Daniel Dunbareb86b042011-05-09 17:23:16 +00004461 CmdArgs.push_back("-o");
4462 CmdArgs.push_back(Output.getFilename());
4463
Daniel Dunbar88299622010-06-04 18:28:36 +00004464 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4465 const InputInfo &Input = Inputs[0];
4466 assert(Input.isFilename() && "Unexpected dsymutil input.");
4467 CmdArgs.push_back(Input.getFilename());
4468
Daniel Dunbar88299622010-06-04 18:28:36 +00004469 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004470 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004471 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004472}
4473
Eric Christopher551ef452011-08-23 17:56:55 +00004474void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004475 const InputInfo &Output,
4476 const InputInfoList &Inputs,
4477 const ArgList &Args,
4478 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004479 ArgStringList CmdArgs;
4480 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004481 CmdArgs.push_back("--debug-info");
4482 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004483 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004484
4485 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4486 const InputInfo &Input = Inputs[0];
4487 assert(Input.isFilename() && "Unexpected verify input");
4488
4489 // Grabbing the output of the earlier dsymutil run.
4490 CmdArgs.push_back(Input.getFilename());
4491
4492 const char *Exec =
4493 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4494 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4495}
4496
David Chisnallf571cde2012-02-15 13:39:01 +00004497void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4498 const InputInfo &Output,
4499 const InputInfoList &Inputs,
4500 const ArgList &Args,
4501 const char *LinkingOutput) const {
4502 ArgStringList CmdArgs;
4503
4504 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4505 options::OPT_Xassembler);
4506
4507 CmdArgs.push_back("-o");
4508 CmdArgs.push_back(Output.getFilename());
4509
4510 for (InputInfoList::const_iterator
4511 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4512 const InputInfo &II = *it;
4513 CmdArgs.push_back(II.getFilename());
4514 }
4515
4516 const char *Exec =
4517 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4518 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4519}
4520
4521
4522void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4523 const InputInfo &Output,
4524 const InputInfoList &Inputs,
4525 const ArgList &Args,
4526 const char *LinkingOutput) const {
4527 // FIXME: Find a real GCC, don't hard-code versions here
4528 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4529 const llvm::Triple &T = getToolChain().getTriple();
4530 std::string LibPath = "/usr/lib/";
4531 llvm::Triple::ArchType Arch = T.getArch();
4532 switch (Arch) {
4533 case llvm::Triple::x86:
4534 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4535 T.getOSName()).str() + "/4.5.2/";
4536 break;
4537 case llvm::Triple::x86_64:
4538 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4539 T.getOSName()).str();
4540 GCCLibPath += "/4.5.2/amd64/";
4541 LibPath += "amd64/";
4542 break;
4543 default:
4544 assert(0 && "Unsupported architecture");
4545 }
4546
4547 ArgStringList CmdArgs;
4548
David Chisnall272a0712012-02-29 15:06:12 +00004549 // Demangle C++ names in errors
4550 CmdArgs.push_back("-C");
4551
David Chisnallf571cde2012-02-15 13:39:01 +00004552 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4553 (!Args.hasArg(options::OPT_shared))) {
4554 CmdArgs.push_back("-e");
4555 CmdArgs.push_back("_start");
4556 }
4557
4558 if (Args.hasArg(options::OPT_static)) {
4559 CmdArgs.push_back("-Bstatic");
4560 CmdArgs.push_back("-dn");
4561 } else {
4562 CmdArgs.push_back("-Bdynamic");
4563 if (Args.hasArg(options::OPT_shared)) {
4564 CmdArgs.push_back("-shared");
4565 } else {
4566 CmdArgs.push_back("--dynamic-linker");
4567 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4568 }
4569 }
4570
4571 if (Output.isFilename()) {
4572 CmdArgs.push_back("-o");
4573 CmdArgs.push_back(Output.getFilename());
4574 } else {
4575 assert(Output.isNothing() && "Invalid output.");
4576 }
4577
4578 if (!Args.hasArg(options::OPT_nostdlib) &&
4579 !Args.hasArg(options::OPT_nostartfiles)) {
4580 if (!Args.hasArg(options::OPT_shared)) {
4581 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4582 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004583 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004584 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4585 } else {
4586 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004587 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4588 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004589 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004590 if (getToolChain().getDriver().CCCIsCXX)
4591 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004592 }
4593
4594 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4595
4596 Args.AddAllArgs(CmdArgs, options::OPT_L);
4597 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4598 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004599 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004600
4601 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4602
4603 if (!Args.hasArg(options::OPT_nostdlib) &&
4604 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004605 if (getToolChain().getDriver().CCCIsCXX)
4606 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004607 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004608 if (!Args.hasArg(options::OPT_shared)) {
4609 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004610 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004611 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004612 }
David Chisnallf571cde2012-02-15 13:39:01 +00004613 }
4614
4615 if (!Args.hasArg(options::OPT_nostdlib) &&
4616 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004617 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004618 }
David Chisnall96de9932012-02-16 16:00:47 +00004619 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004620
4621 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4622
4623 const char *Exec =
4624 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4625 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4626}
4627
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004628void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004629 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004630 const InputInfoList &Inputs,
4631 const ArgList &Args,
4632 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004633 ArgStringList CmdArgs;
4634
4635 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4636 options::OPT_Xassembler);
4637
4638 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004639 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004640
4641 for (InputInfoList::const_iterator
4642 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4643 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004644 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004645 }
4646
4647 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004648 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004649 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004650}
4651
4652void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004653 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004654 const InputInfoList &Inputs,
4655 const ArgList &Args,
4656 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004657 ArgStringList CmdArgs;
4658
4659 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004660 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004661 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004662 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004663 }
4664
4665 if (Args.hasArg(options::OPT_static)) {
4666 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004667 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004668 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004669// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004670 CmdArgs.push_back("-Bdynamic");
4671 if (Args.hasArg(options::OPT_shared)) {
4672 CmdArgs.push_back("-shared");
4673 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004674 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004675 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4676 }
4677 }
4678
Daniel Dunbarb440f562010-08-02 02:38:21 +00004679 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004680 CmdArgs.push_back("-o");
4681 CmdArgs.push_back(Output.getFilename());
4682 } else {
4683 assert(Output.isNothing() && "Invalid output.");
4684 }
4685
4686 if (!Args.hasArg(options::OPT_nostdlib) &&
4687 !Args.hasArg(options::OPT_nostartfiles)) {
4688 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004689 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004690 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004691 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004692 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004693 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004694 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004695 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004696 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004697 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004698 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004699 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004700 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004701 }
4702
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004703 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4704 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004705 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004706
4707 Args.AddAllArgs(CmdArgs, options::OPT_L);
4708 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4709 Args.AddAllArgs(CmdArgs, options::OPT_e);
4710
Daniel Dunbar54423b22010-09-17 00:24:54 +00004711 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004712
4713 if (!Args.hasArg(options::OPT_nostdlib) &&
4714 !Args.hasArg(options::OPT_nodefaultlibs)) {
4715 // FIXME: For some reason GCC passes -lgcc before adding
4716 // the default system libraries. Just mimic this for now.
4717 CmdArgs.push_back("-lgcc");
4718
4719 if (Args.hasArg(options::OPT_pthread))
4720 CmdArgs.push_back("-pthread");
4721 if (!Args.hasArg(options::OPT_shared))
4722 CmdArgs.push_back("-lc");
4723 CmdArgs.push_back("-lgcc");
4724 }
4725
4726 if (!Args.hasArg(options::OPT_nostdlib) &&
4727 !Args.hasArg(options::OPT_nostartfiles)) {
4728 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004729 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004730 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004731 }
4732
Bill Wendling08760582011-06-27 19:15:03 +00004733 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004734
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004735 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004736 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004737 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004738}
4739
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004740void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004741 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004742 const InputInfoList &Inputs,
4743 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004744 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004745 ArgStringList CmdArgs;
4746
4747 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4748 options::OPT_Xassembler);
4749
4750 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004751 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004752
4753 for (InputInfoList::const_iterator
4754 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4755 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004756 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004757 }
4758
4759 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004760 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004761 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004762}
4763
4764void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004765 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004766 const InputInfoList &Inputs,
4767 const ArgList &Args,
4768 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004769 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004770 ArgStringList CmdArgs;
4771
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004772 // Silence warning for "clang -g foo.o -o foo"
4773 Args.ClaimAllArgs(options::OPT_g_Group);
4774 // and "clang -emit-llvm foo.o -o foo"
4775 Args.ClaimAllArgs(options::OPT_emit_llvm);
4776 // and for "clang -w foo.o -o foo". Other warning options are already
4777 // handled somewhere else.
4778 Args.ClaimAllArgs(options::OPT_w);
4779
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004780 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004781 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004782 CmdArgs.push_back("-e");
4783 CmdArgs.push_back("__start");
4784 }
4785
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004786 if (Args.hasArg(options::OPT_static)) {
4787 CmdArgs.push_back("-Bstatic");
4788 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004789 if (Args.hasArg(options::OPT_rdynamic))
4790 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004791 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004792 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004793 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004794 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004795 } else {
4796 CmdArgs.push_back("-dynamic-linker");
4797 CmdArgs.push_back("/usr/libexec/ld.so");
4798 }
4799 }
4800
Daniel Dunbarb440f562010-08-02 02:38:21 +00004801 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004802 CmdArgs.push_back("-o");
4803 CmdArgs.push_back(Output.getFilename());
4804 } else {
4805 assert(Output.isNothing() && "Invalid output.");
4806 }
4807
4808 if (!Args.hasArg(options::OPT_nostdlib) &&
4809 !Args.hasArg(options::OPT_nostartfiles)) {
4810 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004811 if (Args.hasArg(options::OPT_pg))
4812 CmdArgs.push_back(Args.MakeArgString(
4813 getToolChain().GetFilePath("gcrt0.o")));
4814 else
4815 CmdArgs.push_back(Args.MakeArgString(
4816 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004817 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004818 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004819 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004820 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004821 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004822 }
4823 }
4824
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004825 std::string Triple = getToolChain().getTripleString();
4826 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004827 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004828 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004829 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004830
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004831 Args.AddAllArgs(CmdArgs, options::OPT_L);
4832 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4833 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004834 Args.AddAllArgs(CmdArgs, options::OPT_s);
4835 Args.AddAllArgs(CmdArgs, options::OPT_t);
4836 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4837 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004838
Daniel Dunbar54423b22010-09-17 00:24:54 +00004839 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004840
4841 if (!Args.hasArg(options::OPT_nostdlib) &&
4842 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004843 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004844 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004845 if (Args.hasArg(options::OPT_pg))
4846 CmdArgs.push_back("-lm_p");
4847 else
4848 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004849 }
4850
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004851 // FIXME: For some reason GCC passes -lgcc before adding
4852 // the default system libraries. Just mimic this for now.
4853 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004854
Eric Christopher17674ec2012-09-13 06:32:34 +00004855 if (Args.hasArg(options::OPT_pthread)) {
4856 if (!Args.hasArg(options::OPT_shared) &&
4857 Args.hasArg(options::OPT_pg))
4858 CmdArgs.push_back("-lpthread_p");
4859 else
4860 CmdArgs.push_back("-lpthread");
4861 }
4862
Chandler Carruth45661652011-12-17 22:32:42 +00004863 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004864 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004865 CmdArgs.push_back("-lc_p");
4866 else
4867 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004868 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004869
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004870 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004871 }
4872
4873 if (!Args.hasArg(options::OPT_nostdlib) &&
4874 !Args.hasArg(options::OPT_nostartfiles)) {
4875 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004876 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004877 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004878 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004879 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004880 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004881 }
4882
4883 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004884 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004885 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004886}
Ed Schoutene33194b2009-04-02 19:13:12 +00004887
Eli Friedman9fa28852012-08-08 23:57:20 +00004888void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4889 const InputInfo &Output,
4890 const InputInfoList &Inputs,
4891 const ArgList &Args,
4892 const char *LinkingOutput) const {
4893 ArgStringList CmdArgs;
4894
4895 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4896 options::OPT_Xassembler);
4897
4898 CmdArgs.push_back("-o");
4899 CmdArgs.push_back(Output.getFilename());
4900
4901 for (InputInfoList::const_iterator
4902 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4903 const InputInfo &II = *it;
4904 CmdArgs.push_back(II.getFilename());
4905 }
4906
4907 const char *Exec =
4908 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4909 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4910}
4911
4912void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4913 const InputInfo &Output,
4914 const InputInfoList &Inputs,
4915 const ArgList &Args,
4916 const char *LinkingOutput) const {
4917 const Driver &D = getToolChain().getDriver();
4918 ArgStringList CmdArgs;
4919
4920 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4921 (!Args.hasArg(options::OPT_shared))) {
4922 CmdArgs.push_back("-e");
4923 CmdArgs.push_back("__start");
4924 }
4925
4926 if (Args.hasArg(options::OPT_static)) {
4927 CmdArgs.push_back("-Bstatic");
4928 } else {
4929 if (Args.hasArg(options::OPT_rdynamic))
4930 CmdArgs.push_back("-export-dynamic");
4931 CmdArgs.push_back("--eh-frame-hdr");
4932 CmdArgs.push_back("-Bdynamic");
4933 if (Args.hasArg(options::OPT_shared)) {
4934 CmdArgs.push_back("-shared");
4935 } else {
4936 CmdArgs.push_back("-dynamic-linker");
4937 CmdArgs.push_back("/usr/libexec/ld.so");
4938 }
4939 }
4940
4941 if (Output.isFilename()) {
4942 CmdArgs.push_back("-o");
4943 CmdArgs.push_back(Output.getFilename());
4944 } else {
4945 assert(Output.isNothing() && "Invalid output.");
4946 }
4947
4948 if (!Args.hasArg(options::OPT_nostdlib) &&
4949 !Args.hasArg(options::OPT_nostartfiles)) {
4950 if (!Args.hasArg(options::OPT_shared)) {
4951 if (Args.hasArg(options::OPT_pg))
4952 CmdArgs.push_back(Args.MakeArgString(
4953 getToolChain().GetFilePath("gcrt0.o")));
4954 else
4955 CmdArgs.push_back(Args.MakeArgString(
4956 getToolChain().GetFilePath("crt0.o")));
4957 CmdArgs.push_back(Args.MakeArgString(
4958 getToolChain().GetFilePath("crtbegin.o")));
4959 } else {
4960 CmdArgs.push_back(Args.MakeArgString(
4961 getToolChain().GetFilePath("crtbeginS.o")));
4962 }
4963 }
4964
4965 Args.AddAllArgs(CmdArgs, options::OPT_L);
4966 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4967 Args.AddAllArgs(CmdArgs, options::OPT_e);
4968
4969 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4970
4971 if (!Args.hasArg(options::OPT_nostdlib) &&
4972 !Args.hasArg(options::OPT_nodefaultlibs)) {
4973 if (D.CCCIsCXX) {
4974 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4975 if (Args.hasArg(options::OPT_pg))
4976 CmdArgs.push_back("-lm_p");
4977 else
4978 CmdArgs.push_back("-lm");
4979 }
4980
Rafael Espindola1ad26f02012-10-23 17:07:31 +00004981 if (Args.hasArg(options::OPT_pthread)) {
4982 if (!Args.hasArg(options::OPT_shared) &&
4983 Args.hasArg(options::OPT_pg))
4984 CmdArgs.push_back("-lpthread_p");
4985 else
4986 CmdArgs.push_back("-lpthread");
4987 }
4988
Eli Friedman9fa28852012-08-08 23:57:20 +00004989 if (!Args.hasArg(options::OPT_shared)) {
4990 if (Args.hasArg(options::OPT_pg))
4991 CmdArgs.push_back("-lc_p");
4992 else
4993 CmdArgs.push_back("-lc");
4994 }
4995
4996 std::string myarch = "-lclang_rt.";
4997 const llvm::Triple &T = getToolChain().getTriple();
4998 llvm::Triple::ArchType Arch = T.getArch();
4999 switch (Arch) {
5000 case llvm::Triple::arm:
5001 myarch += ("arm");
5002 break;
5003 case llvm::Triple::x86:
5004 myarch += ("i386");
5005 break;
5006 case llvm::Triple::x86_64:
5007 myarch += ("amd64");
5008 break;
5009 default:
5010 assert(0 && "Unsupported architecture");
5011 }
5012 CmdArgs.push_back(Args.MakeArgString(myarch));
5013 }
5014
5015 if (!Args.hasArg(options::OPT_nostdlib) &&
5016 !Args.hasArg(options::OPT_nostartfiles)) {
5017 if (!Args.hasArg(options::OPT_shared))
5018 CmdArgs.push_back(Args.MakeArgString(
5019 getToolChain().GetFilePath("crtend.o")));
5020 else
5021 CmdArgs.push_back(Args.MakeArgString(
5022 getToolChain().GetFilePath("crtendS.o")));
5023 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005024
5025 const char *Exec =
5026 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5027 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005028}
5029
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005030void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005031 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005032 const InputInfoList &Inputs,
5033 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005034 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005035 ArgStringList CmdArgs;
5036
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005037 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5038 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005039 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005040 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005041 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005042 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005043 else if (getToolChain().getArch() == llvm::Triple::mips ||
5044 getToolChain().getArch() == llvm::Triple::mipsel ||
5045 getToolChain().getArch() == llvm::Triple::mips64 ||
5046 getToolChain().getArch() == llvm::Triple::mips64el) {
5047 StringRef CPUName;
5048 StringRef ABIName;
5049 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005050
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005051 CmdArgs.push_back("-march");
5052 CmdArgs.push_back(CPUName.data());
5053
5054 // Convert ABI name to the GNU tools acceptable variant.
5055 if (ABIName == "o32")
5056 ABIName = "32";
5057 else if (ABIName == "n64")
5058 ABIName = "64";
5059
5060 CmdArgs.push_back("-mabi");
5061 CmdArgs.push_back(ABIName.data());
5062
5063 if (getToolChain().getArch() == llvm::Triple::mips ||
5064 getToolChain().getArch() == llvm::Triple::mips64)
5065 CmdArgs.push_back("-EB");
5066 else
5067 CmdArgs.push_back("-EL");
5068
5069 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5070 options::OPT_fpic, options::OPT_fno_pic,
5071 options::OPT_fPIE, options::OPT_fno_PIE,
5072 options::OPT_fpie, options::OPT_fno_pie);
5073 if (LastPICArg &&
5074 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5075 LastPICArg->getOption().matches(options::OPT_fpic) ||
5076 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5077 LastPICArg->getOption().matches(options::OPT_fpie))) {
5078 CmdArgs.push_back("-KPIC");
5079 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005080 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5081 getToolChain().getArch() == llvm::Triple::thumb) {
5082 CmdArgs.push_back("-mfpu=softvfp");
5083 switch(getToolChain().getTriple().getEnvironment()) {
5084 case llvm::Triple::GNUEABI:
5085 case llvm::Triple::EABI:
5086 break;
5087
5088 default:
5089 CmdArgs.push_back("-matpcs");
5090 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005091 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005092
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005093 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5094 options::OPT_Xassembler);
5095
5096 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005097 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005098
5099 for (InputInfoList::const_iterator
5100 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5101 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005102 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005103 }
5104
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005105 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005106 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005107 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005108}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005109
5110void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005111 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005112 const InputInfoList &Inputs,
5113 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005114 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005115 const toolchains::FreeBSD& ToolChain =
5116 static_cast<const toolchains::FreeBSD&>(getToolChain());
5117 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005118 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005119
5120 // Silence warning for "clang -g foo.o -o foo"
5121 Args.ClaimAllArgs(options::OPT_g_Group);
5122 // and "clang -emit-llvm foo.o -o foo"
5123 Args.ClaimAllArgs(options::OPT_emit_llvm);
5124 // and for "clang -w foo.o -o foo". Other warning options are already
5125 // handled somewhere else.
5126 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005127
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005128 if (!D.SysRoot.empty())
5129 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5130
Roman Divackyafe2f232012-08-28 15:09:03 +00005131 if (Args.hasArg(options::OPT_pie))
5132 CmdArgs.push_back("-pie");
5133
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005134 if (Args.hasArg(options::OPT_static)) {
5135 CmdArgs.push_back("-Bstatic");
5136 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005137 if (Args.hasArg(options::OPT_rdynamic))
5138 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005139 CmdArgs.push_back("--eh-frame-hdr");
5140 if (Args.hasArg(options::OPT_shared)) {
5141 CmdArgs.push_back("-Bshareable");
5142 } else {
5143 CmdArgs.push_back("-dynamic-linker");
5144 CmdArgs.push_back("/libexec/ld-elf.so.1");
5145 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005146 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5147 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005148 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5149 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5150 CmdArgs.push_back("--hash-style=both");
5151 }
5152 }
5153 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005154 }
5155
5156 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5157 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005158 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005159 CmdArgs.push_back("-m");
5160 CmdArgs.push_back("elf_i386_fbsd");
5161 }
5162
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005163 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005164 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005165 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005166 }
5167
Daniel Dunbarb440f562010-08-02 02:38:21 +00005168 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005169 CmdArgs.push_back("-o");
5170 CmdArgs.push_back(Output.getFilename());
5171 } else {
5172 assert(Output.isNothing() && "Invalid output.");
5173 }
5174
5175 if (!Args.hasArg(options::OPT_nostdlib) &&
5176 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005177 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005178 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005179 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005180 crt1 = "gcrt1.o";
5181 else if (Args.hasArg(options::OPT_pie))
5182 crt1 = "Scrt1.o";
5183 else
5184 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005185 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005186 if (crt1)
5187 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5188
5189 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5190
5191 const char *crtbegin = NULL;
5192 if (Args.hasArg(options::OPT_static))
5193 crtbegin = "crtbeginT.o";
5194 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5195 crtbegin = "crtbeginS.o";
5196 else
5197 crtbegin = "crtbegin.o";
5198
5199 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005200 }
5201
5202 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005203 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005204 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5205 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005206 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005207 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5208 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005209 Args.AddAllArgs(CmdArgs, options::OPT_s);
5210 Args.AddAllArgs(CmdArgs, options::OPT_t);
5211 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5212 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005213
Roman Divackyafe2f232012-08-28 15:09:03 +00005214 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005215
5216 if (!Args.hasArg(options::OPT_nostdlib) &&
5217 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005218 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005219 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005220 if (Args.hasArg(options::OPT_pg))
5221 CmdArgs.push_back("-lm_p");
5222 else
5223 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005224 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005225 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5226 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005227 if (Args.hasArg(options::OPT_pg))
5228 CmdArgs.push_back("-lgcc_p");
5229 else
5230 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005231 if (Args.hasArg(options::OPT_static)) {
5232 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005233 } else if (Args.hasArg(options::OPT_pg)) {
5234 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005235 } else {
5236 CmdArgs.push_back("--as-needed");
5237 CmdArgs.push_back("-lgcc_s");
5238 CmdArgs.push_back("--no-as-needed");
5239 }
5240
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005241 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005242 if (Args.hasArg(options::OPT_pg))
5243 CmdArgs.push_back("-lpthread_p");
5244 else
5245 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005246 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005247
Roman Divacky66f22762011-02-10 16:59:40 +00005248 if (Args.hasArg(options::OPT_pg)) {
5249 if (Args.hasArg(options::OPT_shared))
5250 CmdArgs.push_back("-lc");
5251 else
5252 CmdArgs.push_back("-lc_p");
5253 CmdArgs.push_back("-lgcc_p");
5254 } else {
5255 CmdArgs.push_back("-lc");
5256 CmdArgs.push_back("-lgcc");
5257 }
5258
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005259 if (Args.hasArg(options::OPT_static)) {
5260 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005261 } else if (Args.hasArg(options::OPT_pg)) {
5262 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005263 } else {
5264 CmdArgs.push_back("--as-needed");
5265 CmdArgs.push_back("-lgcc_s");
5266 CmdArgs.push_back("--no-as-needed");
5267 }
5268 }
5269
5270 if (!Args.hasArg(options::OPT_nostdlib) &&
5271 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005272 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005274 else
5275 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005276 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005277 }
5278
Roman Divackyafe2f232012-08-28 15:09:03 +00005279 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005280
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005281 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005282 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005283 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005284}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005285
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005286void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5287 const InputInfo &Output,
5288 const InputInfoList &Inputs,
5289 const ArgList &Args,
5290 const char *LinkingOutput) const {
5291 ArgStringList CmdArgs;
5292
5293 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5294 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005295 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005296 CmdArgs.push_back("--32");
5297
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005298 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005299 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005300 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005301 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005302 CmdArgs.push_back("-EL");
5303
5304 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5305 options::OPT_Xassembler);
5306
5307 CmdArgs.push_back("-o");
5308 CmdArgs.push_back(Output.getFilename());
5309
5310 for (InputInfoList::const_iterator
5311 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5312 const InputInfo &II = *it;
5313 CmdArgs.push_back(II.getFilename());
5314 }
5315
David Chisnallddbd68f2011-09-27 22:03:18 +00005316 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005317 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5318}
5319
5320void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5321 const InputInfo &Output,
5322 const InputInfoList &Inputs,
5323 const ArgList &Args,
5324 const char *LinkingOutput) const {
5325 const Driver &D = getToolChain().getDriver();
5326 ArgStringList CmdArgs;
5327
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005328 if (!D.SysRoot.empty())
5329 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5330
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005331 if (Args.hasArg(options::OPT_static)) {
5332 CmdArgs.push_back("-Bstatic");
5333 } else {
5334 if (Args.hasArg(options::OPT_rdynamic))
5335 CmdArgs.push_back("-export-dynamic");
5336 CmdArgs.push_back("--eh-frame-hdr");
5337 if (Args.hasArg(options::OPT_shared)) {
5338 CmdArgs.push_back("-Bshareable");
5339 } else {
5340 CmdArgs.push_back("-dynamic-linker");
5341 CmdArgs.push_back("/libexec/ld.elf_so");
5342 }
5343 }
5344
5345 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5346 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005347 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005348 CmdArgs.push_back("-m");
5349 CmdArgs.push_back("elf_i386");
5350 }
5351
5352 if (Output.isFilename()) {
5353 CmdArgs.push_back("-o");
5354 CmdArgs.push_back(Output.getFilename());
5355 } else {
5356 assert(Output.isNothing() && "Invalid output.");
5357 }
5358
5359 if (!Args.hasArg(options::OPT_nostdlib) &&
5360 !Args.hasArg(options::OPT_nostartfiles)) {
5361 if (!Args.hasArg(options::OPT_shared)) {
5362 CmdArgs.push_back(Args.MakeArgString(
5363 getToolChain().GetFilePath("crt0.o")));
5364 CmdArgs.push_back(Args.MakeArgString(
5365 getToolChain().GetFilePath("crti.o")));
5366 CmdArgs.push_back(Args.MakeArgString(
5367 getToolChain().GetFilePath("crtbegin.o")));
5368 } else {
5369 CmdArgs.push_back(Args.MakeArgString(
5370 getToolChain().GetFilePath("crti.o")));
5371 CmdArgs.push_back(Args.MakeArgString(
5372 getToolChain().GetFilePath("crtbeginS.o")));
5373 }
5374 }
5375
5376 Args.AddAllArgs(CmdArgs, options::OPT_L);
5377 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5378 Args.AddAllArgs(CmdArgs, options::OPT_e);
5379 Args.AddAllArgs(CmdArgs, options::OPT_s);
5380 Args.AddAllArgs(CmdArgs, options::OPT_t);
5381 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5382 Args.AddAllArgs(CmdArgs, options::OPT_r);
5383
5384 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5385
5386 if (!Args.hasArg(options::OPT_nostdlib) &&
5387 !Args.hasArg(options::OPT_nodefaultlibs)) {
5388 if (D.CCCIsCXX) {
5389 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5390 CmdArgs.push_back("-lm");
5391 }
5392 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5393 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005394 if (Args.hasArg(options::OPT_static)) {
5395 CmdArgs.push_back("-lgcc_eh");
5396 } else {
5397 CmdArgs.push_back("--as-needed");
5398 CmdArgs.push_back("-lgcc_s");
5399 CmdArgs.push_back("--no-as-needed");
5400 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005401 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005402
5403 if (Args.hasArg(options::OPT_pthread))
5404 CmdArgs.push_back("-lpthread");
5405 CmdArgs.push_back("-lc");
5406
5407 CmdArgs.push_back("-lgcc");
5408 if (Args.hasArg(options::OPT_static)) {
5409 CmdArgs.push_back("-lgcc_eh");
5410 } else {
5411 CmdArgs.push_back("--as-needed");
5412 CmdArgs.push_back("-lgcc_s");
5413 CmdArgs.push_back("--no-as-needed");
5414 }
5415 }
5416
5417 if (!Args.hasArg(options::OPT_nostdlib) &&
5418 !Args.hasArg(options::OPT_nostartfiles)) {
5419 if (!Args.hasArg(options::OPT_shared))
5420 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5421 "crtend.o")));
5422 else
5423 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5424 "crtendS.o")));
5425 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5426 "crtn.o")));
5427 }
5428
Bill Wendling08760582011-06-27 19:15:03 +00005429 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005430
David Chisnallddbd68f2011-09-27 22:03:18 +00005431 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005432 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5433}
5434
Rafael Espindola92b00932010-08-10 00:25:48 +00005435void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5436 const InputInfo &Output,
5437 const InputInfoList &Inputs,
5438 const ArgList &Args,
5439 const char *LinkingOutput) const {
5440 ArgStringList CmdArgs;
5441
5442 // Add --32/--64 to make sure we get the format we want.
5443 // This is incomplete
5444 if (getToolChain().getArch() == llvm::Triple::x86) {
5445 CmdArgs.push_back("--32");
5446 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5447 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005448 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5449 CmdArgs.push_back("-a32");
5450 CmdArgs.push_back("-mppc");
5451 CmdArgs.push_back("-many");
5452 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5453 CmdArgs.push_back("-a64");
5454 CmdArgs.push_back("-mppc64");
5455 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005456 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005457 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005458 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5459 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005460
5461 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5462 getToolChain().getTriple());
5463 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005464
5465 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5466 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5467 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005468 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5469 getToolChain().getArch() == llvm::Triple::mipsel ||
5470 getToolChain().getArch() == llvm::Triple::mips64 ||
5471 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005472 StringRef CPUName;
5473 StringRef ABIName;
5474 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005475
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005476 CmdArgs.push_back("-march");
5477 CmdArgs.push_back(CPUName.data());
5478
5479 // Convert ABI name to the GNU tools acceptable variant.
5480 if (ABIName == "o32")
5481 ABIName = "32";
5482 else if (ABIName == "n64")
5483 ABIName = "64";
5484
5485 CmdArgs.push_back("-mabi");
5486 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005487
5488 if (getToolChain().getArch() == llvm::Triple::mips ||
5489 getToolChain().getArch() == llvm::Triple::mips64)
5490 CmdArgs.push_back("-EB");
5491 else
5492 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005493
5494 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5495 options::OPT_fpic, options::OPT_fno_pic,
5496 options::OPT_fPIE, options::OPT_fno_PIE,
5497 options::OPT_fpie, options::OPT_fno_pie);
5498 if (LastPICArg &&
5499 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5500 LastPICArg->getOption().matches(options::OPT_fpic) ||
5501 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5502 LastPICArg->getOption().matches(options::OPT_fpie))) {
5503 CmdArgs.push_back("-KPIC");
5504 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005505 }
5506
5507 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5508 options::OPT_Xassembler);
5509
5510 CmdArgs.push_back("-o");
5511 CmdArgs.push_back(Output.getFilename());
5512
5513 for (InputInfoList::const_iterator
5514 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5515 const InputInfo &II = *it;
5516 CmdArgs.push_back(II.getFilename());
5517 }
5518
5519 const char *Exec =
5520 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5521 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5522}
5523
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005524static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5525 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005526 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien3d3373c2012-11-19 12:04:11 +00005527 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5528 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolacc354322011-10-17 21:39:04 +00005529 if (!D.CCCIsCXX)
5530 CmdArgs.push_back("-lgcc");
5531
Logan Chien3d3373c2012-11-19 12:04:11 +00005532 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005533 if (D.CCCIsCXX)
5534 CmdArgs.push_back("-lgcc");
5535 } else {
5536 if (!D.CCCIsCXX)
5537 CmdArgs.push_back("--as-needed");
5538 CmdArgs.push_back("-lgcc_s");
5539 if (!D.CCCIsCXX)
5540 CmdArgs.push_back("--no-as-needed");
5541 }
5542
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005543 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005544 CmdArgs.push_back("-lgcc_eh");
5545 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5546 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005547
5548 // According to Android ABI, we have to link with libdl if we are
5549 // linking with non-static libgcc.
5550 //
5551 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5552 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5553 if (isAndroid && !StaticLibgcc)
5554 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005555}
5556
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005557static bool hasMipsN32ABIArg(const ArgList &Args) {
5558 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005559 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005560}
5561
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005562void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5563 const InputInfo &Output,
5564 const InputInfoList &Inputs,
5565 const ArgList &Args,
5566 const char *LinkingOutput) const {
5567 const toolchains::Linux& ToolChain =
5568 static_cast<const toolchains::Linux&>(getToolChain());
5569 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005570 const bool isAndroid =
5571 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005572
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005573 ArgStringList CmdArgs;
5574
Rafael Espindolad1002f62010-11-15 18:28:16 +00005575 // Silence warning for "clang -g foo.o -o foo"
5576 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005577 // and "clang -emit-llvm foo.o -o foo"
5578 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005579 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005580 // handled somewhere else.
5581 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005582
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005583 if (!D.SysRoot.empty())
5584 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005585
Peter Collingbourne24c67c62013-01-17 20:17:16 +00005586 if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared))
Rafael Espindolad47ac232010-11-17 22:26:15 +00005587 CmdArgs.push_back("-pie");
5588
Rafael Espindola1c76c592010-11-07 22:57:16 +00005589 if (Args.hasArg(options::OPT_rdynamic))
5590 CmdArgs.push_back("-export-dynamic");
5591
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005592 if (Args.hasArg(options::OPT_s))
5593 CmdArgs.push_back("-s");
5594
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005595 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5596 e = ToolChain.ExtraOpts.end();
5597 i != e; ++i)
5598 CmdArgs.push_back(i->c_str());
5599
5600 if (!Args.hasArg(options::OPT_static)) {
5601 CmdArgs.push_back("--eh-frame-hdr");
5602 }
5603
5604 CmdArgs.push_back("-m");
5605 if (ToolChain.getArch() == llvm::Triple::x86)
5606 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005607 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5608 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005609 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005610 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005611 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005612 else if (ToolChain.getArch() == llvm::Triple::ppc)
5613 CmdArgs.push_back("elf32ppclinux");
5614 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5615 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005616 else if (ToolChain.getArch() == llvm::Triple::mips)
5617 CmdArgs.push_back("elf32btsmip");
5618 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5619 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005620 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5621 if (hasMipsN32ABIArg(Args))
5622 CmdArgs.push_back("elf32btsmipn32");
5623 else
5624 CmdArgs.push_back("elf64btsmip");
5625 }
5626 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5627 if (hasMipsN32ABIArg(Args))
5628 CmdArgs.push_back("elf32ltsmipn32");
5629 else
5630 CmdArgs.push_back("elf64ltsmip");
5631 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005632 else
5633 CmdArgs.push_back("elf_x86_64");
5634
5635 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005636 if (ToolChain.getArch() == llvm::Triple::arm
5637 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005638 CmdArgs.push_back("-Bstatic");
5639 else
5640 CmdArgs.push_back("-static");
5641 } else if (Args.hasArg(options::OPT_shared)) {
5642 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005643 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005644 CmdArgs.push_back("-Bsymbolic");
5645 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005646 }
5647
5648 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005649 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005650 (!Args.hasArg(options::OPT_static) &&
5651 !Args.hasArg(options::OPT_shared))) {
5652 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005653 if (isAndroid)
5654 CmdArgs.push_back("/system/bin/linker");
5655 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005656 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005657 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5658 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005659 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005660 ToolChain.getArch() == llvm::Triple::thumb) {
5661 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5662 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5663 else
5664 CmdArgs.push_back("/lib/ld-linux.so.3");
5665 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005666 else if (ToolChain.getArch() == llvm::Triple::mips ||
5667 ToolChain.getArch() == llvm::Triple::mipsel)
5668 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005669 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005670 ToolChain.getArch() == llvm::Triple::mips64el) {
5671 if (hasMipsN32ABIArg(Args))
5672 CmdArgs.push_back("/lib32/ld.so.1");
5673 else
5674 CmdArgs.push_back("/lib64/ld.so.1");
5675 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005676 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005677 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005678 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005679 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005680 else
5681 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5682 }
5683
5684 CmdArgs.push_back("-o");
5685 CmdArgs.push_back(Output.getFilename());
5686
Rafael Espindola81937ec2010-12-01 01:52:43 +00005687 if (!Args.hasArg(options::OPT_nostdlib) &&
5688 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005689 if (!isAndroid) {
5690 const char *crt1 = NULL;
5691 if (!Args.hasArg(options::OPT_shared)){
5692 if (Args.hasArg(options::OPT_pie))
5693 crt1 = "Scrt1.o";
5694 else
5695 crt1 = "crt1.o";
5696 }
5697 if (crt1)
5698 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005699
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005700 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5701 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005702
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005703 const char *crtbegin;
5704 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005705 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005706 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005707 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005708 else if (Args.hasArg(options::OPT_pie))
5709 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005710 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005711 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005712 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005713
5714 // Add crtfastmath.o if available and fast math is enabled.
5715 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005716 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005717
5718 Args.AddAllArgs(CmdArgs, options::OPT_L);
5719
5720 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5721
Roman Divackyee8188a2011-03-01 17:53:14 +00005722 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5723 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005724 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005725
Rafael Espindola9446d762012-04-09 23:53:34 +00005726 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5727 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5728 // forward.
5729 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5730 CmdArgs.push_back("-plugin");
5731 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5732 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00005733
5734 // Try to pass driver level flags relevant to LTO code generation down to
5735 // the plugin.
5736
5737 // Handle architecture-specific flags for selecting CPU variants.
5738 if (ToolChain.getArch() == llvm::Triple::x86 ||
5739 ToolChain.getArch() == llvm::Triple::x86_64)
5740 CmdArgs.push_back(
5741 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5742 getX86TargetCPU(Args, ToolChain.getTriple())));
5743 else if (ToolChain.getArch() == llvm::Triple::arm ||
5744 ToolChain.getArch() == llvm::Triple::thumb)
5745 CmdArgs.push_back(
5746 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5747 getARMTargetCPU(Args, ToolChain.getTriple())));
5748
5749 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
5750 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00005751 }
5752
Chandler Carruth953fb082013-01-13 11:46:33 +00005753
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005754 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5755 CmdArgs.push_back("--no-demangle");
5756
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005757 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5758
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005759 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005760
Eric Christopher04997782012-11-29 18:51:05 +00005761 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005762 if (Sanitize.needsUbsanRt())
5763 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Eric Christopher04997782012-11-29 18:51:05 +00005764 if (Sanitize.needsAsanRt())
5765 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5766 if (Sanitize.needsTsanRt())
5767 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00005768 if (Sanitize.needsMsanRt())
5769 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005770
Chandler Carruth94a32012012-05-14 18:31:18 +00005771 if (D.CCCIsCXX &&
5772 !Args.hasArg(options::OPT_nostdlib) &&
5773 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005774 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5775 !Args.hasArg(options::OPT_static);
5776 if (OnlyLibstdcxxStatic)
5777 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005778 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005779 if (OnlyLibstdcxxStatic)
5780 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005781 CmdArgs.push_back("-lm");
5782 }
5783
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005784 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005785 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5786 if (Args.hasArg(options::OPT_static))
5787 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005788
Chandler Carruth01538002013-01-17 13:19:29 +00005789 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
5790 if (OpenMP) {
5791 CmdArgs.push_back("-lgomp");
5792
5793 // FIXME: Exclude this for platforms whith libgomp that doesn't require
5794 // librt. Most modern Linux platfroms require it, but some may not.
5795 CmdArgs.push_back("-lrt");
5796 }
5797
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005798 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005799
Chandler Carruth94a32012012-05-14 18:31:18 +00005800 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00005801 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00005802 CmdArgs.push_back("-lpthread");
5803
5804 CmdArgs.push_back("-lc");
5805
5806 if (Args.hasArg(options::OPT_static))
5807 CmdArgs.push_back("--end-group");
5808 else
5809 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5810 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005811
Rafael Espindola81937ec2010-12-01 01:52:43 +00005812 if (!Args.hasArg(options::OPT_nostartfiles)) {
5813 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005814 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005815 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005816 else if (Args.hasArg(options::OPT_pie))
5817 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005818 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005819 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005820
Rafael Espindola81937ec2010-12-01 01:52:43 +00005821 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005822 if (!isAndroid)
5823 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005824 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005825 }
5826
Bill Wendling08760582011-06-27 19:15:03 +00005827 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005828
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005829 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5830}
Rafael Espindola92b00932010-08-10 00:25:48 +00005831
Chris Lattner3e2ee142010-07-07 16:01:42 +00005832void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005833 const InputInfo &Output,
5834 const InputInfoList &Inputs,
5835 const ArgList &Args,
5836 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005837 ArgStringList CmdArgs;
5838
5839 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5840 options::OPT_Xassembler);
5841
5842 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005843 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005844
5845 for (InputInfoList::const_iterator
5846 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5847 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005848 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005849 }
5850
5851 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005852 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005853 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005854}
5855
5856void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005857 const InputInfo &Output,
5858 const InputInfoList &Inputs,
5859 const ArgList &Args,
5860 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005861 const Driver &D = getToolChain().getDriver();
5862 ArgStringList CmdArgs;
5863
Daniel Dunbarb440f562010-08-02 02:38:21 +00005864 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005865 CmdArgs.push_back("-o");
5866 CmdArgs.push_back(Output.getFilename());
5867 } else {
5868 assert(Output.isNothing() && "Invalid output.");
5869 }
5870
5871 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005872 !Args.hasArg(options::OPT_nostartfiles)) {
5873 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5874 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5875 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5876 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5877 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005878
5879 Args.AddAllArgs(CmdArgs, options::OPT_L);
5880 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5881 Args.AddAllArgs(CmdArgs, options::OPT_e);
5882
Daniel Dunbar54423b22010-09-17 00:24:54 +00005883 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005884
Eli Friedman83de5132011-12-08 23:54:21 +00005885 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5886
Chris Lattner3e2ee142010-07-07 16:01:42 +00005887 if (!Args.hasArg(options::OPT_nostdlib) &&
5888 !Args.hasArg(options::OPT_nodefaultlibs)) {
5889 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005890 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005891 CmdArgs.push_back("-lm");
5892 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005893 }
5894
5895 if (!Args.hasArg(options::OPT_nostdlib) &&
5896 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005897 if (Args.hasArg(options::OPT_pthread))
5898 CmdArgs.push_back("-lpthread");
5899 CmdArgs.push_back("-lc");
5900 CmdArgs.push_back("-lCompilerRT-Generic");
5901 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5902 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00005903 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005904 }
5905
Eli Friedman83de5132011-12-08 23:54:21 +00005906 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005907 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005908}
5909
Daniel Dunbarcc912342009-05-02 18:28:39 +00005910/// DragonFly Tools
5911
5912// For now, DragonFly Assemble does just about the same as for
5913// FreeBSD, but this may change soon.
5914void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005915 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005916 const InputInfoList &Inputs,
5917 const ArgList &Args,
5918 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005919 ArgStringList CmdArgs;
5920
5921 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5922 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005923 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00005924 CmdArgs.push_back("--32");
5925
5926 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5927 options::OPT_Xassembler);
5928
5929 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005930 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005931
5932 for (InputInfoList::const_iterator
5933 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5934 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005935 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005936 }
5937
5938 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005939 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005940 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005941}
5942
5943void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005944 const InputInfo &Output,
5945 const InputInfoList &Inputs,
5946 const ArgList &Args,
5947 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005948 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005949 ArgStringList CmdArgs;
5950
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005951 if (!D.SysRoot.empty())
5952 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5953
Daniel Dunbarcc912342009-05-02 18:28:39 +00005954 if (Args.hasArg(options::OPT_static)) {
5955 CmdArgs.push_back("-Bstatic");
5956 } else {
5957 if (Args.hasArg(options::OPT_shared))
5958 CmdArgs.push_back("-Bshareable");
5959 else {
5960 CmdArgs.push_back("-dynamic-linker");
5961 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5962 }
5963 }
5964
5965 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5966 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005967 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005968 CmdArgs.push_back("-m");
5969 CmdArgs.push_back("elf_i386");
5970 }
5971
Daniel Dunbarb440f562010-08-02 02:38:21 +00005972 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005973 CmdArgs.push_back("-o");
5974 CmdArgs.push_back(Output.getFilename());
5975 } else {
5976 assert(Output.isNothing() && "Invalid output.");
5977 }
5978
5979 if (!Args.hasArg(options::OPT_nostdlib) &&
5980 !Args.hasArg(options::OPT_nostartfiles)) {
5981 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005982 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005983 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005984 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005985 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005986 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005987 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005988 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005989 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005990 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005991 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005992 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005993 }
5994 }
5995
5996 Args.AddAllArgs(CmdArgs, options::OPT_L);
5997 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5998 Args.AddAllArgs(CmdArgs, options::OPT_e);
5999
Daniel Dunbar54423b22010-09-17 00:24:54 +00006000 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006001
6002 if (!Args.hasArg(options::OPT_nostdlib) &&
6003 !Args.hasArg(options::OPT_nodefaultlibs)) {
6004 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6005 // rpaths
6006 CmdArgs.push_back("-L/usr/lib/gcc41");
6007
6008 if (!Args.hasArg(options::OPT_static)) {
6009 CmdArgs.push_back("-rpath");
6010 CmdArgs.push_back("/usr/lib/gcc41");
6011
6012 CmdArgs.push_back("-rpath-link");
6013 CmdArgs.push_back("/usr/lib/gcc41");
6014
6015 CmdArgs.push_back("-rpath");
6016 CmdArgs.push_back("/usr/lib");
6017
6018 CmdArgs.push_back("-rpath-link");
6019 CmdArgs.push_back("/usr/lib");
6020 }
6021
Rafael Espindola38360b32010-07-20 12:59:03 +00006022 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006023 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006024 CmdArgs.push_back("-lm");
6025 }
6026
Daniel Dunbarcc912342009-05-02 18:28:39 +00006027 if (Args.hasArg(options::OPT_shared)) {
6028 CmdArgs.push_back("-lgcc_pic");
6029 } else {
6030 CmdArgs.push_back("-lgcc");
6031 }
6032
6033
6034 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006035 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006036
6037 if (!Args.hasArg(options::OPT_nolibc)) {
6038 CmdArgs.push_back("-lc");
6039 }
6040
6041 if (Args.hasArg(options::OPT_shared)) {
6042 CmdArgs.push_back("-lgcc_pic");
6043 } else {
6044 CmdArgs.push_back("-lgcc");
6045 }
6046 }
6047
6048 if (!Args.hasArg(options::OPT_nostdlib) &&
6049 !Args.hasArg(options::OPT_nostartfiles)) {
6050 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006051 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006052 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006053 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006054 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006055 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006056 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006057 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006058 }
6059
Bill Wendling08760582011-06-27 19:15:03 +00006060 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006061
Daniel Dunbarcc912342009-05-02 18:28:39 +00006062 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006063 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006064 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006065}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006066
6067void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6068 const InputInfo &Output,
6069 const InputInfoList &Inputs,
6070 const ArgList &Args,
6071 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006072 ArgStringList CmdArgs;
6073
6074 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006075 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6076 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006077 } else {
6078 assert(Output.isNothing() && "Invalid output.");
6079 }
6080
6081 if (!Args.hasArg(options::OPT_nostdlib) &&
6082 !Args.hasArg(options::OPT_nostartfiles)) {
6083 CmdArgs.push_back("-defaultlib:libcmt");
6084 }
6085
6086 CmdArgs.push_back("-nologo");
6087
Michael J. Spencere2f49362012-06-18 16:56:04 +00006088 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6089
6090 // Add filenames immediately.
6091 for (InputInfoList::const_iterator
6092 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6093 if (it->isFilename())
6094 CmdArgs.push_back(it->getFilename());
6095 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006096
6097 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006098 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006099 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6100}