blob: eac4bc600f0fbbfdaf11319f83b2feb59133c168 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
12#include "SanitizerArgs.h"
13#include "ToolChains.h"
14#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000018#include "clang/Driver/ArgList.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000024#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000027#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000028#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000029#include "llvm/ADT/Twine.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000032#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000033#include "llvm/Support/Host.h"
34#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000036
Daniel Dunbar1a093d22009-03-18 06:00:36 +000037using namespace clang::driver;
38using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000039using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000040
Daniel Dunbar64198ef2009-09-10 01:21:05 +000041/// CheckPreprocessingOptions - Perform some validation of preprocessing
42/// arguments that is shared with gcc.
43static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
44 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000045 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000047 << A->getAsString(Args) << "-E";
48}
49
Daniel Dunbar4eadb602009-09-10 01:21:12 +000050/// CheckCodeGenerationOptions - Perform some validation of code generation
51/// arguments that is shared with gcc.
52static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
53 // In gcc, only ARM checks this, but it seems reasonable to check universally.
54 if (Args.hasArg(options::OPT_static))
55 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
56 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000057 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000058 << A->getAsString(Args) << "-static";
59}
60
Chris Lattnerbf2803f2010-03-29 17:55:58 +000061// Quote target names for inclusion in GNU Make dependency files.
62// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000063static void QuoteTarget(StringRef Target,
64 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000065 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
66 switch (Target[i]) {
67 case ' ':
68 case '\t':
69 // Escape the preceding backslashes
70 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
71 Res.push_back('\\');
72
73 // Escape the space/tab
74 Res.push_back('\\');
75 break;
76 case '$':
77 Res.push_back('$');
78 break;
79 case '#':
80 Res.push_back('\\');
81 break;
82 default:
83 break;
84 }
85
86 Res.push_back(Target[i]);
87 }
88}
89
Bill Wendlingc0938f32012-03-12 22:10:06 +000090static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000091 ArgStringList &CmdArgs,
92 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000093 const char *EnvVar) {
94 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +000095 bool CombinedArg = false;
96
Bill Wendling281ca292012-03-12 21:22:35 +000097 if (!DirList)
98 return; // Nothing to do.
99
Chad Rosier616e8a52012-10-30 21:42:09 +0000100 StringRef Name(ArgName);
101 if (Name.equals("-I") || Name.equals("-L"))
102 CombinedArg = true;
103
Bill Wendling281ca292012-03-12 21:22:35 +0000104 StringRef Dirs(DirList);
105 if (Dirs.empty()) // Empty string should not add '.'.
106 return;
107
108 StringRef::size_type Delim;
109 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
110 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000111 if (CombinedArg) {
112 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
113 } else {
114 CmdArgs.push_back(ArgName);
115 CmdArgs.push_back(".");
116 }
Bill Wendling281ca292012-03-12 21:22:35 +0000117 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000118 if (CombinedArg) {
119 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
120 } else {
121 CmdArgs.push_back(ArgName);
122 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
123 }
Bill Wendling281ca292012-03-12 21:22:35 +0000124 }
Nico Weber89355782012-03-19 15:00:03 +0000125 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000126 }
127
128 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000129 if (CombinedArg) {
130 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
131 } else {
132 CmdArgs.push_back(ArgName);
133 CmdArgs.push_back(".");
134 }
Bill Wendling281ca292012-03-12 21:22:35 +0000135 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000136 if (CombinedArg) {
137 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
138 } else {
139 CmdArgs.push_back(ArgName);
140 CmdArgs.push_back(Args.MakeArgString(Dirs));
141 }
Bill Wendling281ca292012-03-12 21:22:35 +0000142 }
143}
144
Daniel Dunbar54423b22010-09-17 00:24:54 +0000145static void AddLinkerInputs(const ToolChain &TC,
146 const InputInfoList &Inputs, const ArgList &Args,
147 ArgStringList &CmdArgs) {
148 const Driver &D = TC.getDriver();
149
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000150 // Add extra linker input arguments which are not treated as inputs
151 // (constructed via -Xarch_).
152 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
153
Daniel Dunbar54423b22010-09-17 00:24:54 +0000154 for (InputInfoList::const_iterator
155 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
156 const InputInfo &II = *it;
157
158 if (!TC.HasNativeLLVMSupport()) {
159 // Don't try to pass LLVM inputs unless we have native support.
160 if (II.getType() == types::TY_LLVM_IR ||
161 II.getType() == types::TY_LTO_IR ||
162 II.getType() == types::TY_LLVM_BC ||
163 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000164 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000165 << TC.getTripleString();
166 }
167
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000168 // Add filenames immediately.
169 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000170 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000171 continue;
172 }
173
174 // Otherwise, this is a linker input argument.
175 const Arg &A = II.getInputArg();
176
177 // Handle reserved library options.
178 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000179 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000180 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
181 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000182 } else
183 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000184 }
Bill Wendling281ca292012-03-12 21:22:35 +0000185
186 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000187 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188}
189
John McCall31168b02011-06-15 23:02:42 +0000190/// \brief Determine whether Objective-C automated reference counting is
191/// enabled.
192static bool isObjCAutoRefCount(const ArgList &Args) {
193 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
194}
195
Ted Kremeneke65b0862012-03-06 20:05:56 +0000196/// \brief Determine whether we are linking the ObjC runtime.
197static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000198 if (isObjCAutoRefCount(Args)) {
199 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000200 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000201 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000202 return Args.hasArg(options::OPT_fobjc_link_runtime);
203}
204
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000205static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000206 ArgStringList &CmdArgs,
207 llvm::Triple Triple) {
208 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
209 Args.hasArg(options::OPT_fprofile_generate) ||
210 Args.hasArg(options::OPT_fcreate_profile) ||
211 Args.hasArg(options::OPT_coverage)))
212 return;
213
214 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
215 // the link line. We cannot do the same thing because unlike gcov there is a
216 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
217 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000218 std::string ProfileRT =
219 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000220
Bill Wendling08760582011-06-27 19:15:03 +0000221 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000222}
223
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000224static bool forwardToGCC(const Option &O) {
225 return !O.hasFlag(options::NoForward) &&
226 !O.hasFlag(options::DriverOption) &&
227 !O.hasFlag(options::LinkerInput);
228}
229
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000230void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000231 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000232 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000233 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000234 ArgStringList &CmdArgs,
235 const InputInfo &Output,
236 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000237 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000238
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000239 CheckPreprocessingOptions(D, Args);
240
241 Args.AddLastArg(CmdArgs, options::OPT_C);
242 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000243
244 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000245 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000246 (A = Args.getLastArg(options::OPT_MD)) ||
247 (A = Args.getLastArg(options::OPT_MMD))) {
248 // Determine the output location.
249 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000250 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000251 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000252 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000253 } else if (Output.getType() == types::TY_Dependencies) {
254 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000255 } else if (A->getOption().matches(options::OPT_M) ||
256 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000257 DepFile = "-";
258 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000259 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000260 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 }
262 CmdArgs.push_back("-dependency-file");
263 CmdArgs.push_back(DepFile);
264
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000265 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
267 const char *DepTarget;
268
269 // If user provided -o, that is the dependency target, except
270 // when we are only generating a dependency file.
271 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
272 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000273 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000274 } else {
275 // Otherwise derive from the base input.
276 //
277 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000278 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000279 llvm::sys::path::replace_extension(P, "o");
280 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 }
282
283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000285 QuoteTarget(DepTarget, Quoted);
286 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 }
288
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000289 if (A->getOption().matches(options::OPT_M) ||
290 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291 CmdArgs.push_back("-sys-header-deps");
292 }
293
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000294 if (Args.hasArg(options::OPT_MG)) {
295 if (!A || A->getOption().matches(options::OPT_MD) ||
296 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000297 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000298 CmdArgs.push_back("-MG");
299 }
300
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000302
303 // Convert all -MQ <target> args to -MT <quoted target>
304 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
305 options::OPT_MQ),
306 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000307 const Arg *A = *it;
308 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000309
Daniel Dunbara442fd52010-06-11 22:00:13 +0000310 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000312 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000313 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 CmdArgs.push_back(Args.MakeArgString(Quoted));
315
316 // -MT flag - no change
317 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000318 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319 }
320 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321
Douglas Gregor111af7d2009-04-18 00:34:01 +0000322 // Add -i* options, and automatically translate to
323 // -include-pch/-include-pth for transparent PCH support. It's
324 // wonky, but we include looking for .gch so we can support seamless
325 // replacement into a build system already set up to be generating
326 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000327 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000328 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
329 ie = Args.filtered_end(); it != ie; ++it) {
330 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331
332 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000333 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
334 RenderedImplicitInclude = true;
335
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000336 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000337 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000338
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000339 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000340 bool FoundPCH = false;
Richard Smithbd55daf2012-11-01 04:30:05 +0000341 llvm::sys::Path P(A->getValue());
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000342 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000343 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000344 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000345 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000346 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000347 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000348 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000349 }
350
Douglas Gregor111af7d2009-04-18 00:34:01 +0000351 if (!FoundPCH) {
352 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000353 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 FoundPTH = true;
355 else
356 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000357 }
358
Douglas Gregor111af7d2009-04-18 00:34:01 +0000359 if (!FoundPCH && !FoundPTH) {
360 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000361 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000362 FoundPCH = UsePCH;
363 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 }
Mike Stump11289f42009-09-09 15:08:12 +0000365 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 P.eraseSuffix();
367 }
368
369 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000370 if (IsFirstImplicitInclude) {
371 A->claim();
372 if (UsePCH)
373 CmdArgs.push_back("-include-pch");
374 else
375 CmdArgs.push_back("-include-pth");
376 CmdArgs.push_back(Args.MakeArgString(P.str()));
377 continue;
378 } else {
379 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000380 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000381 << P.str() << A->getAsString(Args);
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383 }
384 }
385
386 // Not translated, render as usual.
387 A->claim();
388 A->render(Args, CmdArgs);
389 }
390
391 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000392 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
393 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394
395 // Add -Wp, and -Xassembler if using the preprocessor.
396
397 // FIXME: There is a very unfortunate problem here, some troubled
398 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
399 // really support that we would have to parse and then translate
400 // those options. :(
401 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
402 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000403
404 // -I- is a deprecated GCC feature, reject it.
405 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000406 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000407
408 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
409 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000410 StringRef sysroot = C.getSysRoot();
411 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000412 if (!Args.hasArg(options::OPT_isysroot)) {
413 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000414 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000415 }
416 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000417
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000418 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000419 // FIXME: We should probably sink the logic for handling these from the
420 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000421 // CPATH - included following the user specified includes (but prior to
422 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000423 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000424 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000426 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000432
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000433 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000434 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000435 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000436
437 // Add system include arguments.
438 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000439}
440
Daniel Dunbarf492c922009-09-10 22:59:51 +0000441/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000442/// CPU.
443//
444// FIXME: This is redundant with -mcpu, why does LLVM use this.
445// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000447 return llvm::StringSwitch<const char *>(CPU)
448 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
449 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
450 .Cases("arm920", "arm920t", "arm922t", "v4t")
451 .Cases("arm940t", "ep9312","v4t")
452 .Cases("arm10tdmi", "arm1020t", "v5")
453 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
454 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
455 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
456 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
457 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
458 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Quentin Colombet2e9952e2012-11-29 23:15:27 +0000459 .Cases("cortex-a5", "cortex-a8", "cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000460 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000461 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000462 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000463 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000464 .Case("cortex-a9-mp", "v7f")
465 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000466 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000467}
468
Benjamin Kramer09811c72012-06-26 22:20:06 +0000469/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
470//
471// FIXME: tblgen this.
472static std::string getARMTargetCPU(const ArgList &Args,
473 const llvm::Triple &Triple) {
474 // FIXME: Warn on inconsistent use of -mcpu and -march.
475
476 // If we have -mcpu=, use that.
477 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000478 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000479 // Handle -mcpu=native.
480 if (MCPU == "native")
481 return llvm::sys::getHostCPUName();
482 else
483 return MCPU;
484 }
485
486 StringRef MArch;
487 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
488 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000489 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000490 } else {
491 // Otherwise, use the Arch from the triple.
492 MArch = Triple.getArchName();
493 }
494
495 // Handle -march=native.
496 std::string NativeMArch;
497 if (MArch == "native") {
498 std::string CPU = llvm::sys::getHostCPUName();
499 if (CPU != "generic") {
500 // Translate the native cpu into the architecture. The switch below will
501 // then chose the minimum cpu for that arch.
502 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
503 MArch = NativeMArch;
504 }
505 }
506
507 return llvm::StringSwitch<const char *>(MArch)
508 .Cases("armv2", "armv2a","arm2")
509 .Case("armv3", "arm6")
510 .Case("armv3m", "arm7m")
511 .Cases("armv4", "armv4t", "arm7tdmi")
512 .Cases("armv5", "armv5t", "arm10tdmi")
513 .Cases("armv5e", "armv5te", "arm1022e")
514 .Case("armv5tej", "arm926ej-s")
515 .Cases("armv6", "armv6k", "arm1136jf-s")
516 .Case("armv6j", "arm1136j-s")
517 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
518 .Case("armv6t2", "arm1156t2-s")
519 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000520 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
521 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000522 .Cases("armv7r", "armv7-r", "cortex-r4")
523 .Cases("armv7m", "armv7-m", "cortex-m3")
524 .Case("ep9312", "ep9312")
525 .Case("iwmmxt", "iwmmxt")
526 .Case("xscale", "xscale")
527 .Cases("armv6m", "armv6-m", "cortex-m0")
528 // If all else failed, return the most base CPU LLVM supports.
529 .Default("arm7tdmi");
530}
531
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000532// FIXME: Move to target hook.
533static bool isSignedCharDefault(const llvm::Triple &Triple) {
534 switch (Triple.getArch()) {
535 default:
536 return true;
537
Tim Northover9bb857a2013-01-31 12:13:10 +0000538 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000539 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000540 case llvm::Triple::ppc:
541 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000542 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000543 return true;
544 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000545 }
546}
547
Chad Rosiercfbfc582012-04-04 20:51:35 +0000548// Handle -mfpu=.
549//
550// FIXME: Centralize feature selection, defaulting shouldn't be also in the
551// frontend target.
552static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
553 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000554 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000555
556 // Set the target features based on the FPU.
557 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
558 // Disable any default FPU support.
559 CmdArgs.push_back("-target-feature");
560 CmdArgs.push_back("-vfp2");
561 CmdArgs.push_back("-target-feature");
562 CmdArgs.push_back("-vfp3");
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("-neon");
565 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
566 CmdArgs.push_back("-target-feature");
567 CmdArgs.push_back("+vfp3");
568 CmdArgs.push_back("-target-feature");
569 CmdArgs.push_back("+d16");
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("-neon");
572 } else if (FPU == "vfp") {
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("+vfp2");
575 CmdArgs.push_back("-target-feature");
576 CmdArgs.push_back("-neon");
577 } else if (FPU == "vfp3" || FPU == "vfpv3") {
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("+vfp3");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("-neon");
582 } else if (FPU == "neon") {
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("+neon");
585 } else
586 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
587}
588
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000589// Handle -mfpmath=.
590static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000591 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000592 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000593
594 // Set the target features based on the FPMath.
595 if (FPMath == "neon") {
596 CmdArgs.push_back("-target-feature");
597 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000598
Silviu Baranga157f7c62012-09-13 15:06:00 +0000599 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
Quentin Colombet2e9952e2012-11-29 23:15:27 +0000600 CPU != "cortex-a15" && CPU != "cortex-a5")
Chad Rosier45619cb2012-04-04 22:13:40 +0000601 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
602
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000603 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
604 FPMath == "vfp4") {
605 CmdArgs.push_back("-target-feature");
606 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000607
608 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000609 } else
610 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
611}
612
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000613// Select the float ABI as determined by -msoft-float, -mhard-float, and
614// -mfloat-abi=.
615static StringRef getARMFloatABI(const Driver &D,
616 const ArgList &Args,
617 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000618 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000619 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
620 options::OPT_mhard_float,
621 options::OPT_mfloat_abi_EQ)) {
622 if (A->getOption().matches(options::OPT_msoft_float))
623 FloatABI = "soft";
624 else if (A->getOption().matches(options::OPT_mhard_float))
625 FloatABI = "hard";
626 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000627 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000629 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000630 << A->getAsString(Args);
631 FloatABI = "soft";
632 }
633 }
634 }
635
636 // If unspecified, choose the default based on the platform.
637 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000638 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000639 case llvm::Triple::Darwin:
640 case llvm::Triple::MacOSX:
641 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000642 // Darwin defaults to "softfp" for v6 and v7.
643 //
644 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000645 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000646 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000647 if (StringRef(ArchName).startswith("v6") ||
648 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000649 FloatABI = "softfp";
650 else
651 FloatABI = "soft";
652 break;
653 }
654
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000655 case llvm::Triple::FreeBSD:
656 // FreeBSD defaults to soft float
657 FloatABI = "soft";
658 break;
659
Daniel Dunbar78485922009-09-10 23:00:09 +0000660 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000661 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000662 case llvm::Triple::GNUEABIHF:
663 FloatABI = "hard";
664 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000665 case llvm::Triple::GNUEABI:
666 FloatABI = "softfp";
667 break;
668 case llvm::Triple::EABI:
669 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
670 FloatABI = "softfp";
671 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000672 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000673 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000674 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000675 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000676 FloatABI = "softfp";
677 else
678 FloatABI = "soft";
679 break;
680 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000681 default:
682 // Assume "soft", but warn the user we are guessing.
683 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000684 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000685 break;
686 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000687 }
688 }
689
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000690 return FloatABI;
691}
692
693
694void Clang::AddARMTargetArgs(const ArgList &Args,
695 ArgStringList &CmdArgs,
696 bool KernelOrKext) const {
697 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000698 // Get the effective triple, which takes into account the deployment target.
699 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
700 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000701 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000702
703 // Select the ABI to use.
704 //
705 // FIXME: Support -meabi.
706 const char *ABIName = 0;
707 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000708 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000709 } else if (Triple.isOSDarwin()) {
710 // The backend is hardwired to assume AAPCS for M-class processors, ensure
711 // the frontend matches that.
712 if (StringRef(CPUName).startswith("cortex-m")) {
713 ABIName = "aapcs";
714 } else {
715 ABIName = "apcs-gnu";
716 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000717 } else {
718 // Select the default based on the platform.
719 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000720 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000721 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000722 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000723 ABIName = "aapcs-linux";
724 break;
725 case llvm::Triple::EABI:
726 ABIName = "aapcs";
727 break;
728 default:
729 ABIName = "apcs-gnu";
730 }
731 }
732 CmdArgs.push_back("-target-abi");
733 CmdArgs.push_back(ABIName);
734
735 // Set the CPU based on -march= and -mcpu=.
736 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000737 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000738
739 // Determine floating point ABI from the options & target defaults.
740 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000741 if (FloatABI == "soft") {
742 // Floating point operations and argument passing are soft.
743 //
744 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000745 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000746 CmdArgs.push_back("-mfloat-abi");
747 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000748 } else if (FloatABI == "softfp") {
749 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000750 CmdArgs.push_back("-mfloat-abi");
751 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 } else {
753 // Floating point operations and argument passing are hard.
754 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000755 CmdArgs.push_back("-mfloat-abi");
756 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000757 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000758
759 // Set appropriate target features for floating point mode.
760 //
761 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
762 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
763 // stripped out by the ARM target.
764
765 // Use software floating point operations?
766 if (FloatABI == "soft") {
767 CmdArgs.push_back("-target-feature");
768 CmdArgs.push_back("+soft-float");
769 }
770
771 // Use software floating point argument passing?
772 if (FloatABI != "hard") {
773 CmdArgs.push_back("-target-feature");
774 CmdArgs.push_back("+soft-float-abi");
775 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000776
777 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000778 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000779 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000780
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000781 // Honor -mfpmath=.
782 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000783 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000784
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000785 // Setting -msoft-float effectively disables NEON because of the GCC
786 // implementation, although the same isn't true of VFP or VFP3.
787 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000788 CmdArgs.push_back("-target-feature");
789 CmdArgs.push_back("-neon");
790 }
791
792 // Kernel code has more strict alignment requirements.
793 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000794 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
795 CmdArgs.push_back("-backend-option");
796 CmdArgs.push_back("-arm-long-calls");
797 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000798
Daniel Dunbar12100e22011-03-22 16:48:17 +0000799 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000800 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000801
802 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000803 CmdArgs.push_back("-backend-option");
804 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000805 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000806
807 // Setting -mno-global-merge disables the codegen global merge pass. Setting
808 // -mglobal-merge has no effect as the pass is enabled by default.
809 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
810 options::OPT_mno_global_merge)) {
811 if (A->getOption().matches(options::OPT_mno_global_merge))
812 CmdArgs.push_back("-mno-global-merge");
813 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000814
Chad Rosierc14ded72012-05-16 21:19:55 +0000815 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000816 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000817}
818
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000819// Translate MIPS CPU name alias option to CPU name.
820static StringRef getMipsCPUFromAlias(const Arg &A) {
821 if (A.getOption().matches(options::OPT_mips32))
822 return "mips32";
823 if (A.getOption().matches(options::OPT_mips32r2))
824 return "mips32r2";
825 if (A.getOption().matches(options::OPT_mips64))
826 return "mips64";
827 if (A.getOption().matches(options::OPT_mips64r2))
828 return "mips64r2";
829 llvm_unreachable("Unexpected option");
830 return "";
831}
832
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000833// Get CPU and ABI names. They are not independent
834// so we have to calculate them together.
835static void getMipsCPUAndABI(const ArgList &Args,
836 const ToolChain &TC,
837 StringRef &CPUName,
838 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000839 const char *DefMips32CPU = "mips32";
840 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000841
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000842 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000843 options::OPT_mcpu_EQ,
844 options::OPT_mips_CPUs_Group)) {
845 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
846 CPUName = getMipsCPUFromAlias(*A);
847 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000848 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000849 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000850
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000851 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +0000852 ABIName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000853
854 // Setup default CPU and ABI names.
855 if (CPUName.empty() && ABIName.empty()) {
856 switch (TC.getTriple().getArch()) {
857 default:
858 llvm_unreachable("Unexpected triple arch name");
859 case llvm::Triple::mips:
860 case llvm::Triple::mipsel:
861 CPUName = DefMips32CPU;
862 break;
863 case llvm::Triple::mips64:
864 case llvm::Triple::mips64el:
865 CPUName = DefMips64CPU;
866 break;
867 }
868 }
869
870 if (!ABIName.empty()) {
871 // Deduce CPU name from ABI name.
872 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000873 .Cases("32", "o32", "eabi", DefMips32CPU)
874 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000875 .Default("");
876 }
877 else if (!CPUName.empty()) {
878 // Deduce ABI name from CPU name.
879 ABIName = llvm::StringSwitch<const char *>(CPUName)
880 .Cases("mips32", "mips32r2", "o32")
881 .Cases("mips64", "mips64r2", "n64")
882 .Default("");
883 }
884
885 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000886}
887
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000888// Convert ABI name to the GNU tools acceptable variant.
889static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
890 return llvm::StringSwitch<llvm::StringRef>(ABI)
891 .Case("o32", "32")
892 .Case("n64", "64")
893 .Default(ABI);
894}
895
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000896// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
897// and -mfloat-abi=.
898static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000899 // Select the float ABI as determined by -msoft-float, -mhard-float,
900 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000901 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000902 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000903 options::OPT_mhard_float,
904 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000905 if (A->getOption().matches(options::OPT_msoft_float))
906 FloatABI = "soft";
907 else if (A->getOption().matches(options::OPT_mhard_float))
908 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000909 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000910 FloatABI = A->getValue();
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000911 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000912 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 FloatABI = "hard";
914 }
915 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000916 }
917
918 // If unspecified, choose the default based on the platform.
919 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000920 // Assume "hard", because it's a default value used by gcc.
921 // When we start to recognize specific target MIPS processors,
922 // we will be able to select the default more correctly.
923 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000924 }
925
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000926 return FloatABI;
927}
928
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000929static void AddTargetFeature(const ArgList &Args,
930 ArgStringList &CmdArgs,
931 OptSpecifier OnOpt,
932 OptSpecifier OffOpt,
933 StringRef FeatureName) {
934 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
935 CmdArgs.push_back("-target-feature");
936 if (A->getOption().matches(OnOpt))
937 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
938 else
939 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
940 }
941}
942
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000943void Clang::AddMIPSTargetArgs(const ArgList &Args,
944 ArgStringList &CmdArgs) const {
945 const Driver &D = getToolChain().getDriver();
946 StringRef CPUName;
947 StringRef ABIName;
948 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
949
950 CmdArgs.push_back("-target-cpu");
951 CmdArgs.push_back(CPUName.data());
952
953 CmdArgs.push_back("-target-abi");
954 CmdArgs.push_back(ABIName.data());
955
956 StringRef FloatABI = getMipsFloatABI(D, Args);
957
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000958 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
959
960 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000961 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000962 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000963 CmdArgs.push_back("-mfloat-abi");
964 CmdArgs.push_back("soft");
965
966 // FIXME: Note, this is a hack. We need to pass the selected float
967 // mode to the MipsTargetInfoBase to define appropriate macros there.
968 // Now it is the only method.
969 CmdArgs.push_back("-target-feature");
970 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000971
972 if (FloatABI == "hard" && IsMips16) {
973 CmdArgs.push_back("-mllvm");
974 CmdArgs.push_back("-mips16-hard-float");
975 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000976 }
977 else if (FloatABI == "single") {
978 // Restrict the use of hardware floating-point
979 // instructions to 32-bit operations.
980 CmdArgs.push_back("-target-feature");
981 CmdArgs.push_back("+single-float");
982 }
983 else {
984 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000985 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000986 CmdArgs.push_back("-mfloat-abi");
987 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000988 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000989
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000990 AddTargetFeature(Args, CmdArgs,
991 options::OPT_mips16, options::OPT_mno_mips16,
992 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000993 AddTargetFeature(Args, CmdArgs,
994 options::OPT_mdsp, options::OPT_mno_dsp,
995 "dsp");
996 AddTargetFeature(Args, CmdArgs,
997 options::OPT_mdspr2, options::OPT_mno_dspr2,
998 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000999
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001000 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1001 if (A->getOption().matches(options::OPT_mxgot)) {
1002 CmdArgs.push_back("-mllvm");
1003 CmdArgs.push_back("-mxgot");
1004 }
1005 }
1006
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001007 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001008 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001009 CmdArgs.push_back("-mllvm");
1010 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1011 A->claim();
1012 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001013}
1014
Hal Finkel8eb59282012-06-11 22:35:19 +00001015/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1016static std::string getPPCTargetCPU(const ArgList &Args) {
1017 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001018 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001019
1020 if (CPUName == "native") {
1021 std::string CPU = llvm::sys::getHostCPUName();
1022 if (!CPU.empty() && CPU != "generic")
1023 return CPU;
1024 else
1025 return "";
1026 }
1027
1028 return llvm::StringSwitch<const char *>(CPUName)
1029 .Case("common", "generic")
1030 .Case("440", "440")
1031 .Case("440fp", "440")
1032 .Case("450", "450")
1033 .Case("601", "601")
1034 .Case("602", "602")
1035 .Case("603", "603")
1036 .Case("603e", "603e")
1037 .Case("603ev", "603ev")
1038 .Case("604", "604")
1039 .Case("604e", "604e")
1040 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001041 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001042 .Case("G3", "g3")
1043 .Case("7400", "7400")
1044 .Case("G4", "g4")
1045 .Case("7450", "7450")
1046 .Case("G4+", "g4+")
1047 .Case("750", "750")
1048 .Case("970", "970")
1049 .Case("G5", "g5")
1050 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001051 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001052 .Case("e500mc", "e500mc")
1053 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001054 .Case("power3", "pwr3")
1055 .Case("power4", "pwr4")
1056 .Case("power5", "pwr5")
1057 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001058 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001059 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001060 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001061 .Case("pwr3", "pwr3")
1062 .Case("pwr4", "pwr4")
1063 .Case("pwr5", "pwr5")
1064 .Case("pwr5x", "pwr5x")
1065 .Case("pwr6", "pwr6")
1066 .Case("pwr6x", "pwr6x")
1067 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001068 .Case("powerpc", "ppc")
1069 .Case("powerpc64", "ppc64")
1070 .Default("");
1071 }
1072
1073 return "";
1074}
1075
1076void Clang::AddPPCTargetArgs(const ArgList &Args,
1077 ArgStringList &CmdArgs) const {
1078 std::string TargetCPUName = getPPCTargetCPU(Args);
1079
1080 // LLVM may default to generating code for the native CPU,
1081 // but, like gcc, we default to a more generic option for
1082 // each architecture. (except on Darwin)
1083 llvm::Triple Triple = getToolChain().getTriple();
1084 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1085 if (Triple.getArch() == llvm::Triple::ppc64)
1086 TargetCPUName = "ppc64";
1087 else
1088 TargetCPUName = "ppc";
1089 }
1090
1091 if (!TargetCPUName.empty()) {
1092 CmdArgs.push_back("-target-cpu");
1093 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1094 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001095
1096 // Allow override of the Altivec feature.
1097 if (Args.hasFlag(options::OPT_fno_altivec, options::OPT_faltivec, false)) {
1098 CmdArgs.push_back("-target-feature");
1099 CmdArgs.push_back("-altivec");
1100 }
Hal Finkelb58ce852013-02-01 18:44:19 +00001101
1102 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1103 CmdArgs.push_back("-target-feature");
1104 CmdArgs.push_back("-qpx");
1105 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001106}
1107
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001108void Clang::AddSparcTargetArgs(const ArgList &Args,
1109 ArgStringList &CmdArgs) const {
1110 const Driver &D = getToolChain().getDriver();
1111
1112 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001113 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001114 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001115 }
1116
1117 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001118 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001119 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1120 options::OPT_mhard_float)) {
1121 if (A->getOption().matches(options::OPT_msoft_float))
1122 FloatABI = "soft";
1123 else if (A->getOption().matches(options::OPT_mhard_float))
1124 FloatABI = "hard";
1125 }
1126
1127 // If unspecified, choose the default based on the platform.
1128 if (FloatABI.empty()) {
1129 switch (getToolChain().getTriple().getOS()) {
1130 default:
1131 // Assume "soft", but warn the user we are guessing.
1132 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001133 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001134 break;
1135 }
1136 }
1137
1138 if (FloatABI == "soft") {
1139 // Floating point operations and argument passing are soft.
1140 //
1141 // FIXME: This changes CPP defines, we need -target-soft-float.
1142 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001143 CmdArgs.push_back("-target-feature");
1144 CmdArgs.push_back("+soft-float");
1145 } else {
1146 assert(FloatABI == "hard" && "Invalid float abi!");
1147 CmdArgs.push_back("-mhard-float");
1148 }
1149}
1150
Chandler Carruth953fb082013-01-13 11:46:33 +00001151static const char *getX86TargetCPU(const ArgList &Args,
1152 const llvm::Triple &Triple) {
1153 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1154 if (StringRef(A->getValue()) != "native")
1155 return A->getValue();
1156
1157 // FIXME: Reject attempts to use -march=native unless the target matches
1158 // the host.
1159 //
1160 // FIXME: We should also incorporate the detected target features for use
1161 // with -native.
1162 std::string CPU = llvm::sys::getHostCPUName();
1163 if (!CPU.empty() && CPU != "generic")
1164 return Args.MakeArgString(CPU);
1165 }
1166
1167 // Select the default CPU if none was given (or detection failed).
1168
1169 if (Triple.getArch() != llvm::Triple::x86_64 &&
1170 Triple.getArch() != llvm::Triple::x86)
1171 return 0; // This routine is only handling x86 targets.
1172
1173 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1174
1175 // FIXME: Need target hooks.
1176 if (Triple.isOSDarwin())
1177 return Is64Bit ? "core2" : "yonah";
1178
1179 // Everything else goes to x86-64 in 64-bit mode.
1180 if (Is64Bit)
1181 return "x86-64";
1182
1183 if (Triple.getOSName().startswith("haiku"))
1184 return "i586";
1185 if (Triple.getOSName().startswith("openbsd"))
1186 return "i486";
1187 if (Triple.getOSName().startswith("bitrig"))
1188 return "i686";
1189 if (Triple.getOSName().startswith("freebsd"))
1190 return "i486";
1191 if (Triple.getOSName().startswith("netbsd"))
1192 return "i486";
1193 // All x86 devices running Android have core2 as their common
1194 // denominator. This makes a better choice than pentium4.
1195 if (Triple.getEnvironment() == llvm::Triple::Android)
1196 return "core2";
1197
1198 // Fallback to p4.
1199 return "pentium4";
1200}
1201
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001202void Clang::AddX86TargetArgs(const ArgList &Args,
1203 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001204 if (!Args.hasFlag(options::OPT_mred_zone,
1205 options::OPT_mno_red_zone,
1206 true) ||
1207 Args.hasArg(options::OPT_mkernel) ||
1208 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001209 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001210
Bob Wilson2616e2e2013-02-10 16:01:41 +00001211 // Default to avoid implicit floating-point for kernel/kext code, but allow
1212 // that to be overridden with -mno-soft-float.
1213 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1214 Args.hasArg(options::OPT_fapple_kext));
1215 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1216 options::OPT_mno_soft_float,
1217 options::OPT_mno_implicit_float)) {
1218 const Option &O = A->getOption();
1219 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1220 O.matches(options::OPT_msoft_float));
1221 }
1222 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001223 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001224
Chandler Carruth953fb082013-01-13 11:46:33 +00001225 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001226 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001227 CmdArgs.push_back(CPUName);
1228 }
1229
Eli Friedmanad811f02011-07-02 00:34:19 +00001230 // The required algorithm here is slightly strange: the options are applied
1231 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1232 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1233 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1234 // former correctly, but not the latter; handle directly-overridden
1235 // attributes here.
1236 llvm::StringMap<unsigned> PrevFeature;
1237 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001238 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1239 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001240 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001241 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001242
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001243 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001244 assert(Name.startswith("m") && "Invalid feature name.");
1245 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001246
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001247 bool IsNegative = Name.startswith("no-");
1248 if (IsNegative)
1249 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001250
Eli Friedmanad811f02011-07-02 00:34:19 +00001251 unsigned& Prev = PrevFeature[Name];
1252 if (Prev)
1253 Features[Prev - 1] = 0;
1254 Prev = Features.size() + 1;
1255 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1256 }
1257 for (unsigned i = 0; i < Features.size(); i++) {
1258 if (Features[i]) {
1259 CmdArgs.push_back("-target-feature");
1260 CmdArgs.push_back(Features[i]);
1261 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001262 }
1263}
1264
Matthew Curtise8f80a12012-12-06 17:49:03 +00001265static inline bool HasPICArg(const ArgList &Args) {
1266 return Args.hasArg(options::OPT_fPIC)
1267 || Args.hasArg(options::OPT_fpic);
1268}
1269
1270static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1271 return Args.getLastArg(options::OPT_G,
1272 options::OPT_G_EQ,
1273 options::OPT_msmall_data_threshold_EQ);
1274}
1275
1276static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1277 std::string value;
1278 if (HasPICArg(Args))
1279 value = "0";
1280 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1281 value = A->getValue();
1282 A->claim();
1283 }
1284 return value;
1285}
1286
Tony Linthicum76329bf2011-12-12 21:14:55 +00001287void Clang::AddHexagonTargetArgs(const ArgList &Args,
1288 ArgStringList &CmdArgs) const {
1289 llvm::Triple Triple = getToolChain().getTriple();
1290
1291 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001292 CmdArgs.push_back(Args.MakeArgString(
1293 "hexagon"
1294 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001295 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001296 CmdArgs.push_back("-mqdsp6-compat");
1297 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001298
Matthew Curtise8f80a12012-12-06 17:49:03 +00001299 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1300 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001301 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001302 CmdArgs.push_back(Args.MakeArgString(
1303 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001304 }
1305
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001306 if (!Args.hasArg(options::OPT_fno_short_enums))
1307 CmdArgs.push_back("-fshort-enums");
1308 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1309 CmdArgs.push_back ("-mllvm");
1310 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1311 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001312 CmdArgs.push_back ("-mllvm");
1313 CmdArgs.push_back ("-machine-sink-split=0");
1314}
1315
Eric Christopher84fbdb42011-08-19 00:30:14 +00001316static bool
John McCall5fb5df92012-06-20 06:18:46 +00001317shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001318 const llvm::Triple &Triple) {
1319 // We use the zero-cost exception tables for Objective-C if the non-fragile
1320 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1321 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001322 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001323 return true;
1324
Bob Wilson6524dd32011-10-14 05:03:44 +00001325 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001326 return false;
1327
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001328 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001329 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001330 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001331}
1332
Anders Carlssone96ab552011-02-28 02:27:16 +00001333/// addExceptionArgs - Adds exception related arguments to the driver command
1334/// arguments. There's a master flag, -fexceptions and also language specific
1335/// flags to enable/disable C++ and Objective-C exceptions.
1336/// This makes it possible to for example disable C++ exceptions but enable
1337/// Objective-C exceptions.
1338static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1339 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001340 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001341 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001342 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001343 if (KernelOrKext) {
1344 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1345 // arguments now to avoid warnings about unused arguments.
1346 Args.ClaimAllArgs(options::OPT_fexceptions);
1347 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1348 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1349 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1350 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1351 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001352 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001353 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001354
1355 // Exceptions are enabled by default.
1356 bool ExceptionsEnabled = true;
1357
1358 // This keeps track of whether exceptions were explicitly turned on or off.
1359 bool DidHaveExplicitExceptionFlag = false;
1360
Rafael Espindola00a66572009-10-01 13:33:33 +00001361 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1362 options::OPT_fno_exceptions)) {
1363 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001364 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001365 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001366 ExceptionsEnabled = false;
1367
1368 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001369 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001370
Anders Carlssone96ab552011-02-28 02:27:16 +00001371 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001372
Anders Carlssone96ab552011-02-28 02:27:16 +00001373 // Exception tables and cleanups can be enabled with -fexceptions even if the
1374 // language itself doesn't support exceptions.
1375 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1376 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001377
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001378 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1379 // is not necessarily sensible, but follows GCC.
1380 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001381 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001382 options::OPT_fno_objc_exceptions,
1383 true)) {
1384 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001385
Eric Christopher84fbdb42011-08-19 00:30:14 +00001386 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001387 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001388 }
1389
1390 if (types::isCXX(InputType)) {
1391 bool CXXExceptionsEnabled = ExceptionsEnabled;
1392
Eric Christopher84fbdb42011-08-19 00:30:14 +00001393 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1394 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001395 options::OPT_fexceptions,
1396 options::OPT_fno_exceptions)) {
1397 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1398 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001399 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001400 CXXExceptionsEnabled = false;
1401 }
1402
1403 if (CXXExceptionsEnabled) {
1404 CmdArgs.push_back("-fcxx-exceptions");
1405
1406 ShouldUseExceptionTables = true;
1407 }
1408 }
1409
1410 if (ShouldUseExceptionTables)
1411 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001412}
1413
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001414static bool ShouldDisableCFI(const ArgList &Args,
1415 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001416 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001417 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001418 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001419 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001420 Default = Args.hasFlag(options::OPT_integrated_as,
Eric Christopher45f2e712012-12-18 00:31:10 +00001421 options::OPT_no_integrated_as,
1422 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001423 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001424 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001425 options::OPT_fno_dwarf2_cfi_asm,
1426 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001427}
1428
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001429static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1430 const ToolChain &TC) {
1431 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1432 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1433 options::OPT_no_integrated_as,
1434 IsIADefault);
1435 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1436 options::OPT_fno_dwarf_directory_asm,
1437 UseIntegratedAs);
1438 return !UseDwarfDirectory;
1439}
1440
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001441/// \brief Check whether the given input tree contains any compilation actions.
1442static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001443 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001444 return true;
1445
1446 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1447 if (ContainsCompileAction(*it))
1448 return true;
1449
1450 return false;
1451}
1452
1453/// \brief Check if -relax-all should be passed to the internal assembler.
1454/// This is done by default when compiling non-assembler source with -O0.
1455static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1456 bool RelaxDefault = true;
1457
1458 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1459 RelaxDefault = A->getOption().matches(options::OPT_O0);
1460
1461 if (RelaxDefault) {
1462 RelaxDefault = false;
1463 for (ActionList::const_iterator it = C.getActions().begin(),
1464 ie = C.getActions().end(); it != ie; ++it) {
1465 if (ContainsCompileAction(*it)) {
1466 RelaxDefault = true;
1467 break;
1468 }
1469 }
1470 }
1471
1472 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1473 RelaxDefault);
1474}
1475
Alexey Samsonovf7a24762013-01-16 11:34:36 +00001476SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001477 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1478 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001479 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1480 // at least once (possibly, disabled further).
Richard Smith52be6192012-11-05 22:04:41 +00001481 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001482 unsigned Add, Remove;
1483 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001484 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001485 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001486 Kind |= Add;
1487 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001488 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001489 }
1490
Chad Rosierae229d52013-01-29 23:31:22 +00001491 UbsanTrapOnError =
1492 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1493 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1494 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1495
1496 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1497 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1498 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1499 D.Diag(diag::err_drv_argument_not_allowed_with)
1500 << "-fcatch-undefined-behavior"
1501 << "-fno-sanitize-undefined-trap-on-error";
1502 }
1503
1504 // Warn about undefined sanitizer options that require runtime support.
1505 if (UbsanTrapOnError && notAllowedWithTrap()) {
1506 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1507 D.Diag(diag::err_drv_argument_not_allowed_with)
1508 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1509 << "-fcatch-undefined-behavior";
1510 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1511 options::OPT_fno_sanitize_undefined_trap_on_error,
1512 false))
1513 D.Diag(diag::err_drv_argument_not_allowed_with)
1514 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1515 << "-fsanitize-undefined-trap-on-error";
1516 }
1517
Richard Smith52be6192012-11-05 22:04:41 +00001518 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001519 bool NeedsAsan = needsAsanRt();
1520 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001521 bool NeedsMsan = needsMsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001522 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001523 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001524 << lastArgumentForKind(D, Args, NeedsAsanRt)
1525 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001526 if (NeedsAsan && NeedsMsan)
1527 D.Diag(diag::err_drv_argument_not_allowed_with)
1528 << lastArgumentForKind(D, Args, NeedsAsanRt)
1529 << lastArgumentForKind(D, Args, NeedsMsanRt);
1530 if (NeedsTsan && NeedsMsan)
1531 D.Diag(diag::err_drv_argument_not_allowed_with)
1532 << lastArgumentForKind(D, Args, NeedsTsanRt)
1533 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001534
1535 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001536 // explicitly contain -fsanitize=address (probably, turned off later in the
1537 // command line).
1538 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1539 D.Diag(diag::warn_drv_unused_sanitizer)
1540 << lastArgumentForKind(D, Args, AddressFull)
1541 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001542
1543 // Parse -f(no-)sanitize-blacklist options.
1544 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1545 options::OPT_fno_sanitize_blacklist)) {
1546 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1547 std::string BLPath = BLArg->getValue();
1548 bool BLExists = false;
1549 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1550 BlacklistFile = BLPath;
1551 else
1552 D.Diag(diag::err_drv_no_such_file) << BLPath;
1553 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001554 } else {
1555 // If no -fsanitize-blacklist option is specified, try to look up for
1556 // blacklist in the resource directory.
1557 std::string BLPath;
1558 bool BLExists = false;
1559 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1560 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1561 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001562 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001563
1564 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001565 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001566 MsanTrackOrigins =
1567 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1568 options::OPT_fno_sanitize_memory_track_origins,
1569 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001570
1571 // Parse -f(no-)sanitize-address-zero-base-shadow options.
1572 if (NeedsAsan)
1573 AsanZeroBaseShadow =
1574 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1575 options::OPT_fno_sanitize_address_zero_base_shadow,
1576 /* Default */false);
Richard Smith52be6192012-11-05 22:04:41 +00001577}
1578
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001579static void addSanitizerRTLinkFlagsLinux(
1580 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
1581 const StringRef Sanitizer, bool BeforeLibStdCXX) {
1582 // Sanitizer runtime is located in the Linux library directory and
1583 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1584 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1585 llvm::sys::path::append(
1586 LibSanitizer, "lib", "linux",
1587 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
1588 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1589 // etc.) so that the linker picks custom versions of the global 'operator
1590 // new' and 'operator delete' symbols. We take the extreme (but simple)
1591 // strategy of inserting it at the front of the link command. It also
1592 // needs to be forced to end up in the executable, so wrap it in
1593 // whole-archive.
1594 if (BeforeLibStdCXX) {
1595 SmallVector<const char *, 3> PrefixArgs;
1596 PrefixArgs.push_back("-whole-archive");
1597 PrefixArgs.push_back(Args.MakeArgString(LibSanitizer));
1598 PrefixArgs.push_back("-no-whole-archive");
1599 CmdArgs.insert(CmdArgs.begin(), PrefixArgs.begin(), PrefixArgs.end());
1600 } else {
1601 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
1602 }
1603 CmdArgs.push_back("-lpthread");
1604 CmdArgs.push_back("-ldl");
1605 CmdArgs.push_back("-export-dynamic");
1606}
1607
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001608/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1609/// This needs to be called before we add the C run-time (malloc, etc).
1610static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001611 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001612 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001613 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001614 if (!Args.hasArg(options::OPT_pie))
1615 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001616 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001617
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001618 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1619 llvm::sys::path::append(LibAsan, "lib", "linux",
1620 (Twine("libclang_rt.asan-") +
1621 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001622 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001623 } else {
1624 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonov29524a92013-01-20 13:12:12 +00001625 bool ZeroBaseShadow = Args.hasFlag(
1626 options::OPT_fsanitize_address_zero_base_shadow,
1627 options::OPT_fno_sanitize_address_zero_base_shadow, false);
1628 if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) {
1629 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1630 "-fsanitize-address-zero-base-shadow" << "-pie";
1631 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001632 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001633 }
1634 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001635}
1636
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001637/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1638/// This needs to be called before we add the C run-time (malloc, etc).
1639static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1640 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001641 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001642 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=thread" << "-pie";
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001645 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001646 }
1647}
1648
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001649/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1650/// This needs to be called before we add the C run-time (malloc, etc).
1651static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1652 ArgStringList &CmdArgs) {
1653 if (!Args.hasArg(options::OPT_shared)) {
1654 if (!Args.hasArg(options::OPT_pie))
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001655 TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) <<
1656 "-fsanitize=memory" << "-pie";
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001657 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001658 }
1659}
1660
Richard Smithe30752c2012-10-09 19:52:38 +00001661/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1662/// (Linux).
1663static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1664 ArgStringList &CmdArgs) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001665 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001666}
1667
Rafael Espindola224dd632011-12-14 21:02:23 +00001668static bool shouldUseFramePointer(const ArgList &Args,
1669 const llvm::Triple &Triple) {
1670 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1671 options::OPT_fomit_frame_pointer))
1672 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1673
Rafael Espindola00b29182011-12-14 21:50:24 +00001674 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001675 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1676 Triple.getArch() == llvm::Triple::x86) &&
1677 Triple.getOS() == llvm::Triple::Linux) {
1678 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1679 if (!A->getOption().matches(options::OPT_O0))
1680 return false;
1681 }
1682
1683 return true;
1684}
1685
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001686/// If the PWD environment variable is set, add a CC1 option to specify the
1687/// debug compilation directory.
1688static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
1689 if (const char *pwd = ::getenv("PWD")) {
1690 // GCC also verifies that stat(pwd) and stat(".") have the same inode
1691 // number. Not doing those because stats are slow, but we could.
1692 if (llvm::sys::path::is_absolute(pwd)) {
1693 std::string CompDir = pwd;
1694 CmdArgs.push_back("-fdebug-compilation-dir");
1695 CmdArgs.push_back(Args.MakeArgString(CompDir));
1696 }
1697 }
1698}
1699
Eric Christopherd3804002013-02-22 20:12:52 +00001700static const char *SplitDebugName(const ArgList &Args,
1701 const InputInfoList &Inputs) {
1702 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1703 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1704 SmallString<128> T(FinalOutput->getValue());
1705 llvm::sys::path::replace_extension(T, "dwo");
1706 return Args.MakeArgString(T);
1707 } else {
1708 // Use the compilation dir.
1709 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1710 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1711 llvm::sys::path::replace_extension(F, "dwo");
1712 T += F;
1713 return Args.MakeArgString(F);
1714 }
1715}
1716
1717static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1718 const Tool &T, const JobAction &JA,
1719 const ArgList &Args, const InputInfo &Output,
1720 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001721 ArgStringList ExtractArgs;
1722 ExtractArgs.push_back("--extract-dwo");
1723
1724 ArgStringList StripArgs;
1725 StripArgs.push_back("--strip-dwo");
1726
1727 // Grabbing the output of the earlier compile step.
1728 StripArgs.push_back(Output.getFilename());
1729 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001730 ExtractArgs.push_back(OutFile);
1731
1732 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001733 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001734
1735 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001736 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001737
1738 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001739 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001740}
1741
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001742void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001743 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001744 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001745 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001746 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001747 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1748 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001749 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001750 ArgStringList CmdArgs;
1751
Daniel Dunbare521a892009-03-31 20:53:55 +00001752 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1753
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001754 // Invoke ourselves in -cc1 mode.
1755 //
1756 // FIXME: Implement custom jobs for internal actions.
1757 CmdArgs.push_back("-cc1");
1758
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001759 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001760 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001761 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001762 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001763
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001764 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001765 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001766
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001767 if (isa<AnalyzeJobAction>(JA)) {
1768 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1769 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001770 } else if (isa<MigrateJobAction>(JA)) {
1771 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001772 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001773 if (Output.getType() == types::TY_Dependencies)
1774 CmdArgs.push_back("-Eonly");
1775 else
1776 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001777 } else if (isa<AssembleJobAction>(JA)) {
1778 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001779
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001780 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001781 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001782
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001783 // When using an integrated assembler, translate -Wa, and -Xassembler
1784 // options.
1785 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1786 options::OPT_Xassembler),
1787 ie = Args.filtered_end(); it != ie; ++it) {
1788 const Arg *A = *it;
1789 A->claim();
1790
1791 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001792 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001793
1794 if (Value == "-force_cpusubtype_ALL") {
1795 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001796 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001797 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001798 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001799 CmdArgs.push_back("-mllvm");
1800 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001801 } else if (Value == "--noexecstack") {
1802 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001803 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001804 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001805 << A->getOption().getName() << Value;
1806 }
1807 }
1808 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001809
1810 // Also ignore explicit -force_cpusubtype_ALL option.
1811 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001812 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001813 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001814 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001815
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001816 if (JA.getType() == types::TY_Nothing)
1817 CmdArgs.push_back("-fsyntax-only");
1818 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001819 CmdArgs.push_back("-emit-pch");
1820 else
1821 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001822 } else {
1823 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001824
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001825 if (JA.getType() == types::TY_Nothing) {
1826 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001827 } else if (JA.getType() == types::TY_LLVM_IR ||
1828 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001829 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001830 } else if (JA.getType() == types::TY_LLVM_BC ||
1831 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001832 CmdArgs.push_back("-emit-llvm-bc");
1833 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001834 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001835 } else if (JA.getType() == types::TY_AST) {
1836 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001837 } else if (JA.getType() == types::TY_RewrittenObjC) {
1838 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001839 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001840 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1841 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001842 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001843 } else {
1844 assert(JA.getType() == types::TY_PP_Asm &&
1845 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001846 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001847 }
1848
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001849 // The make clang go fast button.
1850 CmdArgs.push_back("-disable-free");
1851
John McCallbb79b5f2010-02-13 03:50:24 +00001852 // Disable the verification pass in -asserts builds.
1853#ifdef NDEBUG
1854 CmdArgs.push_back("-disable-llvm-verifier");
1855#endif
1856
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001857 // Set the main file name, so that debug info works even with
1858 // -save-temps.
1859 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001860 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001861
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001862 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001863 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001864 if (Args.hasArg(options::OPT_static))
1865 CmdArgs.push_back("-static-define");
1866
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001867 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001868 // Enable region store model by default.
1869 CmdArgs.push_back("-analyzer-store=region");
1870
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001871 // Treat blocks as analysis entry points.
1872 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1873
Ted Kremenek49c79792011-03-24 00:28:47 +00001874 CmdArgs.push_back("-analyzer-eagerly-assume");
1875
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001876 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001877 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001878 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001879
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001880 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1881 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001882
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001883 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001884 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001885
1886 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001887
1888 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001889 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1890 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1891 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1892 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1893 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1894 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001895 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001896
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001897 // Set the output format. The default is plist, for (lame) historical
1898 // reasons.
1899 CmdArgs.push_back("-analyzer-output");
1900 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001901 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001902 else
1903 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001904
Ted Kremenekfe449a22010-03-22 22:32:05 +00001905 // Disable the presentation of standard compiler warnings when
1906 // using --analyze. We only want to show static analyzer diagnostics
1907 // or frontend errors.
1908 CmdArgs.push_back("-w");
1909
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001910 // Add -Xanalyzer arguments when running as analyzer.
1911 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001912 }
1913
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001914 CheckCodeGenerationOptions(D, Args);
1915
Chandler Carruth76a943b2012-11-19 03:52:03 +00001916 // For the PIC and PIE flag options, this logic is different from the legacy
1917 // logic in very old versions of GCC, as that logic was just a bug no one had
1918 // ever fixed. This logic is both more rational and consistent with GCC's new
1919 // logic now that the bugs are fixed. The last argument relating to either
1920 // PIC or PIE wins, and no other argument is used. If the last argument is
1921 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1922 // PIE option implicitly enables PIC at the same level.
1923 bool PIE = false;
1924 bool PIC = getToolChain().isPICDefault();
1925 bool IsPICLevelTwo = PIC;
1926 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1927 options::OPT_fpic, options::OPT_fno_pic,
1928 options::OPT_fPIE, options::OPT_fno_PIE,
1929 options::OPT_fpie, options::OPT_fno_pie)) {
1930 Option O = A->getOption();
1931 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1932 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1933 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1934 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1935 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1936 O.matches(options::OPT_fPIC);
1937 } else {
1938 PIE = PIC = false;
1939 }
Benjamin Kramer76db2902012-11-13 15:32:35 +00001940 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001941 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1942 // is forced, then neither PIC nor PIE flags will have no effect.
1943 if (getToolChain().isPICDefaultForced()) {
1944 PIE = false;
1945 PIC = getToolChain().isPICDefault();
1946 IsPICLevelTwo = PIC;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001947 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001948
1949 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1950 // specified while enabling PIC enabled level 1 PIC, just force it back to
1951 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1952 // informal testing).
1953 if (PIC && getToolChain().getTriple().isOSDarwin())
1954 IsPICLevelTwo |= getToolChain().isPICDefault();
1955
Chandler Carruthc0c04552012-04-08 16:40:35 +00001956 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1957 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001958 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00001959 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001960 (Triple.getOS() != llvm::Triple::IOS ||
1961 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001962 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001963 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001964 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001965
Chandler Carruth76a943b2012-11-19 03:52:03 +00001966 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1967 // This is a very special mode. It trumps the other modes, almost no one
1968 // uses it, and it isn't even valid on any OS but Darwin.
1969 if (!getToolChain().getTriple().isOSDarwin())
1970 D.Diag(diag::err_drv_unsupported_opt_for_target)
1971 << A->getSpelling() << getToolChain().getTriple().str();
1972
1973 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
1974
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001975 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00001976 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001977
Chandler Carruth76a943b2012-11-19 03:52:03 +00001978 // Only a forced PIC mode can cause the actual compile to have PIC defines
1979 // etc., no flags are sufficient. This behavior was selected to closely
1980 // match that of llvm-gcc and Apple GCC before that.
1981 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
1982 CmdArgs.push_back("-pic-level");
1983 CmdArgs.push_back("2");
1984 }
1985 } else {
1986 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
1987 // handled in Clang's IRGen by the -pie-level flag.
1988 CmdArgs.push_back("-mrelocation-model");
1989 CmdArgs.push_back(PIC ? "pic" : "static");
1990
1991 if (PIC) {
1992 CmdArgs.push_back("-pic-level");
1993 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1994 if (PIE) {
1995 CmdArgs.push_back("-pie-level");
1996 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1997 }
1998 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001999 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002000
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002001 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2002 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002003 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002004
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002005 // LLVM Code Generator Options.
2006
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002007 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2008 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002009 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002010 }
2011
Roman Divacky65b88cd2011-03-01 17:40:53 +00002012 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2013 CmdArgs.push_back("-mrtd");
2014
Rafael Espindola224dd632011-12-14 21:02:23 +00002015 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002016 CmdArgs.push_back("-mdisable-fp-elim");
2017 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2018 options::OPT_fno_zero_initialized_in_bss))
2019 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002020 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
2021 options::OPT_fno_strict_aliasing,
2022 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002023 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002024 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2025 false))
2026 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002027 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2028 options::OPT_fno_optimize_sibling_calls))
2029 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002030
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002031 // Handle various floating point optimization flags, mapping them to the
2032 // appropriate LLVM code generation flags. The pattern for all of these is to
2033 // default off the codegen optimizations, and if any flag enables them and no
2034 // flag disables them after the flag enabling them, enable the codegen
2035 // optimization. This is complicated by several "umbrella" flags.
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_ffinite_math_only,
2039 options::OPT_fno_finite_math_only,
2040 options::OPT_fhonor_infinities,
2041 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002042 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2043 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002044 A->getOption().getID() != options::OPT_fhonor_infinities)
2045 CmdArgs.push_back("-menable-no-infs");
2046 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002047 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002048 options::OPT_ffinite_math_only,
2049 options::OPT_fno_finite_math_only,
2050 options::OPT_fhonor_nans,
2051 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002052 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2053 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002054 A->getOption().getID() != options::OPT_fhonor_nans)
2055 CmdArgs.push_back("-menable-no-nans");
2056
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002057 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2058 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002059 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002060 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002061 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00002062 options::OPT_fno_math_errno))
2063 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2064 if (MathErrno)
2065 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002066
2067 // There are several flags which require disabling very specific
2068 // optimizations. Any of these being disabled forces us to turn off the
2069 // entire set of LLVM optimizations, so collect them through all the flag
2070 // madness.
2071 bool AssociativeMath = false;
2072 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002073 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002074 options::OPT_funsafe_math_optimizations,
2075 options::OPT_fno_unsafe_math_optimizations,
2076 options::OPT_fassociative_math,
2077 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002078 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2079 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002080 A->getOption().getID() != options::OPT_fno_associative_math)
2081 AssociativeMath = true;
2082 bool ReciprocalMath = false;
2083 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002084 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002085 options::OPT_funsafe_math_optimizations,
2086 options::OPT_fno_unsafe_math_optimizations,
2087 options::OPT_freciprocal_math,
2088 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002089 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2090 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002091 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2092 ReciprocalMath = true;
2093 bool SignedZeros = true;
2094 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002095 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002096 options::OPT_funsafe_math_optimizations,
2097 options::OPT_fno_unsafe_math_optimizations,
2098 options::OPT_fsigned_zeros,
2099 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002100 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2101 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002102 A->getOption().getID() != options::OPT_fsigned_zeros)
2103 SignedZeros = false;
2104 bool TrappingMath = true;
2105 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002106 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002107 options::OPT_funsafe_math_optimizations,
2108 options::OPT_fno_unsafe_math_optimizations,
2109 options::OPT_ftrapping_math,
2110 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002111 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2112 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002113 A->getOption().getID() != options::OPT_ftrapping_math)
2114 TrappingMath = false;
2115 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2116 !TrappingMath)
2117 CmdArgs.push_back("-menable-unsafe-fp-math");
2118
Lang Hamesaa53b932012-07-06 00:59:19 +00002119
2120 // Validate and pass through -fp-contract option.
2121 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002122 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002123 options::OPT_ffp_contract)) {
2124 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002125 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002126 if (Val == "fast" || Val == "on" || Val == "off") {
2127 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2128 } else {
2129 D.Diag(diag::err_drv_unsupported_option_argument)
2130 << A->getOption().getName() << Val;
2131 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002132 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002133 // If fast-math is set then set the fp-contract mode to fast.
2134 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2135 }
2136 }
2137
Bob Wilson6a039162012-07-19 03:52:53 +00002138 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2139 // and if we find them, tell the frontend to provide the appropriate
2140 // preprocessor macros. This is distinct from enabling any optimizations as
2141 // these options induce language changes which must survive serialization
2142 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002143 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2144 if (A->getOption().matches(options::OPT_ffast_math))
2145 CmdArgs.push_back("-ffast-math");
2146 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2147 if (A->getOption().matches(options::OPT_ffinite_math_only))
2148 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002149
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002150 // Decide whether to use verbose asm. Verbose assembly is the default on
2151 // toolchains which have the integrated assembler on by default.
2152 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2153 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002154 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002155 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002156 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002157
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002158 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2159 CmdArgs.push_back("-mdebug-pass");
2160 CmdArgs.push_back("Structure");
2161 }
2162 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2163 CmdArgs.push_back("-mdebug-pass");
2164 CmdArgs.push_back("Arguments");
2165 }
2166
John McCall8517abc2010-02-19 02:45:38 +00002167 // Enable -mconstructor-aliases except on darwin, where we have to
2168 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002169 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002170 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002171
John McCall7ef5cb32011-03-18 02:56:14 +00002172 // Darwin's kernel doesn't support guard variables; just die if we
2173 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002174 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002175 CmdArgs.push_back("-fforbid-guard-variables");
2176
Douglas Gregordbe39272011-02-01 15:15:22 +00002177 if (Args.hasArg(options::OPT_mms_bitfields)) {
2178 CmdArgs.push_back("-mms-bitfields");
2179 }
John McCall8517abc2010-02-19 02:45:38 +00002180
Daniel Dunbar306945d2009-09-16 06:17:29 +00002181 // This is a coarse approximation of what llvm-gcc actually does, both
2182 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2183 // complicated ways.
2184 bool AsynchronousUnwindTables =
2185 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2186 options::OPT_fno_asynchronous_unwind_tables,
2187 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002188 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002189 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2190 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002191 CmdArgs.push_back("-munwind-tables");
2192
Chandler Carruth05fb5852012-11-21 23:40:23 +00002193 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002194
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002195 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2196 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002197 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002198 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002199
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002200 // FIXME: Handle -mtune=.
2201 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002202
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002203 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002204 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002205 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002206 }
2207
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002208 // Add target specific cpu and features flags.
2209 switch(getToolChain().getTriple().getArch()) {
2210 default:
2211 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002212
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002213 case llvm::Triple::arm:
2214 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002215 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002216 break;
2217
Eric Christopher0b26a612010-03-02 02:41:08 +00002218 case llvm::Triple::mips:
2219 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002220 case llvm::Triple::mips64:
2221 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002222 AddMIPSTargetArgs(Args, CmdArgs);
2223 break;
2224
Hal Finkel8eb59282012-06-11 22:35:19 +00002225 case llvm::Triple::ppc:
2226 case llvm::Triple::ppc64:
2227 AddPPCTargetArgs(Args, CmdArgs);
2228 break;
2229
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002230 case llvm::Triple::sparc:
2231 AddSparcTargetArgs(Args, CmdArgs);
2232 break;
2233
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002234 case llvm::Triple::x86:
2235 case llvm::Triple::x86_64:
2236 AddX86TargetArgs(Args, CmdArgs);
2237 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002238
2239 case llvm::Triple::hexagon:
2240 AddHexagonTargetArgs(Args, CmdArgs);
2241 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002242 }
2243
Tony Linthicum76329bf2011-12-12 21:14:55 +00002244
2245
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002246 // Pass the linker version in use.
2247 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2248 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002249 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002250 }
2251
Nick Lewycky75033772011-02-02 06:43:03 +00002252 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002253 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002254 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002255 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002256 CmdArgs.push_back("-momit-leaf-frame-pointer");
2257
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002258 // Explicitly error on some things we know we don't support and can't just
2259 // ignore.
2260 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002261 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2262 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002263 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002264 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002265 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002266 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2267 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002268 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002269 << Unsupported->getOption().getName();
2270 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002271 }
2272
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002273 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002274 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002275 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002276 CmdArgs.push_back("-header-include-file");
2277 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2278 D.CCPrintHeadersFilename : "-");
2279 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002280 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002281 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002282
Chad Rosierbe10f982011-08-02 17:58:04 +00002283 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002284 CmdArgs.push_back("-diagnostic-log-file");
2285 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2286 D.CCLogDiagnosticsFilename : "-");
2287 }
2288
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002289 // Use the last option from "-g" group. "-gline-tables-only"
2290 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002291 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002292 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002293 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002294 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002295 else if (!A->getOption().matches(options::OPT_g0) &&
2296 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002297 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002298 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002299
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002300 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2301 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002302 if (Args.hasArg(options::OPT_gcolumn_info))
2303 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002304
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002305 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2306 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002307 // FIXME: Currently only works on Linux.
2308 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2309 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002310 CmdArgs.push_back("-g");
2311 CmdArgs.push_back("-backend-option");
2312 CmdArgs.push_back("-split-dwarf=Enable");
2313 }
2314
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002315 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2316 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2317
Chris Lattner3c77a352010-06-22 00:03:40 +00002318 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2319
Nick Lewycky207bce32011-04-21 23:44:07 +00002320 if (Args.hasArg(options::OPT_ftest_coverage) ||
2321 Args.hasArg(options::OPT_coverage))
2322 CmdArgs.push_back("-femit-coverage-notes");
2323 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2324 Args.hasArg(options::OPT_coverage))
2325 CmdArgs.push_back("-femit-coverage-data");
2326
Nick Lewycky480cb992011-05-04 20:46:58 +00002327 if (C.getArgs().hasArg(options::OPT_c) ||
2328 C.getArgs().hasArg(options::OPT_S)) {
2329 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002330 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002331 SmallString<128> CoverageFilename(Output.getFilename());
2332 if (!C.getArgs().hasArg(options::OPT_no_canonical_prefixes))
2333 llvm::sys::fs::make_absolute(CoverageFilename);
2334 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002335 }
2336 }
2337
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002338 // Pass options for controlling the default header search paths.
2339 if (Args.hasArg(options::OPT_nostdinc)) {
2340 CmdArgs.push_back("-nostdsysteminc");
2341 CmdArgs.push_back("-nobuiltininc");
2342 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002343 if (Args.hasArg(options::OPT_nostdlibinc))
2344 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002345 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2346 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2347 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002348
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002349 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002350 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002351 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002352
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002353 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2354
Ted Kremenekf7639e12012-03-06 20:06:33 +00002355 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002356 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002357 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002358 options::OPT_ccc_arcmt_modify,
2359 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002360 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002361 switch (A->getOption().getID()) {
2362 default:
2363 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002364 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002365 CmdArgs.push_back("-arcmt-check");
2366 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002367 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002368 CmdArgs.push_back("-arcmt-modify");
2369 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002370 case options::OPT_ccc_arcmt_migrate:
2371 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002372 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002373 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002374
2375 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2376 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002377 break;
John McCalld70fb982011-06-15 23:25:17 +00002378 }
2379 }
2380 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002381
Ted Kremenekf7639e12012-03-06 20:06:33 +00002382 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2383 if (ARCMTEnabled) {
2384 D.Diag(diag::err_drv_argument_not_allowed_with)
2385 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2386 }
2387 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002388 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002389
2390 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2391 options::OPT_objcmt_migrate_subscripting)) {
2392 // None specified, means enable them all.
2393 CmdArgs.push_back("-objcmt-migrate-literals");
2394 CmdArgs.push_back("-objcmt-migrate-subscripting");
2395 } else {
2396 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2397 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2398 }
2399 }
2400
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002401 // Add preprocessing options like -I, -D, etc. if we are using the
2402 // preprocessor.
2403 //
2404 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002405 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002406 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002407
Rafael Espindolaa7431922011-07-21 23:40:37 +00002408 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2409 // that "The compiler can only warn and ignore the option if not recognized".
2410 // When building with ccache, it will pass -D options to clang even on
2411 // preprocessed inputs and configure concludes that -fPIC is not supported.
2412 Args.ClaimAllArgs(options::OPT_D);
2413
Daniel Dunbar58f78332009-09-17 06:53:36 +00002414 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002415 // others.
2416 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002417 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002418 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002419 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002420 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002421 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002422 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002423 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002424 }
2425
Chad Rosier86b82082012-12-12 20:06:31 +00002426 // Don't warn about unused -flto. This can happen when we're preprocessing or
2427 // precompiling.
2428 Args.ClaimAllArgs(options::OPT_flto);
2429
Daniel Dunbar945577c2009-10-29 02:24:45 +00002430 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002431 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2432 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002433 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002434 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002435
2436 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2437 // (-ansi is equivalent to -std=c89).
2438 //
2439 // If a std is supplied, only add -trigraphs if it follows the
2440 // option.
2441 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2442 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002443 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002444 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002445 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002446 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002447 else
2448 Std->render(Args, CmdArgs);
2449
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002450 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2451 options::OPT_trigraphs))
2452 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002453 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002454 } else {
2455 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002456 //
2457 // FIXME: Clang doesn't correctly handle -std= when the input language
2458 // doesn't match. For the time being just ignore this for C++ inputs;
2459 // eventually we want to do all the standard defaulting here instead of
2460 // splitting it between the driver and clang -cc1.
2461 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002462 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2463 "-std=", /*Joined=*/true);
2464 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2465 CmdArgs.push_back("-std=c++11");
2466
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002467 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002468 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002469
Chandler Carruthb009b142011-04-23 06:30:43 +00002470 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2471 // '-fconst-strings'; this better indicates its actual behavior.
2472 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2473 false)) {
2474 // For perfect compatibility with GCC, we do this even in the presence of
2475 // '-w'. This flag names something other than a warning for GCC.
2476 CmdArgs.push_back("-fconst-strings");
2477 }
2478
Chandler Carruth61fbf622011-04-23 09:27:53 +00002479 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002480 // during C++ compilation, which it is by default. GCC keeps this define even
2481 // in the presence of '-w', match this behavior bug-for-bug.
2482 if (types::isCXX(InputType) &&
2483 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2484 true)) {
2485 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002486 }
2487
Chandler Carruthe0391482010-05-22 02:21:53 +00002488 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2489 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2490 if (Asm->getOption().matches(options::OPT_fasm))
2491 CmdArgs.push_back("-fgnu-keywords");
2492 else
2493 CmdArgs.push_back("-fno-gnu-keywords");
2494 }
2495
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002496 if (ShouldDisableCFI(Args, getToolChain()))
2497 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002498
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002499 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2500 CmdArgs.push_back("-fno-dwarf-directory-asm");
2501
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002502 // Add in -fdebug-compilation-dir if necessary.
2503 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002504
Richard Smith9a568822011-11-21 19:36:32 +00002505 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2506 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002507 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002508 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002509 }
2510
Richard Smith9a568822011-11-21 19:36:32 +00002511 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2512 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002513 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002514 }
2515
Richard Smithb3a14522013-02-22 01:59:51 +00002516 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2517 CmdArgs.push_back("-fbracket-depth");
2518 CmdArgs.push_back(A->getValue());
2519 }
2520
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002521 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2522 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002523 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002524 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002525 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2526 } else
2527 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002528 }
2529
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002530
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002531 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002532 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002533
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002534 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2535 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002536 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002537 }
David Chisnall5778fce2009-08-31 16:41:57 +00002538
Chris Lattnere23003d2010-01-09 21:54:33 +00002539 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2540 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002541 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002542 }
2543
Chris Lattnerb35583d2010-04-07 20:49:23 +00002544 CmdArgs.push_back("-ferror-limit");
2545 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002546 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002547 else
2548 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002549
Chandler Carrutha77a7272010-05-06 04:55:18 +00002550 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2551 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002552 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002553 }
2554
2555 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2556 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002557 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002558 }
2559
Richard Smithf6f003a2011-12-16 19:06:07 +00002560 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2561 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002562 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002563 }
2564
Daniel Dunbar2c978472009-11-04 06:24:47 +00002565 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002566 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002567 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002568 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002569 } else {
2570 // If -fmessage-length=N was not specified, determine whether this is a
2571 // terminal and, if so, implicitly define -fmessage-length appropriately.
2572 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002573 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002574 }
2575
John McCallb4a99d32013-02-19 01:57:35 +00002576 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2577 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2578 options::OPT_fvisibility_ms_compat)) {
2579 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2580 CmdArgs.push_back("-fvisibility");
2581 CmdArgs.push_back(A->getValue());
2582 } else {
2583 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2584 CmdArgs.push_back("-fvisibility");
2585 CmdArgs.push_back("hidden");
2586 CmdArgs.push_back("-ftype-visibility");
2587 CmdArgs.push_back("default");
2588 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002589 }
2590
Douglas Gregor08329632010-06-15 17:05:35 +00002591 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002592
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002593 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2594
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002595 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002596 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2597 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002598 CmdArgs.push_back("-ffreestanding");
2599
Daniel Dunbare357d562009-12-03 18:42:11 +00002600 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002601 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002602 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002603 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002604 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002605 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002606 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002607 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2608 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002609
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002610 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002611 Sanitize.addArgs(Args, CmdArgs);
2612
Will Dietz3676d562012-12-30 20:53:28 +00002613 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2614 options::OPT_fno_sanitize_recover,
2615 true))
2616 CmdArgs.push_back("-fno-sanitize-recover");
2617
Chad Rosierae229d52013-01-29 23:31:22 +00002618 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2619 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2620 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2621 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2622
Eric Christopher459d2712013-02-19 06:16:53 +00002623 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002624 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2625 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2626 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2627 D.Diag(diag::err_drv_argument_only_allowed_with)
2628 << A->getAsString(Args) << "ppc/ppc64";
2629
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002630 if (getToolChain().SupportsProfiling())
2631 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002632
2633 // -flax-vector-conversions is default.
2634 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2635 options::OPT_fno_lax_vector_conversions))
2636 CmdArgs.push_back("-fno-lax-vector-conversions");
2637
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002638 if (Args.getLastArg(options::OPT_fapple_kext))
2639 CmdArgs.push_back("-fapple-kext");
2640
David Blaikie690f21e2012-06-14 18:55:27 +00002641 if (Args.hasFlag(options::OPT_frewrite_includes,
2642 options::OPT_fno_rewrite_includes, false))
2643 CmdArgs.push_back("-frewrite-includes");
2644
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002645 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002646 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002647 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002648 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2649 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002650
2651 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2652 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002653 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002654 }
2655
Bob Wilson14adb362012-02-03 06:27:22 +00002656 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002657
Chandler Carruth6e501032011-03-27 00:04:55 +00002658 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2659 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2660 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2661 options::OPT_fno_wrapv)) {
2662 if (A->getOption().matches(options::OPT_fwrapv))
2663 CmdArgs.push_back("-fwrapv");
2664 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2665 options::OPT_fno_strict_overflow)) {
2666 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2667 CmdArgs.push_back("-fwrapv");
2668 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002669 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002670 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002671
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002672 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2673
Mahesha S6a682be42012-10-27 07:47:56 +00002674
Daniel Dunbar4930e332009-11-17 08:07:36 +00002675 // -stack-protector=0 is default.
2676 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002677 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2678 options::OPT_fstack_protector_all,
2679 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002680 if (A->getOption().matches(options::OPT_fstack_protector))
2681 StackProtectorLevel = 1;
2682 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2683 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002684 } else {
2685 StackProtectorLevel =
2686 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2687 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002688 if (StackProtectorLevel) {
2689 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002690 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002691 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002692
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002693 // --param ssp-buffer-size=
2694 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2695 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002696 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002697 if (Str.startswith("ssp-buffer-size=")) {
2698 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002699 CmdArgs.push_back("-stack-protector-buffer-size");
2700 // FIXME: Verify the argument is a valid integer.
2701 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002702 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002703 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002704 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002705 }
2706
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002707 // Translate -mstackrealign
2708 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2709 false)) {
2710 CmdArgs.push_back("-backend-option");
2711 CmdArgs.push_back("-force-align-stack");
2712 }
2713 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2714 false)) {
2715 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2716 }
2717
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002718 if (Args.hasArg(options::OPT_mstack_alignment)) {
2719 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2720 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002721 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002722 // -mkernel implies -mstrict-align; don't add the redundant option.
2723 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002724 CmdArgs.push_back("-backend-option");
2725 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002726 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002727
Daniel Dunbard18049a2009-04-07 21:16:11 +00002728 // Forward -f options with positive and negative forms; we translate
2729 // these by hand.
2730
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002731 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002732 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002733 CmdArgs.push_back("-fapple-kext");
2734 if (!Args.hasArg(options::OPT_fbuiltin))
2735 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002736 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002737 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002738 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002739 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002740 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002741
Nuno Lopes13c88c72009-12-16 16:59:22 +00002742 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2743 options::OPT_fno_assume_sane_operator_new))
2744 CmdArgs.push_back("-fno-assume-sane-operator-new");
2745
Daniel Dunbar4930e332009-11-17 08:07:36 +00002746 // -fblocks=0 is default.
2747 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002748 getToolChain().IsBlocksDefault()) ||
2749 (Args.hasArg(options::OPT_fgnu_runtime) &&
2750 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2751 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002752 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002753
2754 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2755 !getToolChain().hasBlocksRuntime())
2756 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002757 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002758
Douglas Gregor226173a2012-01-18 15:19:58 +00002759 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2760 // users must also pass -fcxx-modules. The latter flag will disappear once the
2761 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002762 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002763 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2764 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2765 options::OPT_fno_cxx_modules,
2766 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002767 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002768 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002769 HaveModules = true;
2770 }
2771 }
2772
Douglas Gregor35b04d62013-02-07 19:01:24 +00002773 // If a module path was provided, pass it along. Otherwise, use a temporary
2774 // directory.
2775 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2776 A->claim();
2777 if (HaveModules) {
2778 A->render(Args, CmdArgs);
2779 }
2780 } else if (HaveModules) {
2781 SmallString<128> DefaultModuleCache;
2782 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2783 DefaultModuleCache);
2784 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00002785 const char Arg[] = "-fmodules-cache-path=";
2786 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2787 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00002788 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2789 }
2790
2791 // Pass through all -fmodules-ignore-macro arguments.
2792 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
2793
Douglas Gregorc60437f2013-01-16 01:23:41 +00002794 // -fmodules-autolink (on by default when modules is enabled) automatically
2795 // links against libraries for imported modules.
2796 if (HaveModules &&
2797 Args.hasFlag(options::OPT_fmodules_autolink,
2798 options::OPT_fno_modules_autolink,
2799 true)) {
2800 CmdArgs.push_back("-fmodules-autolink");
Douglas Gregor226173a2012-01-18 15:19:58 +00002801 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002802
John McCalldfea9982010-04-09 19:12:06 +00002803 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002804 if (Args.hasFlag(options::OPT_fno_access_control,
2805 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002806 false))
John McCall3155f572010-04-09 19:03:51 +00002807 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002808
Anders Carlssond470fef2010-11-21 00:09:52 +00002809 // -felide-constructors is the default.
2810 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2811 options::OPT_felide_constructors,
2812 false))
2813 CmdArgs.push_back("-fno-elide-constructors");
2814
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002815 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002816 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002817 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002818 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002819
Richard Smith52be6192012-11-05 22:04:41 +00002820 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002821 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002822 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002823 Args.getLastArg(options::OPT_mkernel,
2824 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002825 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002826 D.Diag(diag::err_drv_argument_not_allowed_with)
2827 << "-fsanitize=vptr" << NoRttiArg;
2828 }
2829 }
2830
Tony Linthicum76329bf2011-12-12 21:14:55 +00002831 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002832 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002833 options::OPT_fno_short_enums,
2834 getToolChain().getTriple().getArch() ==
2835 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002836 CmdArgs.push_back("-fshort-enums");
2837
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002838 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002839 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002840 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002841 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002842
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002843 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002844 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002845 options::OPT_fno_threadsafe_statics))
2846 CmdArgs.push_back("-fno-threadsafe-statics");
2847
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002848 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002849 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2850 options::OPT_fno_use_cxa_atexit,
2851 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002852 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002853 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2854 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002855 CmdArgs.push_back("-fno-use-cxa-atexit");
2856
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002857 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002858 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002859 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2860 CmdArgs.push_back("-fms-extensions");
2861
Francois Pichet1b4f1632011-09-17 04:32:15 +00002862 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002863 if (Args.hasFlag(options::OPT_fms_compatibility,
2864 options::OPT_fno_ms_compatibility,
2865 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2866 Args.hasFlag(options::OPT_fms_extensions,
2867 options::OPT_fno_ms_extensions,
2868 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002869 CmdArgs.push_back("-fms-compatibility");
2870
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002871 // -fmsc-version=1300 is default.
2872 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2873 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2874 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002875 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002876 if (msc_ver.empty())
2877 CmdArgs.push_back("-fmsc-version=1300");
2878 else
2879 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2880 }
2881
2882
Eric Christopher5ecce122013-02-18 00:38:31 +00002883 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002884 if (Args.hasFlag(options::OPT_fborland_extensions,
2885 options::OPT_fno_borland_extensions, false))
2886 CmdArgs.push_back("-fborland-extensions");
2887
Francois Pichet02744872011-09-01 16:38:08 +00002888 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2889 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002890 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2891 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002892 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002893 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002894
Chandler Carruthe03aa552010-04-17 20:17:31 +00002895 // -fgnu-keywords default varies depending on language; only pass if
2896 // specified.
2897 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002898 options::OPT_fno_gnu_keywords))
2899 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002900
Rafael Espindola922a6242011-06-02 17:30:53 +00002901 if (Args.hasFlag(options::OPT_fgnu89_inline,
2902 options::OPT_fno_gnu89_inline,
2903 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002904 CmdArgs.push_back("-fgnu89-inline");
2905
Chad Rosier9c76d242012-03-15 22:31:42 +00002906 if (Args.hasArg(options::OPT_fno_inline))
2907 CmdArgs.push_back("-fno-inline");
2908
Chad Rosier64d6be92012-03-06 21:17:19 +00002909 if (Args.hasArg(options::OPT_fno_inline_functions))
2910 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002911
John McCall5fb5df92012-06-20 06:18:46 +00002912 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002913
John McCall5fb5df92012-06-20 06:18:46 +00002914 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2915 // legacy is the default.
2916 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002917 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2918 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002919 objcRuntime.isLegacyDispatchDefaultForArch(
2920 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002921 if (getToolChain().UseObjCMixedDispatch())
2922 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2923 else
2924 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2925 }
2926 }
2927
Nico Weber97bd94b2012-03-09 21:19:44 +00002928 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2929 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002930 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002931 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2932 }
2933
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002934 // -fencode-extended-block-signature=1 is default.
2935 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2936 CmdArgs.push_back("-fencode-extended-block-signature");
2937 }
2938
John McCall24fc0de2011-07-06 00:26:06 +00002939 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2940 // NOTE: This logic is duplicated in ToolChains.cpp.
2941 bool ARC = isObjCAutoRefCount(Args);
2942 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002943 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002944
John McCall24fc0de2011-07-06 00:26:06 +00002945 CmdArgs.push_back("-fobjc-arc");
2946
Chandler Carruth491db322011-11-04 07:34:47 +00002947 // FIXME: It seems like this entire block, and several around it should be
2948 // wrapped in isObjC, but for now we just use it here as this is where it
2949 // was being used previously.
2950 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2951 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2952 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2953 else
2954 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2955 }
2956
John McCall24fc0de2011-07-06 00:26:06 +00002957 // Allow the user to enable full exceptions code emission.
2958 // We define off for Objective-CC, on for Objective-C++.
2959 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2960 options::OPT_fno_objc_arc_exceptions,
2961 /*default*/ types::isCXX(InputType)))
2962 CmdArgs.push_back("-fobjc-arc-exceptions");
2963 }
2964
2965 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2966 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002967 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002968 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002969
John McCall24fc0de2011-07-06 00:26:06 +00002970 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2971 // takes precedence.
2972 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2973 if (!GCArg)
2974 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2975 if (GCArg) {
2976 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002977 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002978 << GCArg->getAsString(Args);
2979 } else if (getToolChain().SupportsObjCGC()) {
2980 GCArg->render(Args, CmdArgs);
2981 } else {
2982 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002983 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002984 << GCArg->getAsString(Args);
2985 }
2986 }
2987
John McCallb5f652e2011-06-22 00:53:57 +00002988 // Add exception args.
2989 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002990 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002991
2992 if (getToolChain().UseSjLjExceptions())
2993 CmdArgs.push_back("-fsjlj-exceptions");
2994
2995 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002996 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2997 options::OPT_fno_assume_sane_operator_new))
2998 CmdArgs.push_back("-fno-assume-sane-operator-new");
2999
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003000 // -fconstant-cfstrings is default, and may be subject to argument translation
3001 // on Darwin.
3002 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3003 options::OPT_fno_constant_cfstrings) ||
3004 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3005 options::OPT_mno_constant_cfstrings))
3006 CmdArgs.push_back("-fno-constant-cfstrings");
3007
John Thompsoned4e2952009-11-05 20:14:16 +00003008 // -fshort-wchar default varies depending on platform; only
3009 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003010 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3011 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003012
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003013 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3014 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003015 //
3016 // FIXME: This is gross; that translation should be pulled from the
3017 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003018 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003019 options::OPT_fno_pascal_strings,
3020 false) ||
3021 Args.hasFlag(options::OPT_mpascal_strings,
3022 options::OPT_mno_pascal_strings,
3023 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003024 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003025
Daniel Dunbar096ed292011-10-05 21:04:55 +00003026 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3027 // -fno-pack-struct doesn't apply to -fpack-struct=.
3028 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003029 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003030 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003031 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003032 } else if (Args.hasFlag(options::OPT_fpack_struct,
3033 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003034 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003035 }
3036
Eric Christopher8d56caa2013-02-18 01:16:37 +00003037 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003038 if (!Args.hasArg(options::OPT_fcommon))
3039 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003040 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003041 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003042
Daniel Dunbard18049a2009-04-07 21:16:11 +00003043 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003044 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003045 CmdArgs.push_back("-fno-common");
3046
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003047 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003048 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003049 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003050 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003051 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003052 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3053
Daniel Dunbar6358d682010-10-15 22:30:42 +00003054 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3055 if (!Args.hasFlag(options::OPT_ffor_scope,
3056 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003057 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003058 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3059
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003060 // -fcaret-diagnostics is default.
3061 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3062 options::OPT_fno_caret_diagnostics, true))
3063 CmdArgs.push_back("-fno-caret-diagnostics");
3064
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003065 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003066 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003067 options::OPT_fno_diagnostics_fixit_info))
3068 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003069
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003070 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003071 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003072 options::OPT_fno_diagnostics_show_option))
3073 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003074
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003075 if (const Arg *A =
3076 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3077 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003078 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003079 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003080
Douglas Gregor643c9222011-05-21 17:07:29 +00003081 if (const Arg *A =
3082 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3083 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003084 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003085 }
3086
Chandler Carruthb6766f02011-03-27 01:50:55 +00003087 if (Arg *A = Args.getLastArg(
3088 options::OPT_fdiagnostics_show_note_include_stack,
3089 options::OPT_fno_diagnostics_show_note_include_stack)) {
3090 if (A->getOption().matches(
3091 options::OPT_fdiagnostics_show_note_include_stack))
3092 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3093 else
3094 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3095 }
3096
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003097 // Color diagnostics are the default, unless the terminal doesn't support
3098 // them.
3099 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00003100 options::OPT_fno_color_diagnostics,
3101 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003102 CmdArgs.push_back("-fcolor-diagnostics");
3103
Daniel Dunbardb097022009-06-08 21:13:54 +00003104 if (!Args.hasFlag(options::OPT_fshow_source_location,
3105 options::OPT_fno_show_source_location))
3106 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003107
Douglas Gregor643c9222011-05-21 17:07:29 +00003108 if (!Args.hasFlag(options::OPT_fshow_column,
3109 options::OPT_fno_show_column,
3110 true))
3111 CmdArgs.push_back("-fno-show-column");
3112
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003113 if (!Args.hasFlag(options::OPT_fspell_checking,
3114 options::OPT_fno_spell_checking))
3115 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003116
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003117
Chad Rosierc8e56e82012-12-05 21:08:21 +00003118 // -fno-asm-blocks is default.
3119 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3120 false))
3121 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003122
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003123 // -fvectorize is default.
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003124 if (Args.hasFlag(options::OPT_fvectorize,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003125 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003126 CmdArgs.push_back("-backend-option");
3127 CmdArgs.push_back("-vectorize-loops");
3128 }
3129
Hal Finkel061f1652012-12-11 19:59:32 +00003130 // -fno-slp-vectorize is default.
3131 if (Args.hasFlag(options::OPT_fslp_vectorize,
3132 options::OPT_fno_slp_vectorize, false)) {
3133 CmdArgs.push_back("-backend-option");
3134 CmdArgs.push_back("-vectorize");
3135 }
3136
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003137 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3138 A->render(Args, CmdArgs);
3139
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003140 // -fdollars-in-identifiers default varies depending on platform and
3141 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003142 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003143 options::OPT_fno_dollars_in_identifiers)) {
3144 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003145 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003146 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003147 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003148 }
3149
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003150 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3151 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003152 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003153 options::OPT_fno_unit_at_a_time)) {
3154 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003155 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003156 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003157
Eli Friedman055c9702011-11-02 01:53:16 +00003158 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3159 options::OPT_fno_apple_pragma_pack, false))
3160 CmdArgs.push_back("-fapple-pragma-pack");
3161
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003162 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003163 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003164 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003165#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003166 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003167 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3168 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3169 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3170 CmdArgs.push_back("-fno-builtin-strcat");
3171 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3172 CmdArgs.push_back("-fno-builtin-strcpy");
3173 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003174#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003175
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003176 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003177 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003178 options::OPT_traditional_cpp)) {
3179 if (isa<PreprocessJobAction>(JA))
3180 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003181 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003182 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003183 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003184
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003185 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003186 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003187
3188 // Handle serialized diagnostics.
3189 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3190 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003191 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003192 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003193
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003194 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3195 CmdArgs.push_back("-fretain-comments-from-system-headers");
3196
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003197 // Forward -fcomment-block-commands to -cc1.
3198 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
3199
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003200 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3201 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003202 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003203 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3204 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003205 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003206
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003207 // We translate this by hand to the -cc1 argument, since nightly test uses
3208 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003209 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003210 CmdArgs.push_back("-disable-llvm-optzns");
3211 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003212 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003213 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003214
Daniel Dunbard67a3222009-03-30 06:36:42 +00003215 if (Output.getType() == types::TY_Dependencies) {
3216 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003217 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003218 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003219 CmdArgs.push_back(Output.getFilename());
3220 } else {
3221 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003222 }
3223
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003224 for (InputInfoList::const_iterator
3225 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3226 const InputInfo &II = *it;
3227 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003228 if (Args.hasArg(options::OPT_rewrite_objc))
3229 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3230 else
3231 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003232 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003233 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003235 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003236 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003237
Chris Lattnere9d7d782009-11-03 19:50:27 +00003238 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3239
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003240 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003241
3242 // Optionally embed the -cc1 level arguments into the debug info, for build
3243 // analysis.
3244 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003245 ArgStringList OriginalArgs;
3246 for (ArgList::const_iterator it = Args.begin(),
3247 ie = Args.end(); it != ie; ++it)
3248 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003249
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003250 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003251 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003252 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003253 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003254 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003255 }
3256 CmdArgs.push_back("-dwarf-debug-flags");
3257 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3258 }
3259
Eric Christopherd3804002013-02-22 20:12:52 +00003260 // Add the split debug info name to the command lines here so we
3261 // can propagate it to the backend.
3262 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3263 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003264 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003265 const char *SplitDwarfOut;
3266 if (SplitDwarf) {
3267 CmdArgs.push_back("-split-dwarf-file");
3268 SplitDwarfOut = SplitDebugName(Args, Inputs);
3269 CmdArgs.push_back(SplitDwarfOut);
3270 }
3271
3272 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003273 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003274
Eric Christopherf1545832013-02-22 23:50:16 +00003275 // Handle the debug info splitting at object creation time if we're
3276 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003277 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003278 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003279 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003280
Roman Divacky178e01602011-02-10 16:52:03 +00003281 if (Arg *A = Args.getLastArg(options::OPT_pg))
3282 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003283 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003284 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003285
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003286 // Claim some arguments which clang supports automatically.
3287
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003288 // -fpch-preprocess is used with gcc to add a special marker in the output to
3289 // include the PCH file. Clang's PTH solution is completely transparent, so we
3290 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003291 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003292
Daniel Dunbar17731772009-03-23 19:03:36 +00003293 // Claim some arguments which clang doesn't support, but we don't
3294 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003295 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3296 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003297
Rafael Espindolad95a8122011-03-01 05:25:27 +00003298 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003299 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003300 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003301}
3302
Jim Grosbach576452b2012-02-10 20:37:10 +00003303void ClangAs::AddARMTargetArgs(const ArgList &Args,
3304 ArgStringList &CmdArgs) const {
3305 const Driver &D = getToolChain().getDriver();
3306 llvm::Triple Triple = getToolChain().getTriple();
3307
3308 // Set the CPU based on -march= and -mcpu=.
3309 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003310 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003311
3312 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003313 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003314 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003315
3316 // Honor -mfpmath=.
3317 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003318 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003319}
3320
Benjamin Kramerb164d672013-02-22 20:55:17 +00003321void ClangAs::AddX86TargetArgs(const ArgList &Args,
3322 ArgStringList &CmdArgs) const {
3323 // Set the CPU based on -march=.
3324 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3325 CmdArgs.push_back("-target-cpu");
3326 CmdArgs.push_back(CPUName);
3327 }
3328}
3329
John McCall5fb5df92012-06-20 06:18:46 +00003330/// Add options related to the Objective-C runtime/ABI.
3331///
3332/// Returns true if the runtime is non-fragile.
3333ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3334 ArgStringList &cmdArgs,
3335 RewriteKind rewriteKind) const {
3336 // Look for the controlling runtime option.
3337 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3338 options::OPT_fgnu_runtime,
3339 options::OPT_fobjc_runtime_EQ);
3340
3341 // Just forward -fobjc-runtime= to the frontend. This supercedes
3342 // options about fragility.
3343 if (runtimeArg &&
3344 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3345 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003346 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003347 if (runtime.tryParse(value)) {
3348 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3349 << value;
3350 }
3351
3352 runtimeArg->render(args, cmdArgs);
3353 return runtime;
3354 }
3355
3356 // Otherwise, we'll need the ABI "version". Version numbers are
3357 // slightly confusing for historical reasons:
3358 // 1 - Traditional "fragile" ABI
3359 // 2 - Non-fragile ABI, version 1
3360 // 3 - Non-fragile ABI, version 2
3361 unsigned objcABIVersion = 1;
3362 // If -fobjc-abi-version= is present, use that to set the version.
3363 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003364 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003365 if (value == "1")
3366 objcABIVersion = 1;
3367 else if (value == "2")
3368 objcABIVersion = 2;
3369 else if (value == "3")
3370 objcABIVersion = 3;
3371 else
3372 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3373 << value;
3374 } else {
3375 // Otherwise, determine if we are using the non-fragile ABI.
3376 bool nonFragileABIIsDefault =
3377 (rewriteKind == RK_NonFragile ||
3378 (rewriteKind == RK_None &&
3379 getToolChain().IsObjCNonFragileABIDefault()));
3380 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3381 options::OPT_fno_objc_nonfragile_abi,
3382 nonFragileABIIsDefault)) {
3383 // Determine the non-fragile ABI version to use.
3384#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3385 unsigned nonFragileABIVersion = 1;
3386#else
3387 unsigned nonFragileABIVersion = 2;
3388#endif
3389
3390 if (Arg *abiArg = args.getLastArg(
3391 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003392 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003393 if (value == "1")
3394 nonFragileABIVersion = 1;
3395 else if (value == "2")
3396 nonFragileABIVersion = 2;
3397 else
3398 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3399 << value;
3400 }
3401
3402 objcABIVersion = 1 + nonFragileABIVersion;
3403 } else {
3404 objcABIVersion = 1;
3405 }
3406 }
3407
3408 // We don't actually care about the ABI version other than whether
3409 // it's non-fragile.
3410 bool isNonFragile = objcABIVersion != 1;
3411
3412 // If we have no runtime argument, ask the toolchain for its default runtime.
3413 // However, the rewriter only really supports the Mac runtime, so assume that.
3414 ObjCRuntime runtime;
3415 if (!runtimeArg) {
3416 switch (rewriteKind) {
3417 case RK_None:
3418 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3419 break;
3420 case RK_Fragile:
3421 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3422 break;
3423 case RK_NonFragile:
3424 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3425 break;
3426 }
3427
3428 // -fnext-runtime
3429 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3430 // On Darwin, make this use the default behavior for the toolchain.
3431 if (getToolChain().getTriple().isOSDarwin()) {
3432 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3433
3434 // Otherwise, build for a generic macosx port.
3435 } else {
3436 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3437 }
3438
3439 // -fgnu-runtime
3440 } else {
3441 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003442 // Legacy behaviour is to target the gnustep runtime if we are i
3443 // non-fragile mode or the GCC runtime in fragile mode.
3444 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003445 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003446 else
3447 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003448 }
3449
3450 cmdArgs.push_back(args.MakeArgString(
3451 "-fobjc-runtime=" + runtime.getAsString()));
3452 return runtime;
3453}
3454
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003455void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003456 const InputInfo &Output,
3457 const InputInfoList &Inputs,
3458 const ArgList &Args,
3459 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003460 ArgStringList CmdArgs;
3461
3462 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3463 const InputInfo &Input = Inputs[0];
3464
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003465 // Don't warn about "clang -w -c foo.s"
3466 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003467 // and "clang -emit-llvm -c foo.s"
3468 Args.ClaimAllArgs(options::OPT_emit_llvm);
3469 // and "clang -use-gold-plugin -c foo.s"
3470 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003471
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003472 // Invoke ourselves in -cc1as mode.
3473 //
3474 // FIXME: Implement custom jobs for internal actions.
3475 CmdArgs.push_back("-cc1as");
3476
3477 // Add the "effective" target triple.
3478 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003479 std::string TripleStr =
3480 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003481 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3482
3483 // Set the output mode, we currently only expect to be used as a real
3484 // assembler.
3485 CmdArgs.push_back("-filetype");
3486 CmdArgs.push_back("obj");
3487
Eric Christopher45f2e712012-12-18 00:31:10 +00003488 // Set the main file name, so that debug info works even with
3489 // -save-temps or preprocessed assembly.
3490 CmdArgs.push_back("-main-file-name");
3491 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3492
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003493 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003494 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003495
Jim Grosbach576452b2012-02-10 20:37:10 +00003496 // Add target specific cpu and features flags.
3497 switch(getToolChain().getTriple().getArch()) {
3498 default:
3499 break;
3500
3501 case llvm::Triple::arm:
3502 case llvm::Triple::thumb:
3503 AddARMTargetArgs(Args, CmdArgs);
3504 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003505
3506 case llvm::Triple::x86:
3507 case llvm::Triple::x86_64:
3508 AddX86TargetArgs(Args, CmdArgs);
3509 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003510 }
3511
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003512 // Ignore explicit -force_cpusubtype_ALL option.
3513 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003514
Eric Christopherfc3ee562012-01-10 00:38:01 +00003515 // Determine the original source input.
3516 const Action *SourceAction = &JA;
3517 while (SourceAction->getKind() != Action::InputClass) {
3518 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3519 SourceAction = SourceAction->getInputs()[0];
3520 }
3521
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003522 // Forward -g and handle debug info related flags, assuming we are dealing
3523 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003524 if (SourceAction->getType() == types::TY_Asm ||
3525 SourceAction->getType() == types::TY_PP_Asm) {
3526 Args.ClaimAllArgs(options::OPT_g_Group);
3527 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3528 if (!A->getOption().matches(options::OPT_g0))
3529 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003530
3531 // Add the -fdebug-compilation-dir flag if needed.
3532 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003533
3534 // Set the AT_producer to the clang version when using the integrated
3535 // assembler on assembly source files.
3536 CmdArgs.push_back("-dwarf-debug-producer");
3537 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003538 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003539
3540 // Optionally embed the -cc1as level arguments into the debug info, for build
3541 // analysis.
3542 if (getToolChain().UseDwarfDebugFlags()) {
3543 ArgStringList OriginalArgs;
3544 for (ArgList::const_iterator it = Args.begin(),
3545 ie = Args.end(); it != ie; ++it)
3546 (*it)->render(Args, OriginalArgs);
3547
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003548 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003549 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3550 Flags += Exec;
3551 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3552 Flags += " ";
3553 Flags += OriginalArgs[i];
3554 }
3555 CmdArgs.push_back("-dwarf-debug-flags");
3556 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3557 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003558
3559 // FIXME: Add -static support, once we have it.
3560
3561 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3562 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003563 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003564
3565 assert(Output.isFilename() && "Unexpected lipo output.");
3566 CmdArgs.push_back("-o");
3567 CmdArgs.push_back(Output.getFilename());
3568
Daniel Dunbarb440f562010-08-02 02:38:21 +00003569 assert(Input.isFilename() && "Invalid input.");
3570 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003571
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003572 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003573 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003574}
3575
Daniel Dunbara3246a02009-03-18 08:07:30 +00003576void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003577 const InputInfo &Output,
3578 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003579 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003580 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003581 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003582 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003583
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003584 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003585 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003586 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003587 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003588 // Don't forward any -g arguments to assembly steps.
3589 if (isa<AssembleJobAction>(JA) &&
3590 A->getOption().matches(options::OPT_g_Group))
3591 continue;
3592
Daniel Dunbar2da02722009-03-19 07:55:12 +00003593 // It is unfortunate that we have to claim here, as this means
3594 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003595 // platforms using a generic gcc, even if we are just using gcc
3596 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003597 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003598 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003599 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003600 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003601
Daniel Dunbar4e295052010-01-25 22:35:08 +00003602 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003603
3604 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003605 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003606 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003607 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003608
3609 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003610 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003611 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003612 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003613 CmdArgs.push_back("ppc64");
3614 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003615 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003616 }
3617
Daniel Dunbar5716d872009-05-02 21:41:52 +00003618 // Try to force gcc to match the tool chain we want, if we recognize
3619 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003620 //
3621 // FIXME: The triple class should directly provide the information we want
3622 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003623 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003624 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003625 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003626 CmdArgs.push_back("-m64");
3627
Daniel Dunbarb440f562010-08-02 02:38:21 +00003628 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003629 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003630 CmdArgs.push_back(Output.getFilename());
3631 } else {
3632 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003633 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003634 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003635
Tony Linthicum76329bf2011-12-12 21:14:55 +00003636 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3637 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003638
3639 // Only pass -x if gcc will understand it; otherwise hope gcc
3640 // understands the suffix correctly. The main use case this would go
3641 // wrong in is for linker inputs if they happened to have an odd
3642 // suffix; really the only way to get this to happen is a command
3643 // like '-x foobar a.c' which will treat a.c like a linker input.
3644 //
3645 // FIXME: For the linker case specifically, can we safely convert
3646 // inputs into '-Wl,' options?
3647 for (InputInfoList::const_iterator
3648 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3649 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003650
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003651 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003652 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3653 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003654 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003655 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003656 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003657 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003658 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003659
Daniel Dunbara3246a02009-03-18 08:07:30 +00003660 if (types::canTypeBeUserSpecified(II.getType())) {
3661 CmdArgs.push_back("-x");
3662 CmdArgs.push_back(types::getTypeName(II.getType()));
3663 }
3664
Daniel Dunbarb440f562010-08-02 02:38:21 +00003665 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003666 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003667 else {
3668 const Arg &A = II.getInputArg();
3669
3670 // Reverse translate some rewritten options.
3671 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3672 CmdArgs.push_back("-lstdc++");
3673 continue;
3674 }
3675
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003676 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003677 A.render(Args, CmdArgs);
3678 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003679 }
3680
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003681 const std::string customGCCName = D.getCCCGenericGCCName();
3682 const char *GCCName;
3683 if (!customGCCName.empty())
3684 GCCName = customGCCName.c_str();
3685 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003686 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003687 } else
3688 GCCName = "gcc";
3689
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003690 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003691 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003692 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003693}
3694
Daniel Dunbar4e295052010-01-25 22:35:08 +00003695void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3696 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003697 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003698}
3699
Daniel Dunbar4e295052010-01-25 22:35:08 +00003700void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3701 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003702 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003703}
3704
Daniel Dunbar4e295052010-01-25 22:35:08 +00003705void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3706 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003707 const Driver &D = getToolChain().getDriver();
3708
Daniel Dunbar4e295052010-01-25 22:35:08 +00003709 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003710 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3711 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003712 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003713 else {
3714 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003715 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003716 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003717
Daniel Dunbar4e295052010-01-25 22:35:08 +00003718 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003719 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003720}
3721
Daniel Dunbar4e295052010-01-25 22:35:08 +00003722void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3723 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003724 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003725}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003726
Daniel Dunbar4e295052010-01-25 22:35:08 +00003727void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3728 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003729 // The types are (hopefully) good enough.
3730}
3731
Tony Linthicum76329bf2011-12-12 21:14:55 +00003732// Hexagon tools start.
3733void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3734 ArgStringList &CmdArgs) const {
3735
3736}
3737void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3738 const InputInfo &Output,
3739 const InputInfoList &Inputs,
3740 const ArgList &Args,
3741 const char *LinkingOutput) const {
3742
3743 const Driver &D = getToolChain().getDriver();
3744 ArgStringList CmdArgs;
3745
3746 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003747 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003748 CmdArgs.push_back(Args.MakeArgString(MarchString));
3749
3750 RenderExtraToolArgs(JA, CmdArgs);
3751
3752 if (Output.isFilename()) {
3753 CmdArgs.push_back("-o");
3754 CmdArgs.push_back(Output.getFilename());
3755 } else {
3756 assert(Output.isNothing() && "Unexpected output");
3757 CmdArgs.push_back("-fsyntax-only");
3758 }
3759
Matthew Curtise8f80a12012-12-06 17:49:03 +00003760 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3761 if (!SmallDataThreshold.empty())
3762 CmdArgs.push_back(
3763 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003764
Matthew Curtise5df3812012-12-07 17:23:04 +00003765 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3766 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3767 options::OPT_Xassembler);
3768
Tony Linthicum76329bf2011-12-12 21:14:55 +00003769 // Only pass -x if gcc will understand it; otherwise hope gcc
3770 // understands the suffix correctly. The main use case this would go
3771 // wrong in is for linker inputs if they happened to have an odd
3772 // suffix; really the only way to get this to happen is a command
3773 // like '-x foobar a.c' which will treat a.c like a linker input.
3774 //
3775 // FIXME: For the linker case specifically, can we safely convert
3776 // inputs into '-Wl,' options?
3777 for (InputInfoList::const_iterator
3778 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3779 const InputInfo &II = *it;
3780
3781 // Don't try to pass LLVM or AST inputs to a generic gcc.
3782 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3783 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3784 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3785 << getToolChain().getTripleString();
3786 else if (II.getType() == types::TY_AST)
3787 D.Diag(clang::diag::err_drv_no_ast_support)
3788 << getToolChain().getTripleString();
3789
3790 if (II.isFilename())
3791 CmdArgs.push_back(II.getFilename());
3792 else
3793 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3794 II.getInputArg().render(Args, CmdArgs);
3795 }
3796
3797 const char *GCCName = "hexagon-as";
3798 const char *Exec =
3799 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3800 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3801
3802}
3803void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3804 ArgStringList &CmdArgs) const {
3805 // The types are (hopefully) good enough.
3806}
3807
3808void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3809 const InputInfo &Output,
3810 const InputInfoList &Inputs,
3811 const ArgList &Args,
3812 const char *LinkingOutput) const {
3813
Matthew Curtise689b052012-12-06 15:46:07 +00003814 const toolchains::Hexagon_TC& ToolChain =
3815 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
3816 const Driver &D = ToolChain.getDriver();
3817
Tony Linthicum76329bf2011-12-12 21:14:55 +00003818 ArgStringList CmdArgs;
3819
Matthew Curtise689b052012-12-06 15:46:07 +00003820 //----------------------------------------------------------------------------
3821 //
3822 //----------------------------------------------------------------------------
3823 bool hasStaticArg = Args.hasArg(options::OPT_static);
3824 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00003825 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00003826 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
3827 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
3828 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
3829 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003830
Matthew Curtise689b052012-12-06 15:46:07 +00003831 //----------------------------------------------------------------------------
3832 // Silence warnings for various options
3833 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00003834
Matthew Curtise689b052012-12-06 15:46:07 +00003835 Args.ClaimAllArgs(options::OPT_g_Group);
3836 Args.ClaimAllArgs(options::OPT_emit_llvm);
3837 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
3838 // handled somewhere else.
3839 Args.ClaimAllArgs(options::OPT_static_libgcc);
3840
3841 //----------------------------------------------------------------------------
3842 //
3843 //----------------------------------------------------------------------------
3844 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
3845 e = ToolChain.ExtraOpts.end();
3846 i != e; ++i)
3847 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003848
Matthew Curtisf10a5952012-12-06 14:16:43 +00003849 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
3850 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00003851
Matthew Curtise689b052012-12-06 15:46:07 +00003852 if (buildingLib) {
3853 CmdArgs.push_back("-shared");
3854 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
3855 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00003856 }
3857
Matthew Curtise689b052012-12-06 15:46:07 +00003858 if (hasStaticArg)
3859 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003860
Matthew Curtise8f80a12012-12-06 17:49:03 +00003861 if (buildPIE && !buildingLib)
3862 CmdArgs.push_back("-pie");
3863
3864 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3865 if (!SmallDataThreshold.empty()) {
3866 CmdArgs.push_back(
3867 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
3868 }
3869
Matthew Curtise689b052012-12-06 15:46:07 +00003870 //----------------------------------------------------------------------------
3871 //
3872 //----------------------------------------------------------------------------
3873 CmdArgs.push_back("-o");
3874 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00003875
Matthew Curtise689b052012-12-06 15:46:07 +00003876 const std::string MarchSuffix = "/" + MarchString;
3877 const std::string G0Suffix = "/G0";
3878 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
3879 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
3880 + "/";
3881 const std::string StartFilesDir = RootDir
3882 + "hexagon/lib"
3883 + (buildingLib
3884 ? MarchG0Suffix : MarchSuffix);
3885
3886 //----------------------------------------------------------------------------
3887 // moslib
3888 //----------------------------------------------------------------------------
3889 std::vector<std::string> oslibs;
3890 bool hasStandalone= false;
3891
3892 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
3893 ie = Args.filtered_end(); it != ie; ++it) {
3894 (*it)->claim();
3895 oslibs.push_back((*it)->getValue());
3896 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003897 }
Matthew Curtise689b052012-12-06 15:46:07 +00003898 if (oslibs.empty()) {
3899 oslibs.push_back("standalone");
3900 hasStandalone = true;
3901 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00003902
Matthew Curtise689b052012-12-06 15:46:07 +00003903 //----------------------------------------------------------------------------
3904 // Start Files
3905 //----------------------------------------------------------------------------
3906 if (incStdLib && incStartFiles) {
3907
3908 if (!buildingLib) {
3909 if (hasStandalone) {
3910 CmdArgs.push_back(
3911 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
3912 }
3913 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
3914 }
3915 std::string initObj = useShared ? "/initS.o" : "/init.o";
3916 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
3917 }
3918
3919 //----------------------------------------------------------------------------
3920 // Library Search Paths
3921 //----------------------------------------------------------------------------
3922 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
3923 for (ToolChain::path_list::const_iterator
3924 i = LibPaths.begin(),
3925 e = LibPaths.end();
3926 i != e;
3927 ++i)
3928 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
3929
3930 //----------------------------------------------------------------------------
3931 //
3932 //----------------------------------------------------------------------------
3933 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
3934 Args.AddAllArgs(CmdArgs, options::OPT_e);
3935 Args.AddAllArgs(CmdArgs, options::OPT_s);
3936 Args.AddAllArgs(CmdArgs, options::OPT_t);
3937 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
3938
3939 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
3940
3941 //----------------------------------------------------------------------------
3942 // Libraries
3943 //----------------------------------------------------------------------------
3944 if (incStdLib && incDefLibs) {
3945 if (D.CCCIsCXX) {
3946 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
3947 CmdArgs.push_back("-lm");
3948 }
3949
3950 CmdArgs.push_back("--start-group");
3951
3952 if (!buildingLib) {
3953 for(std::vector<std::string>::iterator i = oslibs.begin(),
3954 e = oslibs.end(); i != e; ++i)
3955 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
3956 CmdArgs.push_back("-lc");
3957 }
3958 CmdArgs.push_back("-lgcc");
3959
3960 CmdArgs.push_back("--end-group");
3961 }
3962
3963 //----------------------------------------------------------------------------
3964 // End files
3965 //----------------------------------------------------------------------------
3966 if (incStdLib && incStartFiles) {
3967 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
3968 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
3969 }
3970
3971 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
3972 C.addCommand(
3973 new Command(
3974 JA, *this,
3975 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003976}
3977// Hexagon tools end.
3978
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003979llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3980 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3981 // archs which Darwin doesn't use.
3982
3983 // The matching this routine does is fairly pointless, since it is neither the
3984 // complete architecture list, nor a reasonable subset. The problem is that
3985 // historically the driver driver accepts this and also ties its -march=
3986 // handling to the architecture name, so we need to be careful before removing
3987 // support for it.
3988
3989 // This code must be kept in sync with Clang's Darwin specific argument
3990 // translation.
3991
3992 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3993 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3994 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3995 .Case("ppc64", llvm::Triple::ppc64)
3996 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3997 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3998 llvm::Triple::x86)
3999 .Case("x86_64", llvm::Triple::x86_64)
4000 // This is derived from the driver driver.
4001 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
4002 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
4003 .Case("r600", llvm::Triple::r600)
4004 .Case("nvptx", llvm::Triple::nvptx)
4005 .Case("nvptx64", llvm::Triple::nvptx64)
4006 .Case("amdil", llvm::Triple::amdil)
4007 .Case("spir", llvm::Triple::spir)
4008 .Default(llvm::Triple::UnknownArch);
4009}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004010
Bob Wilsondecc03e2012-11-23 06:14:39 +00004011const char *Clang::getBaseInputName(const ArgList &Args,
4012 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004013 return Args.MakeArgString(
4014 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004015}
4016
Bob Wilsondecc03e2012-11-23 06:14:39 +00004017const char *Clang::getBaseInputStem(const ArgList &Args,
4018 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004019 const char *Str = getBaseInputName(Args, Inputs);
4020
Chris Lattner906bb902011-01-16 08:14:11 +00004021 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004022 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004023
4024 return Str;
4025}
4026
Bob Wilsondecc03e2012-11-23 06:14:39 +00004027const char *Clang::getDependencyFileName(const ArgList &Args,
4028 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004029 // FIXME: Think about this more.
4030 std::string Res;
4031
4032 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004033 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004034 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004035 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004036 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004037 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004038 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004039}
4040
Daniel Dunbarbe220842009-03-20 16:06:39 +00004041void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004042 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004043 const InputInfoList &Inputs,
4044 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004045 const char *LinkingOutput) const {
4046 ArgStringList CmdArgs;
4047
4048 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4049 const InputInfo &Input = Inputs[0];
4050
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004051 // Determine the original source input.
4052 const Action *SourceAction = &JA;
4053 while (SourceAction->getKind() != Action::InputClass) {
4054 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4055 SourceAction = SourceAction->getInputs()[0];
4056 }
4057
4058 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004059 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004060 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004061 if (Args.hasArg(options::OPT_gstabs))
4062 CmdArgs.push_back("--gstabs");
4063 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004064 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004065 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004066
Daniel Dunbarbe220842009-03-20 16:06:39 +00004067 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004068 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004069
Daniel Dunbar6d484762010-07-22 01:47:22 +00004070 // Use -force_cpusubtype_ALL on x86 by default.
4071 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4072 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004073 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4074 CmdArgs.push_back("-force_cpusubtype_ALL");
4075
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004076 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004077 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004078 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004079 (!getDarwinToolChain().isTargetIPhoneOS() ||
4080 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4081 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004082 CmdArgs.push_back("-static");
4083
Daniel Dunbarbe220842009-03-20 16:06:39 +00004084 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4085 options::OPT_Xassembler);
4086
4087 assert(Output.isFilename() && "Unexpected lipo output.");
4088 CmdArgs.push_back("-o");
4089 CmdArgs.push_back(Output.getFilename());
4090
Daniel Dunbarb440f562010-08-02 02:38:21 +00004091 assert(Input.isFilename() && "Invalid input.");
4092 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004093
4094 // asm_final spec is empty.
4095
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004096 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004097 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004098 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004099}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004100
David Blaikie68e081d2011-12-20 02:48:34 +00004101void darwin::DarwinTool::anchor() {}
4102
Daniel Dunbare9ded432009-09-09 18:36:20 +00004103void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4104 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004105 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004106
Daniel Dunbarc1964212009-03-26 16:23:12 +00004107 // Derived from darwin_arch spec.
4108 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004109 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004110
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004111 // FIXME: Is this needed anymore?
4112 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004113 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004114}
4115
Bill Wendling3b2000f2012-10-02 18:02:50 +00004116bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4117 // We only need to generate a temp path for LTO if we aren't compiling object
4118 // files. When compiling source files, we run 'dsymutil' after linking. We
4119 // don't run 'dsymutil' when compiling object files.
4120 for (InputInfoList::const_iterator
4121 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4122 if (it->getType() != types::TY_Object)
4123 return true;
4124
4125 return false;
4126}
4127
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004128void darwin::Link::AddLinkArgs(Compilation &C,
4129 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004130 ArgStringList &CmdArgs,
4131 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004132 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004133 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004134
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004135 unsigned Version[3] = { 0, 0, 0 };
4136 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4137 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004138 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004139 Version[1], Version[2], HadExtra) ||
4140 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004141 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004142 << A->getAsString(Args);
4143 }
4144
4145 // Newer linkers support -demangle, pass it if supported and not disabled by
4146 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004147 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004148 // Don't pass -demangle to ld_classic.
4149 //
4150 // FIXME: This is a temporary workaround, ld should be handling this.
4151 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4152 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004153 if (getToolChain().getArch() == llvm::Triple::x86) {
4154 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4155 options::OPT_Wl_COMMA),
4156 ie = Args.filtered_end(); it != ie; ++it) {
4157 const Arg *A = *it;
4158 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004159 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004160 UsesLdClassic = true;
4161 }
4162 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004163 if (!UsesLdClassic)
4164 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004165 }
4166
Bill Wendling313b6bf2012-11-16 23:03:00 +00004167 // If we are using LTO, then automatically create a temporary file path for
4168 // the linker to use, so that it's lifetime will extend past a possible
4169 // dsymutil step.
4170 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4171 const char *TmpPath = C.getArgs().MakeArgString(
4172 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4173 C.addTempFile(TmpPath);
4174 CmdArgs.push_back("-object_path_lto");
4175 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004176 }
4177
Daniel Dunbarc1964212009-03-26 16:23:12 +00004178 // Derived from the "link" spec.
4179 Args.AddAllArgs(CmdArgs, options::OPT_static);
4180 if (!Args.hasArg(options::OPT_static))
4181 CmdArgs.push_back("-dynamic");
4182 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4183 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4184 // here. How do we wish to handle such things?
4185 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004186
Daniel Dunbarc1964212009-03-26 16:23:12 +00004187 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004188 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004189 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004190 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004191
4192 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4193 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4194 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4195
4196 Arg *A;
4197 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4198 (A = Args.getLastArg(options::OPT_current__version)) ||
4199 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004200 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004201 << A->getAsString(Args) << "-dynamiclib";
4202
4203 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4204 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4205 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4206 } else {
4207 CmdArgs.push_back("-dylib");
4208
4209 Arg *A;
4210 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4211 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4212 (A = Args.getLastArg(options::OPT_client__name)) ||
4213 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4214 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4215 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004216 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004217 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004218
Daniel Dunbarc1964212009-03-26 16:23:12 +00004219 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4220 "-dylib_compatibility_version");
4221 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4222 "-dylib_current_version");
4223
Daniel Dunbara48823f2010-01-22 02:04:52 +00004224 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004225
4226 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4227 "-dylib_install_name");
4228 }
4229
4230 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4231 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4232 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004233 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004234 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004235 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4236 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4237 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4238 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4239 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4240 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004241 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004242 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4243 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4244 Args.AddAllArgs(CmdArgs, options::OPT_init);
4245
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004246 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004247 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004248
4249 // If we had an explicit -mios-simulator-version-min argument, honor that,
4250 // otherwise use the traditional deployment targets. We can't just check the
4251 // is-sim attribute because existing code follows this path, and the linker
4252 // may not handle the argument.
4253 //
4254 // FIXME: We may be able to remove this, once we can verify no one depends on
4255 // it.
4256 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4257 CmdArgs.push_back("-ios_simulator_version_min");
4258 else if (DarwinTC.isTargetIPhoneOS())
4259 CmdArgs.push_back("-iphoneos_version_min");
4260 else
4261 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004262 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004263
Daniel Dunbarc1964212009-03-26 16:23:12 +00004264 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4265 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4266 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4267 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4268 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004269
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004270 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4271 options::OPT_fno_pie,
4272 options::OPT_fno_PIE)) {
4273 if (A->getOption().matches(options::OPT_fpie) ||
4274 A->getOption().matches(options::OPT_fPIE))
4275 CmdArgs.push_back("-pie");
4276 else
4277 CmdArgs.push_back("-no_pie");
4278 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004279
4280 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4281 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4282 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4283 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4284 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4285 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4286 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4287 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4288 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4289 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4290 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4291 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4292 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4293 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4294 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4295 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004296
Daniel Dunbar84384642011-05-02 21:03:47 +00004297 // Give --sysroot= preference, over the Apple specific behavior to also use
4298 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004299 StringRef sysroot = C.getSysRoot();
4300 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004301 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004302 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004303 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4304 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004305 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004306 }
4307
Daniel Dunbarc1964212009-03-26 16:23:12 +00004308 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4309 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4310 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4311 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4312 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004313 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004314 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4315 Args.AddAllArgs(CmdArgs, options::OPT_y);
4316 Args.AddLastArg(CmdArgs, options::OPT_w);
4317 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4318 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4319 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4320 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4321 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4322 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4323 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4324 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4325 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4326 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4327 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4328 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4329}
4330
4331void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004332 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004333 const InputInfoList &Inputs,
4334 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004335 const char *LinkingOutput) const {
4336 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004337
Daniel Dunbarc1964212009-03-26 16:23:12 +00004338 // The logic here is derived from gcc's behavior; most of which
4339 // comes from specs (starting with link_command). Consult gcc for
4340 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004341 ArgStringList CmdArgs;
4342
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004343 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4344 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4345 options::OPT_ccc_arcmt_migrate)) {
4346 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4347 (*I)->claim();
4348 const char *Exec =
4349 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4350 CmdArgs.push_back(Output.getFilename());
4351 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4352 return;
4353 }
4354
Daniel Dunbarc1964212009-03-26 16:23:12 +00004355 // I'm not sure why this particular decomposition exists in gcc, but
4356 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004357 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004358
Daniel Dunbarc1964212009-03-26 16:23:12 +00004359 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4360 Args.AddAllArgs(CmdArgs, options::OPT_s);
4361 Args.AddAllArgs(CmdArgs, options::OPT_t);
4362 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4363 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004364 Args.AddLastArg(CmdArgs, options::OPT_e);
4365 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4366 Args.AddAllArgs(CmdArgs, options::OPT_r);
4367
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004368 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4369 // members of static archive libraries which implement Objective-C classes or
4370 // categories.
4371 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4372 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004373
Bill Wendling58979742012-12-10 21:48:41 +00004374 if (Args.hasArg(options::OPT_rdynamic))
4375 CmdArgs.push_back("-export_dynamic");
4376
Daniel Dunbarc1964212009-03-26 16:23:12 +00004377 CmdArgs.push_back("-o");
4378 CmdArgs.push_back(Output.getFilename());
4379
Chad Rosier06fd3c62012-05-16 23:45:12 +00004380 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004381 !Args.hasArg(options::OPT_nostartfiles)) {
4382 // Derived from startfile spec.
4383 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004384 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004385 if (getDarwinToolChain().isTargetIOSSimulator()) {
4386 // The simulator doesn't have a versioned crt1 file.
4387 CmdArgs.push_back("-ldylib1.o");
4388 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004389 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4390 CmdArgs.push_back("-ldylib1.o");
4391 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004392 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004393 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004394 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004395 CmdArgs.push_back("-ldylib1.10.5.o");
4396 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004397 } else {
4398 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004399 if (!Args.hasArg(options::OPT_static)) {
4400 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004401 if (getDarwinToolChain().isTargetIOSSimulator()) {
4402 // The simulator doesn't have a versioned crt1 file.
4403 CmdArgs.push_back("-lbundle1.o");
4404 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004405 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4406 CmdArgs.push_back("-lbundle1.o");
4407 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004408 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004409 CmdArgs.push_back("-lbundle1.o");
4410 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004411 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004412 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004413 if (Args.hasArg(options::OPT_pg) &&
4414 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004415 if (Args.hasArg(options::OPT_static) ||
4416 Args.hasArg(options::OPT_object) ||
4417 Args.hasArg(options::OPT_preload)) {
4418 CmdArgs.push_back("-lgcrt0.o");
4419 } else {
4420 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004421
Daniel Dunbarc1964212009-03-26 16:23:12 +00004422 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004423 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004424 // By default on OS X 10.8 and later, we don't link with a crt1.o
4425 // file and the linker knows to use _main as the entry point. But,
4426 // when compiling with -pg, we need to link with the gcrt1.o file,
4427 // so pass the -no_new_main option to tell the linker to use the
4428 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004429 if (getDarwinToolChain().isTargetMacOS() &&
4430 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4431 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004432 } else {
4433 if (Args.hasArg(options::OPT_static) ||
4434 Args.hasArg(options::OPT_object) ||
4435 Args.hasArg(options::OPT_preload)) {
4436 CmdArgs.push_back("-lcrt0.o");
4437 } else {
4438 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004439 if (getDarwinToolChain().isTargetIOSSimulator()) {
4440 // The simulator doesn't have a versioned crt1 file.
4441 CmdArgs.push_back("-lcrt1.o");
4442 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004443 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4444 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004445 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004446 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004447 } else {
4448 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4449 CmdArgs.push_back("-lcrt1.o");
4450 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4451 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004452 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004453 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004454
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004455 // darwin_crt2 spec is empty.
4456 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004457 }
4458 }
4459 }
4460 }
4461
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004462 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4463 Args.hasArg(options::OPT_shared_libgcc) &&
4464 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004465 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004466 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004467 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004468 }
4469 }
4470
4471 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004472
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004473 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004474 // If we're building a dynamic lib with -fsanitize=address,
4475 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004476 // of them as dynamic_lookup. Linking executables is handled in
4477 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004478 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004479 if (Args.hasArg(options::OPT_dynamiclib) ||
4480 Args.hasArg(options::OPT_bundle)) {
4481 CmdArgs.push_back("-undefined");
4482 CmdArgs.push_back("dynamic_lookup");
4483 }
4484 }
4485
Daniel Dunbarc1964212009-03-26 16:23:12 +00004486 if (Args.hasArg(options::OPT_fopenmp))
4487 // This is more complicated in gcc...
4488 CmdArgs.push_back("-lgomp");
4489
Douglas Gregor9295df02012-05-15 21:00:27 +00004490 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4491
Bob Wilson16d93952012-05-15 18:57:39 +00004492 if (isObjCRuntimeLinked(Args) &&
4493 !Args.hasArg(options::OPT_nostdlib) &&
4494 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004495 // Avoid linking compatibility stubs on i386 mac.
4496 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004497 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004498 // If we don't have ARC or subscripting runtime support, link in the
4499 // runtime stubs. We have to do this *before* adding any of the normal
4500 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004501 ObjCRuntime runtime =
4502 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004503 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004504 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004505 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004506 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004507 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004508 CmdArgs.push_back("-framework");
4509 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004510 // Link libobj.
4511 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004512 }
John McCall31168b02011-06-15 23:02:42 +00004513
Daniel Dunbarc1964212009-03-26 16:23:12 +00004514 if (LinkingOutput) {
4515 CmdArgs.push_back("-arch_multiple");
4516 CmdArgs.push_back("-final_output");
4517 CmdArgs.push_back(LinkingOutput);
4518 }
4519
Daniel Dunbarc1964212009-03-26 16:23:12 +00004520 if (Args.hasArg(options::OPT_fnested_functions))
4521 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004522
Daniel Dunbarc1964212009-03-26 16:23:12 +00004523 if (!Args.hasArg(options::OPT_nostdlib) &&
4524 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004525 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004526 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004527
Daniel Dunbarc1964212009-03-26 16:23:12 +00004528 // link_ssp spec is empty.
4529
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004530 // Let the tool chain choose which runtime library to link.
4531 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004532 }
4533
Chad Rosier06fd3c62012-05-16 23:45:12 +00004534 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004535 !Args.hasArg(options::OPT_nostartfiles)) {
4536 // endfile_spec is empty.
4537 }
4538
4539 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4540 Args.AddAllArgs(CmdArgs, options::OPT_F);
4541
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004542 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004543 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004544 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004545}
4546
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004547void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004548 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004549 const InputInfoList &Inputs,
4550 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004551 const char *LinkingOutput) const {
4552 ArgStringList CmdArgs;
4553
4554 CmdArgs.push_back("-create");
4555 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004556
4557 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004558 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004559
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004560 for (InputInfoList::const_iterator
4561 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4562 const InputInfo &II = *it;
4563 assert(II.isFilename() && "Unexpected lipo input.");
4564 CmdArgs.push_back(II.getFilename());
4565 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004566 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004567 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004568 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004569}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004570
Daniel Dunbar88299622010-06-04 18:28:36 +00004571void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004572 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004573 const InputInfoList &Inputs,
4574 const ArgList &Args,
4575 const char *LinkingOutput) const {
4576 ArgStringList CmdArgs;
4577
Daniel Dunbareb86b042011-05-09 17:23:16 +00004578 CmdArgs.push_back("-o");
4579 CmdArgs.push_back(Output.getFilename());
4580
Daniel Dunbar88299622010-06-04 18:28:36 +00004581 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4582 const InputInfo &Input = Inputs[0];
4583 assert(Input.isFilename() && "Unexpected dsymutil input.");
4584 CmdArgs.push_back(Input.getFilename());
4585
Daniel Dunbar88299622010-06-04 18:28:36 +00004586 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004587 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004588 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004589}
4590
Eric Christopher551ef452011-08-23 17:56:55 +00004591void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004592 const InputInfo &Output,
4593 const InputInfoList &Inputs,
4594 const ArgList &Args,
4595 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004596 ArgStringList CmdArgs;
4597 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004598 CmdArgs.push_back("--debug-info");
4599 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004600 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004601
4602 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4603 const InputInfo &Input = Inputs[0];
4604 assert(Input.isFilename() && "Unexpected verify input");
4605
4606 // Grabbing the output of the earlier dsymutil run.
4607 CmdArgs.push_back(Input.getFilename());
4608
4609 const char *Exec =
4610 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4611 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4612}
4613
David Chisnallf571cde2012-02-15 13:39:01 +00004614void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4615 const InputInfo &Output,
4616 const InputInfoList &Inputs,
4617 const ArgList &Args,
4618 const char *LinkingOutput) const {
4619 ArgStringList CmdArgs;
4620
4621 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4622 options::OPT_Xassembler);
4623
4624 CmdArgs.push_back("-o");
4625 CmdArgs.push_back(Output.getFilename());
4626
4627 for (InputInfoList::const_iterator
4628 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4629 const InputInfo &II = *it;
4630 CmdArgs.push_back(II.getFilename());
4631 }
4632
4633 const char *Exec =
4634 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4635 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4636}
4637
4638
4639void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4640 const InputInfo &Output,
4641 const InputInfoList &Inputs,
4642 const ArgList &Args,
4643 const char *LinkingOutput) const {
4644 // FIXME: Find a real GCC, don't hard-code versions here
4645 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4646 const llvm::Triple &T = getToolChain().getTriple();
4647 std::string LibPath = "/usr/lib/";
4648 llvm::Triple::ArchType Arch = T.getArch();
4649 switch (Arch) {
4650 case llvm::Triple::x86:
4651 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4652 T.getOSName()).str() + "/4.5.2/";
4653 break;
4654 case llvm::Triple::x86_64:
4655 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4656 T.getOSName()).str();
4657 GCCLibPath += "/4.5.2/amd64/";
4658 LibPath += "amd64/";
4659 break;
4660 default:
4661 assert(0 && "Unsupported architecture");
4662 }
4663
4664 ArgStringList CmdArgs;
4665
David Chisnall272a0712012-02-29 15:06:12 +00004666 // Demangle C++ names in errors
4667 CmdArgs.push_back("-C");
4668
David Chisnallf571cde2012-02-15 13:39:01 +00004669 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4670 (!Args.hasArg(options::OPT_shared))) {
4671 CmdArgs.push_back("-e");
4672 CmdArgs.push_back("_start");
4673 }
4674
4675 if (Args.hasArg(options::OPT_static)) {
4676 CmdArgs.push_back("-Bstatic");
4677 CmdArgs.push_back("-dn");
4678 } else {
4679 CmdArgs.push_back("-Bdynamic");
4680 if (Args.hasArg(options::OPT_shared)) {
4681 CmdArgs.push_back("-shared");
4682 } else {
4683 CmdArgs.push_back("--dynamic-linker");
4684 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4685 }
4686 }
4687
4688 if (Output.isFilename()) {
4689 CmdArgs.push_back("-o");
4690 CmdArgs.push_back(Output.getFilename());
4691 } else {
4692 assert(Output.isNothing() && "Invalid output.");
4693 }
4694
4695 if (!Args.hasArg(options::OPT_nostdlib) &&
4696 !Args.hasArg(options::OPT_nostartfiles)) {
4697 if (!Args.hasArg(options::OPT_shared)) {
4698 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4699 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004700 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004701 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4702 } else {
4703 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004704 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4705 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004706 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004707 if (getToolChain().getDriver().CCCIsCXX)
4708 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004709 }
4710
4711 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4712
4713 Args.AddAllArgs(CmdArgs, options::OPT_L);
4714 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4715 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004716 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004717
4718 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4719
4720 if (!Args.hasArg(options::OPT_nostdlib) &&
4721 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004722 if (getToolChain().getDriver().CCCIsCXX)
4723 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004724 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004725 if (!Args.hasArg(options::OPT_shared)) {
4726 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004727 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004728 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004729 }
David Chisnallf571cde2012-02-15 13:39:01 +00004730 }
4731
4732 if (!Args.hasArg(options::OPT_nostdlib) &&
4733 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004734 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004735 }
David Chisnall96de9932012-02-16 16:00:47 +00004736 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004737
4738 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4739
4740 const char *Exec =
4741 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4742 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4743}
4744
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004745void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004746 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004747 const InputInfoList &Inputs,
4748 const ArgList &Args,
4749 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004750 ArgStringList CmdArgs;
4751
4752 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4753 options::OPT_Xassembler);
4754
4755 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004756 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004757
4758 for (InputInfoList::const_iterator
4759 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4760 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004761 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004762 }
4763
4764 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004765 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004766 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004767}
4768
4769void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004770 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004771 const InputInfoList &Inputs,
4772 const ArgList &Args,
4773 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004774 ArgStringList CmdArgs;
4775
4776 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004777 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004778 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004779 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004780 }
4781
4782 if (Args.hasArg(options::OPT_static)) {
4783 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004784 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004785 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004786// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004787 CmdArgs.push_back("-Bdynamic");
4788 if (Args.hasArg(options::OPT_shared)) {
4789 CmdArgs.push_back("-shared");
4790 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004791 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004792 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4793 }
4794 }
4795
Daniel Dunbarb440f562010-08-02 02:38:21 +00004796 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004797 CmdArgs.push_back("-o");
4798 CmdArgs.push_back(Output.getFilename());
4799 } else {
4800 assert(Output.isNothing() && "Invalid output.");
4801 }
4802
4803 if (!Args.hasArg(options::OPT_nostdlib) &&
4804 !Args.hasArg(options::OPT_nostartfiles)) {
4805 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004806 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004807 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004808 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004809 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004810 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004811 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004812 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004813 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004814 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004816 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004817 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004818 }
4819
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004820 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4821 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004822 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004823
4824 Args.AddAllArgs(CmdArgs, options::OPT_L);
4825 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4826 Args.AddAllArgs(CmdArgs, options::OPT_e);
4827
Daniel Dunbar54423b22010-09-17 00:24:54 +00004828 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004829
4830 if (!Args.hasArg(options::OPT_nostdlib) &&
4831 !Args.hasArg(options::OPT_nodefaultlibs)) {
4832 // FIXME: For some reason GCC passes -lgcc before adding
4833 // the default system libraries. Just mimic this for now.
4834 CmdArgs.push_back("-lgcc");
4835
4836 if (Args.hasArg(options::OPT_pthread))
4837 CmdArgs.push_back("-pthread");
4838 if (!Args.hasArg(options::OPT_shared))
4839 CmdArgs.push_back("-lc");
4840 CmdArgs.push_back("-lgcc");
4841 }
4842
4843 if (!Args.hasArg(options::OPT_nostdlib) &&
4844 !Args.hasArg(options::OPT_nostartfiles)) {
4845 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004846 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004847 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004848 }
4849
Bill Wendling08760582011-06-27 19:15:03 +00004850 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004851
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004852 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004853 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004854 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004855}
4856
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004857void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004858 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004859 const InputInfoList &Inputs,
4860 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004861 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004862 ArgStringList CmdArgs;
4863
4864 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4865 options::OPT_Xassembler);
4866
4867 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004868 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004869
4870 for (InputInfoList::const_iterator
4871 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4872 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004873 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004874 }
4875
4876 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004877 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004878 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004879}
4880
4881void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004882 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004883 const InputInfoList &Inputs,
4884 const ArgList &Args,
4885 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004886 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004887 ArgStringList CmdArgs;
4888
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004889 // Silence warning for "clang -g foo.o -o foo"
4890 Args.ClaimAllArgs(options::OPT_g_Group);
4891 // and "clang -emit-llvm foo.o -o foo"
4892 Args.ClaimAllArgs(options::OPT_emit_llvm);
4893 // and for "clang -w foo.o -o foo". Other warning options are already
4894 // handled somewhere else.
4895 Args.ClaimAllArgs(options::OPT_w);
4896
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004897 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004898 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004899 CmdArgs.push_back("-e");
4900 CmdArgs.push_back("__start");
4901 }
4902
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004903 if (Args.hasArg(options::OPT_static)) {
4904 CmdArgs.push_back("-Bstatic");
4905 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004906 if (Args.hasArg(options::OPT_rdynamic))
4907 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004908 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004909 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004910 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004911 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004912 } else {
4913 CmdArgs.push_back("-dynamic-linker");
4914 CmdArgs.push_back("/usr/libexec/ld.so");
4915 }
4916 }
4917
Daniel Dunbarb440f562010-08-02 02:38:21 +00004918 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004919 CmdArgs.push_back("-o");
4920 CmdArgs.push_back(Output.getFilename());
4921 } else {
4922 assert(Output.isNothing() && "Invalid output.");
4923 }
4924
4925 if (!Args.hasArg(options::OPT_nostdlib) &&
4926 !Args.hasArg(options::OPT_nostartfiles)) {
4927 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004928 if (Args.hasArg(options::OPT_pg))
4929 CmdArgs.push_back(Args.MakeArgString(
4930 getToolChain().GetFilePath("gcrt0.o")));
4931 else
4932 CmdArgs.push_back(Args.MakeArgString(
4933 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004934 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004935 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004936 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004937 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004938 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004939 }
4940 }
4941
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004942 std::string Triple = getToolChain().getTripleString();
4943 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004944 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004945 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004946 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004947
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004948 Args.AddAllArgs(CmdArgs, options::OPT_L);
4949 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4950 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00004951 Args.AddAllArgs(CmdArgs, options::OPT_s);
4952 Args.AddAllArgs(CmdArgs, options::OPT_t);
4953 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4954 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004955
Daniel Dunbar54423b22010-09-17 00:24:54 +00004956 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004957
4958 if (!Args.hasArg(options::OPT_nostdlib) &&
4959 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004960 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004961 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004962 if (Args.hasArg(options::OPT_pg))
4963 CmdArgs.push_back("-lm_p");
4964 else
4965 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004966 }
4967
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004968 // FIXME: For some reason GCC passes -lgcc before adding
4969 // the default system libraries. Just mimic this for now.
4970 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004971
Eric Christopher17674ec2012-09-13 06:32:34 +00004972 if (Args.hasArg(options::OPT_pthread)) {
4973 if (!Args.hasArg(options::OPT_shared) &&
4974 Args.hasArg(options::OPT_pg))
4975 CmdArgs.push_back("-lpthread_p");
4976 else
4977 CmdArgs.push_back("-lpthread");
4978 }
4979
Chandler Carruth45661652011-12-17 22:32:42 +00004980 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004981 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004982 CmdArgs.push_back("-lc_p");
4983 else
4984 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004985 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004986
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004987 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004988 }
4989
4990 if (!Args.hasArg(options::OPT_nostdlib) &&
4991 !Args.hasArg(options::OPT_nostartfiles)) {
4992 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004993 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004994 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004995 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004996 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004997 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004998 }
4999
5000 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005001 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005002 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005003}
Ed Schoutene33194b2009-04-02 19:13:12 +00005004
Eli Friedman9fa28852012-08-08 23:57:20 +00005005void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5006 const InputInfo &Output,
5007 const InputInfoList &Inputs,
5008 const ArgList &Args,
5009 const char *LinkingOutput) const {
5010 ArgStringList CmdArgs;
5011
5012 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5013 options::OPT_Xassembler);
5014
5015 CmdArgs.push_back("-o");
5016 CmdArgs.push_back(Output.getFilename());
5017
5018 for (InputInfoList::const_iterator
5019 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5020 const InputInfo &II = *it;
5021 CmdArgs.push_back(II.getFilename());
5022 }
5023
5024 const char *Exec =
5025 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5026 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5027}
5028
5029void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5030 const InputInfo &Output,
5031 const InputInfoList &Inputs,
5032 const ArgList &Args,
5033 const char *LinkingOutput) const {
5034 const Driver &D = getToolChain().getDriver();
5035 ArgStringList CmdArgs;
5036
5037 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5038 (!Args.hasArg(options::OPT_shared))) {
5039 CmdArgs.push_back("-e");
5040 CmdArgs.push_back("__start");
5041 }
5042
5043 if (Args.hasArg(options::OPT_static)) {
5044 CmdArgs.push_back("-Bstatic");
5045 } else {
5046 if (Args.hasArg(options::OPT_rdynamic))
5047 CmdArgs.push_back("-export-dynamic");
5048 CmdArgs.push_back("--eh-frame-hdr");
5049 CmdArgs.push_back("-Bdynamic");
5050 if (Args.hasArg(options::OPT_shared)) {
5051 CmdArgs.push_back("-shared");
5052 } else {
5053 CmdArgs.push_back("-dynamic-linker");
5054 CmdArgs.push_back("/usr/libexec/ld.so");
5055 }
5056 }
5057
5058 if (Output.isFilename()) {
5059 CmdArgs.push_back("-o");
5060 CmdArgs.push_back(Output.getFilename());
5061 } else {
5062 assert(Output.isNothing() && "Invalid output.");
5063 }
5064
5065 if (!Args.hasArg(options::OPT_nostdlib) &&
5066 !Args.hasArg(options::OPT_nostartfiles)) {
5067 if (!Args.hasArg(options::OPT_shared)) {
5068 if (Args.hasArg(options::OPT_pg))
5069 CmdArgs.push_back(Args.MakeArgString(
5070 getToolChain().GetFilePath("gcrt0.o")));
5071 else
5072 CmdArgs.push_back(Args.MakeArgString(
5073 getToolChain().GetFilePath("crt0.o")));
5074 CmdArgs.push_back(Args.MakeArgString(
5075 getToolChain().GetFilePath("crtbegin.o")));
5076 } else {
5077 CmdArgs.push_back(Args.MakeArgString(
5078 getToolChain().GetFilePath("crtbeginS.o")));
5079 }
5080 }
5081
5082 Args.AddAllArgs(CmdArgs, options::OPT_L);
5083 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5084 Args.AddAllArgs(CmdArgs, options::OPT_e);
5085
5086 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5087
5088 if (!Args.hasArg(options::OPT_nostdlib) &&
5089 !Args.hasArg(options::OPT_nodefaultlibs)) {
5090 if (D.CCCIsCXX) {
5091 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5092 if (Args.hasArg(options::OPT_pg))
5093 CmdArgs.push_back("-lm_p");
5094 else
5095 CmdArgs.push_back("-lm");
5096 }
5097
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005098 if (Args.hasArg(options::OPT_pthread)) {
5099 if (!Args.hasArg(options::OPT_shared) &&
5100 Args.hasArg(options::OPT_pg))
5101 CmdArgs.push_back("-lpthread_p");
5102 else
5103 CmdArgs.push_back("-lpthread");
5104 }
5105
Eli Friedman9fa28852012-08-08 23:57:20 +00005106 if (!Args.hasArg(options::OPT_shared)) {
5107 if (Args.hasArg(options::OPT_pg))
5108 CmdArgs.push_back("-lc_p");
5109 else
5110 CmdArgs.push_back("-lc");
5111 }
5112
5113 std::string myarch = "-lclang_rt.";
5114 const llvm::Triple &T = getToolChain().getTriple();
5115 llvm::Triple::ArchType Arch = T.getArch();
5116 switch (Arch) {
5117 case llvm::Triple::arm:
5118 myarch += ("arm");
5119 break;
5120 case llvm::Triple::x86:
5121 myarch += ("i386");
5122 break;
5123 case llvm::Triple::x86_64:
5124 myarch += ("amd64");
5125 break;
5126 default:
5127 assert(0 && "Unsupported architecture");
5128 }
5129 CmdArgs.push_back(Args.MakeArgString(myarch));
5130 }
5131
5132 if (!Args.hasArg(options::OPT_nostdlib) &&
5133 !Args.hasArg(options::OPT_nostartfiles)) {
5134 if (!Args.hasArg(options::OPT_shared))
5135 CmdArgs.push_back(Args.MakeArgString(
5136 getToolChain().GetFilePath("crtend.o")));
5137 else
5138 CmdArgs.push_back(Args.MakeArgString(
5139 getToolChain().GetFilePath("crtendS.o")));
5140 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005141
5142 const char *Exec =
5143 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5144 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005145}
5146
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005147void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005148 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005149 const InputInfoList &Inputs,
5150 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005151 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005152 ArgStringList CmdArgs;
5153
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005154 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5155 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005156 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005157 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005158 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005159 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005160 else if (getToolChain().getArch() == llvm::Triple::mips ||
5161 getToolChain().getArch() == llvm::Triple::mipsel ||
5162 getToolChain().getArch() == llvm::Triple::mips64 ||
5163 getToolChain().getArch() == llvm::Triple::mips64el) {
5164 StringRef CPUName;
5165 StringRef ABIName;
5166 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005167
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005168 CmdArgs.push_back("-march");
5169 CmdArgs.push_back(CPUName.data());
5170
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005171 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005172 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005173
5174 if (getToolChain().getArch() == llvm::Triple::mips ||
5175 getToolChain().getArch() == llvm::Triple::mips64)
5176 CmdArgs.push_back("-EB");
5177 else
5178 CmdArgs.push_back("-EL");
5179
5180 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5181 options::OPT_fpic, options::OPT_fno_pic,
5182 options::OPT_fPIE, options::OPT_fno_PIE,
5183 options::OPT_fpie, options::OPT_fno_pie);
5184 if (LastPICArg &&
5185 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5186 LastPICArg->getOption().matches(options::OPT_fpic) ||
5187 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5188 LastPICArg->getOption().matches(options::OPT_fpie))) {
5189 CmdArgs.push_back("-KPIC");
5190 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005191 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5192 getToolChain().getArch() == llvm::Triple::thumb) {
5193 CmdArgs.push_back("-mfpu=softvfp");
5194 switch(getToolChain().getTriple().getEnvironment()) {
5195 case llvm::Triple::GNUEABI:
5196 case llvm::Triple::EABI:
5197 break;
5198
5199 default:
5200 CmdArgs.push_back("-matpcs");
5201 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005202 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005203
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005204 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5205 options::OPT_Xassembler);
5206
5207 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005208 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005209
5210 for (InputInfoList::const_iterator
5211 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5212 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005213 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005214 }
5215
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005216 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005217 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005218 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005219}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005220
5221void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005222 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005223 const InputInfoList &Inputs,
5224 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005225 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005226 const toolchains::FreeBSD& ToolChain =
5227 static_cast<const toolchains::FreeBSD&>(getToolChain());
5228 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005229 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005230
5231 // Silence warning for "clang -g foo.o -o foo"
5232 Args.ClaimAllArgs(options::OPT_g_Group);
5233 // and "clang -emit-llvm foo.o -o foo"
5234 Args.ClaimAllArgs(options::OPT_emit_llvm);
5235 // and for "clang -w foo.o -o foo". Other warning options are already
5236 // handled somewhere else.
5237 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005238
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005239 if (!D.SysRoot.empty())
5240 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5241
Roman Divackyafe2f232012-08-28 15:09:03 +00005242 if (Args.hasArg(options::OPT_pie))
5243 CmdArgs.push_back("-pie");
5244
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005245 if (Args.hasArg(options::OPT_static)) {
5246 CmdArgs.push_back("-Bstatic");
5247 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005248 if (Args.hasArg(options::OPT_rdynamic))
5249 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005250 CmdArgs.push_back("--eh-frame-hdr");
5251 if (Args.hasArg(options::OPT_shared)) {
5252 CmdArgs.push_back("-Bshareable");
5253 } else {
5254 CmdArgs.push_back("-dynamic-linker");
5255 CmdArgs.push_back("/libexec/ld-elf.so.1");
5256 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005257 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5258 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005259 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5260 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5261 CmdArgs.push_back("--hash-style=both");
5262 }
5263 }
5264 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005265 }
5266
5267 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5268 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005269 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005270 CmdArgs.push_back("-m");
5271 CmdArgs.push_back("elf_i386_fbsd");
5272 }
5273
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005274 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005275 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005276 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005277 }
5278
Daniel Dunbarb440f562010-08-02 02:38:21 +00005279 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005280 CmdArgs.push_back("-o");
5281 CmdArgs.push_back(Output.getFilename());
5282 } else {
5283 assert(Output.isNothing() && "Invalid output.");
5284 }
5285
5286 if (!Args.hasArg(options::OPT_nostdlib) &&
5287 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005288 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005289 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005290 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005291 crt1 = "gcrt1.o";
5292 else if (Args.hasArg(options::OPT_pie))
5293 crt1 = "Scrt1.o";
5294 else
5295 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005296 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005297 if (crt1)
5298 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5299
5300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5301
5302 const char *crtbegin = NULL;
5303 if (Args.hasArg(options::OPT_static))
5304 crtbegin = "crtbeginT.o";
5305 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5306 crtbegin = "crtbeginS.o";
5307 else
5308 crtbegin = "crtbegin.o";
5309
5310 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005311 }
5312
5313 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005314 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005315 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5316 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005317 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005318 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5319 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005320 Args.AddAllArgs(CmdArgs, options::OPT_s);
5321 Args.AddAllArgs(CmdArgs, options::OPT_t);
5322 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5323 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005324
Roman Divackyafe2f232012-08-28 15:09:03 +00005325 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005326
5327 if (!Args.hasArg(options::OPT_nostdlib) &&
5328 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005329 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005330 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005331 if (Args.hasArg(options::OPT_pg))
5332 CmdArgs.push_back("-lm_p");
5333 else
5334 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005335 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005336 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5337 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005338 if (Args.hasArg(options::OPT_pg))
5339 CmdArgs.push_back("-lgcc_p");
5340 else
5341 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005342 if (Args.hasArg(options::OPT_static)) {
5343 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005344 } else if (Args.hasArg(options::OPT_pg)) {
5345 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005346 } else {
5347 CmdArgs.push_back("--as-needed");
5348 CmdArgs.push_back("-lgcc_s");
5349 CmdArgs.push_back("--no-as-needed");
5350 }
5351
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005352 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005353 if (Args.hasArg(options::OPT_pg))
5354 CmdArgs.push_back("-lpthread_p");
5355 else
5356 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005357 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005358
Roman Divacky66f22762011-02-10 16:59:40 +00005359 if (Args.hasArg(options::OPT_pg)) {
5360 if (Args.hasArg(options::OPT_shared))
5361 CmdArgs.push_back("-lc");
5362 else
5363 CmdArgs.push_back("-lc_p");
5364 CmdArgs.push_back("-lgcc_p");
5365 } else {
5366 CmdArgs.push_back("-lc");
5367 CmdArgs.push_back("-lgcc");
5368 }
5369
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005370 if (Args.hasArg(options::OPT_static)) {
5371 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005372 } else if (Args.hasArg(options::OPT_pg)) {
5373 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005374 } else {
5375 CmdArgs.push_back("--as-needed");
5376 CmdArgs.push_back("-lgcc_s");
5377 CmdArgs.push_back("--no-as-needed");
5378 }
5379 }
5380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005383 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005384 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005385 else
5386 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005387 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005388 }
5389
Roman Divackyafe2f232012-08-28 15:09:03 +00005390 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005391
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005392 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005393 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005394 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005395}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005396
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005397void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5398 const InputInfo &Output,
5399 const InputInfoList &Inputs,
5400 const ArgList &Args,
5401 const char *LinkingOutput) const {
5402 ArgStringList CmdArgs;
5403
5404 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5405 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005406 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005407 CmdArgs.push_back("--32");
5408
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005409 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005410 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005411 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005412 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005413 CmdArgs.push_back("-EL");
5414
5415 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5416 options::OPT_Xassembler);
5417
5418 CmdArgs.push_back("-o");
5419 CmdArgs.push_back(Output.getFilename());
5420
5421 for (InputInfoList::const_iterator
5422 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5423 const InputInfo &II = *it;
5424 CmdArgs.push_back(II.getFilename());
5425 }
5426
David Chisnallddbd68f2011-09-27 22:03:18 +00005427 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005428 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5429}
5430
5431void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5432 const InputInfo &Output,
5433 const InputInfoList &Inputs,
5434 const ArgList &Args,
5435 const char *LinkingOutput) const {
5436 const Driver &D = getToolChain().getDriver();
5437 ArgStringList CmdArgs;
5438
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005439 if (!D.SysRoot.empty())
5440 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5441
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005442 if (Args.hasArg(options::OPT_static)) {
5443 CmdArgs.push_back("-Bstatic");
5444 } else {
5445 if (Args.hasArg(options::OPT_rdynamic))
5446 CmdArgs.push_back("-export-dynamic");
5447 CmdArgs.push_back("--eh-frame-hdr");
5448 if (Args.hasArg(options::OPT_shared)) {
5449 CmdArgs.push_back("-Bshareable");
5450 } else {
5451 CmdArgs.push_back("-dynamic-linker");
5452 CmdArgs.push_back("/libexec/ld.elf_so");
5453 }
5454 }
5455
5456 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5457 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005458 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005459 CmdArgs.push_back("-m");
5460 CmdArgs.push_back("elf_i386");
5461 }
5462
5463 if (Output.isFilename()) {
5464 CmdArgs.push_back("-o");
5465 CmdArgs.push_back(Output.getFilename());
5466 } else {
5467 assert(Output.isNothing() && "Invalid output.");
5468 }
5469
5470 if (!Args.hasArg(options::OPT_nostdlib) &&
5471 !Args.hasArg(options::OPT_nostartfiles)) {
5472 if (!Args.hasArg(options::OPT_shared)) {
5473 CmdArgs.push_back(Args.MakeArgString(
5474 getToolChain().GetFilePath("crt0.o")));
5475 CmdArgs.push_back(Args.MakeArgString(
5476 getToolChain().GetFilePath("crti.o")));
5477 CmdArgs.push_back(Args.MakeArgString(
5478 getToolChain().GetFilePath("crtbegin.o")));
5479 } else {
5480 CmdArgs.push_back(Args.MakeArgString(
5481 getToolChain().GetFilePath("crti.o")));
5482 CmdArgs.push_back(Args.MakeArgString(
5483 getToolChain().GetFilePath("crtbeginS.o")));
5484 }
5485 }
5486
5487 Args.AddAllArgs(CmdArgs, options::OPT_L);
5488 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5489 Args.AddAllArgs(CmdArgs, options::OPT_e);
5490 Args.AddAllArgs(CmdArgs, options::OPT_s);
5491 Args.AddAllArgs(CmdArgs, options::OPT_t);
5492 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5493 Args.AddAllArgs(CmdArgs, options::OPT_r);
5494
5495 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5496
5497 if (!Args.hasArg(options::OPT_nostdlib) &&
5498 !Args.hasArg(options::OPT_nodefaultlibs)) {
5499 if (D.CCCIsCXX) {
5500 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5501 CmdArgs.push_back("-lm");
5502 }
5503 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5504 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005505 if (Args.hasArg(options::OPT_static)) {
5506 CmdArgs.push_back("-lgcc_eh");
5507 } else {
5508 CmdArgs.push_back("--as-needed");
5509 CmdArgs.push_back("-lgcc_s");
5510 CmdArgs.push_back("--no-as-needed");
5511 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005512 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005513
5514 if (Args.hasArg(options::OPT_pthread))
5515 CmdArgs.push_back("-lpthread");
5516 CmdArgs.push_back("-lc");
5517
5518 CmdArgs.push_back("-lgcc");
5519 if (Args.hasArg(options::OPT_static)) {
5520 CmdArgs.push_back("-lgcc_eh");
5521 } else {
5522 CmdArgs.push_back("--as-needed");
5523 CmdArgs.push_back("-lgcc_s");
5524 CmdArgs.push_back("--no-as-needed");
5525 }
5526 }
5527
5528 if (!Args.hasArg(options::OPT_nostdlib) &&
5529 !Args.hasArg(options::OPT_nostartfiles)) {
5530 if (!Args.hasArg(options::OPT_shared))
5531 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5532 "crtend.o")));
5533 else
5534 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5535 "crtendS.o")));
5536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5537 "crtn.o")));
5538 }
5539
Bill Wendling08760582011-06-27 19:15:03 +00005540 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005541
David Chisnallddbd68f2011-09-27 22:03:18 +00005542 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005543 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5544}
5545
Rafael Espindola92b00932010-08-10 00:25:48 +00005546void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5547 const InputInfo &Output,
5548 const InputInfoList &Inputs,
5549 const ArgList &Args,
5550 const char *LinkingOutput) const {
5551 ArgStringList CmdArgs;
5552
5553 // Add --32/--64 to make sure we get the format we want.
5554 // This is incomplete
5555 if (getToolChain().getArch() == llvm::Triple::x86) {
5556 CmdArgs.push_back("--32");
5557 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5558 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005559 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5560 CmdArgs.push_back("-a32");
5561 CmdArgs.push_back("-mppc");
5562 CmdArgs.push_back("-many");
5563 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5564 CmdArgs.push_back("-a64");
5565 CmdArgs.push_back("-mppc64");
5566 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005567 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005568 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005569 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5570 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005571
5572 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5573 getToolChain().getTriple());
5574 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005575
5576 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5577 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5578 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005579 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5580 getToolChain().getArch() == llvm::Triple::mipsel ||
5581 getToolChain().getArch() == llvm::Triple::mips64 ||
5582 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005583 StringRef CPUName;
5584 StringRef ABIName;
5585 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005586
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005587 CmdArgs.push_back("-march");
5588 CmdArgs.push_back(CPUName.data());
5589
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005590 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005591 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005592
5593 if (getToolChain().getArch() == llvm::Triple::mips ||
5594 getToolChain().getArch() == llvm::Triple::mips64)
5595 CmdArgs.push_back("-EB");
5596 else
5597 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005598
5599 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5600 options::OPT_fpic, options::OPT_fno_pic,
5601 options::OPT_fPIE, options::OPT_fno_PIE,
5602 options::OPT_fpie, options::OPT_fno_pie);
5603 if (LastPICArg &&
5604 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5605 LastPICArg->getOption().matches(options::OPT_fpic) ||
5606 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5607 LastPICArg->getOption().matches(options::OPT_fpie))) {
5608 CmdArgs.push_back("-KPIC");
5609 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005610 }
5611
5612 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5613 options::OPT_Xassembler);
5614
5615 CmdArgs.push_back("-o");
5616 CmdArgs.push_back(Output.getFilename());
5617
5618 for (InputInfoList::const_iterator
5619 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5620 const InputInfo &II = *it;
5621 CmdArgs.push_back(II.getFilename());
5622 }
5623
5624 const char *Exec =
5625 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5626 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5627}
5628
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005629static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5630 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005631 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien3d3373c2012-11-19 12:04:11 +00005632 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5633 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolacc354322011-10-17 21:39:04 +00005634 if (!D.CCCIsCXX)
5635 CmdArgs.push_back("-lgcc");
5636
Logan Chien3d3373c2012-11-19 12:04:11 +00005637 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005638 if (D.CCCIsCXX)
5639 CmdArgs.push_back("-lgcc");
5640 } else {
5641 if (!D.CCCIsCXX)
5642 CmdArgs.push_back("--as-needed");
5643 CmdArgs.push_back("-lgcc_s");
5644 if (!D.CCCIsCXX)
5645 CmdArgs.push_back("--no-as-needed");
5646 }
5647
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005648 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005649 CmdArgs.push_back("-lgcc_eh");
5650 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5651 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005652
5653 // According to Android ABI, we have to link with libdl if we are
5654 // linking with non-static libgcc.
5655 //
5656 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5657 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5658 if (isAndroid && !StaticLibgcc)
5659 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005660}
5661
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005662static bool hasMipsN32ABIArg(const ArgList &Args) {
5663 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005664 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005665}
5666
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005667void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5668 const InputInfo &Output,
5669 const InputInfoList &Inputs,
5670 const ArgList &Args,
5671 const char *LinkingOutput) const {
5672 const toolchains::Linux& ToolChain =
5673 static_cast<const toolchains::Linux&>(getToolChain());
5674 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005675 const bool isAndroid =
5676 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005677
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005678 ArgStringList CmdArgs;
5679
Rafael Espindolad1002f62010-11-15 18:28:16 +00005680 // Silence warning for "clang -g foo.o -o foo"
5681 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005682 // and "clang -emit-llvm foo.o -o foo"
5683 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005684 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005685 // handled somewhere else.
5686 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005687
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005688 if (!D.SysRoot.empty())
5689 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005690
Peter Collingbourne24c67c62013-01-17 20:17:16 +00005691 if (Args.hasArg(options::OPT_pie) && !Args.hasArg(options::OPT_shared))
Rafael Espindolad47ac232010-11-17 22:26:15 +00005692 CmdArgs.push_back("-pie");
5693
Rafael Espindola1c76c592010-11-07 22:57:16 +00005694 if (Args.hasArg(options::OPT_rdynamic))
5695 CmdArgs.push_back("-export-dynamic");
5696
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005697 if (Args.hasArg(options::OPT_s))
5698 CmdArgs.push_back("-s");
5699
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005700 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5701 e = ToolChain.ExtraOpts.end();
5702 i != e; ++i)
5703 CmdArgs.push_back(i->c_str());
5704
5705 if (!Args.hasArg(options::OPT_static)) {
5706 CmdArgs.push_back("--eh-frame-hdr");
5707 }
5708
5709 CmdArgs.push_back("-m");
5710 if (ToolChain.getArch() == llvm::Triple::x86)
5711 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005712 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5713 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005714 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005715 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005716 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005717 else if (ToolChain.getArch() == llvm::Triple::ppc)
5718 CmdArgs.push_back("elf32ppclinux");
5719 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5720 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005721 else if (ToolChain.getArch() == llvm::Triple::mips)
5722 CmdArgs.push_back("elf32btsmip");
5723 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5724 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005725 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5726 if (hasMipsN32ABIArg(Args))
5727 CmdArgs.push_back("elf32btsmipn32");
5728 else
5729 CmdArgs.push_back("elf64btsmip");
5730 }
5731 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5732 if (hasMipsN32ABIArg(Args))
5733 CmdArgs.push_back("elf32ltsmipn32");
5734 else
5735 CmdArgs.push_back("elf64ltsmip");
5736 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005737 else
5738 CmdArgs.push_back("elf_x86_64");
5739
5740 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005741 if (ToolChain.getArch() == llvm::Triple::arm
5742 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005743 CmdArgs.push_back("-Bstatic");
5744 else
5745 CmdArgs.push_back("-static");
5746 } else if (Args.hasArg(options::OPT_shared)) {
5747 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005748 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005749 CmdArgs.push_back("-Bsymbolic");
5750 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005751 }
5752
5753 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005754 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005755 (!Args.hasArg(options::OPT_static) &&
5756 !Args.hasArg(options::OPT_shared))) {
5757 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005758 if (isAndroid)
5759 CmdArgs.push_back("/system/bin/linker");
5760 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005761 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005762 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5763 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005764 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005765 ToolChain.getArch() == llvm::Triple::thumb) {
5766 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5767 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5768 else
5769 CmdArgs.push_back("/lib/ld-linux.so.3");
5770 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005771 else if (ToolChain.getArch() == llvm::Triple::mips ||
5772 ToolChain.getArch() == llvm::Triple::mipsel)
5773 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005774 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005775 ToolChain.getArch() == llvm::Triple::mips64el) {
5776 if (hasMipsN32ABIArg(Args))
5777 CmdArgs.push_back("/lib32/ld.so.1");
5778 else
5779 CmdArgs.push_back("/lib64/ld.so.1");
5780 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005781 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005782 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005783 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005784 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005785 else
5786 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5787 }
5788
5789 CmdArgs.push_back("-o");
5790 CmdArgs.push_back(Output.getFilename());
5791
Rafael Espindola81937ec2010-12-01 01:52:43 +00005792 if (!Args.hasArg(options::OPT_nostdlib) &&
5793 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005794 if (!isAndroid) {
5795 const char *crt1 = NULL;
5796 if (!Args.hasArg(options::OPT_shared)){
5797 if (Args.hasArg(options::OPT_pie))
5798 crt1 = "Scrt1.o";
5799 else
5800 crt1 = "crt1.o";
5801 }
5802 if (crt1)
5803 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005804
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005805 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5806 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005807
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005808 const char *crtbegin;
5809 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005810 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005811 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005812 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005813 else if (Args.hasArg(options::OPT_pie))
5814 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005815 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005816 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005817 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005818
5819 // Add crtfastmath.o if available and fast math is enabled.
5820 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005821 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005822
5823 Args.AddAllArgs(CmdArgs, options::OPT_L);
5824
5825 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5826
Roman Divackyee8188a2011-03-01 17:53:14 +00005827 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5828 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005829 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005830
Rafael Espindola9446d762012-04-09 23:53:34 +00005831 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5832 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5833 // forward.
5834 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5835 CmdArgs.push_back("-plugin");
5836 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5837 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00005838
5839 // Try to pass driver level flags relevant to LTO code generation down to
5840 // the plugin.
5841
5842 // Handle architecture-specific flags for selecting CPU variants.
5843 if (ToolChain.getArch() == llvm::Triple::x86 ||
5844 ToolChain.getArch() == llvm::Triple::x86_64)
5845 CmdArgs.push_back(
5846 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5847 getX86TargetCPU(Args, ToolChain.getTriple())));
5848 else if (ToolChain.getArch() == llvm::Triple::arm ||
5849 ToolChain.getArch() == llvm::Triple::thumb)
5850 CmdArgs.push_back(
5851 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
5852 getARMTargetCPU(Args, ToolChain.getTriple())));
5853
5854 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
5855 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00005856 }
5857
Chandler Carruth953fb082013-01-13 11:46:33 +00005858
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005859 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5860 CmdArgs.push_back("--no-demangle");
5861
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005862 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5863
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005864 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005865
Eric Christopher04997782012-11-29 18:51:05 +00005866 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005867 if (Sanitize.needsUbsanRt())
5868 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Eric Christopher04997782012-11-29 18:51:05 +00005869 if (Sanitize.needsAsanRt())
5870 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5871 if (Sanitize.needsTsanRt())
5872 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00005873 if (Sanitize.needsMsanRt())
5874 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005875
Chandler Carruth94a32012012-05-14 18:31:18 +00005876 if (D.CCCIsCXX &&
5877 !Args.hasArg(options::OPT_nostdlib) &&
5878 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005879 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5880 !Args.hasArg(options::OPT_static);
5881 if (OnlyLibstdcxxStatic)
5882 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005883 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005884 if (OnlyLibstdcxxStatic)
5885 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005886 CmdArgs.push_back("-lm");
5887 }
5888
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005889 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005890 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5891 if (Args.hasArg(options::OPT_static))
5892 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005893
Chandler Carruth01538002013-01-17 13:19:29 +00005894 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
5895 if (OpenMP) {
5896 CmdArgs.push_back("-lgomp");
5897
5898 // FIXME: Exclude this for platforms whith libgomp that doesn't require
5899 // librt. Most modern Linux platfroms require it, but some may not.
5900 CmdArgs.push_back("-lrt");
5901 }
5902
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005903 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005904
Chandler Carruth94a32012012-05-14 18:31:18 +00005905 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00005906 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00005907 CmdArgs.push_back("-lpthread");
5908
5909 CmdArgs.push_back("-lc");
5910
5911 if (Args.hasArg(options::OPT_static))
5912 CmdArgs.push_back("--end-group");
5913 else
5914 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5915 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005916
Rafael Espindola81937ec2010-12-01 01:52:43 +00005917 if (!Args.hasArg(options::OPT_nostartfiles)) {
5918 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005919 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005920 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005921 else if (Args.hasArg(options::OPT_pie))
5922 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005923 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005924 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005925
Rafael Espindola81937ec2010-12-01 01:52:43 +00005926 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005927 if (!isAndroid)
5928 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005929 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005930 }
5931
Bill Wendling08760582011-06-27 19:15:03 +00005932 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005933
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005934 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5935}
Rafael Espindola92b00932010-08-10 00:25:48 +00005936
Chris Lattner3e2ee142010-07-07 16:01:42 +00005937void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005938 const InputInfo &Output,
5939 const InputInfoList &Inputs,
5940 const ArgList &Args,
5941 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005942 ArgStringList CmdArgs;
5943
5944 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5945 options::OPT_Xassembler);
5946
5947 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005948 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005949
5950 for (InputInfoList::const_iterator
5951 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5952 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005953 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005954 }
5955
5956 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005957 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005958 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005959}
5960
5961void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005962 const InputInfo &Output,
5963 const InputInfoList &Inputs,
5964 const ArgList &Args,
5965 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005966 const Driver &D = getToolChain().getDriver();
5967 ArgStringList CmdArgs;
5968
Daniel Dunbarb440f562010-08-02 02:38:21 +00005969 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005970 CmdArgs.push_back("-o");
5971 CmdArgs.push_back(Output.getFilename());
5972 } else {
5973 assert(Output.isNothing() && "Invalid output.");
5974 }
5975
5976 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005977 !Args.hasArg(options::OPT_nostartfiles)) {
5978 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5979 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5980 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5981 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5982 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005983
5984 Args.AddAllArgs(CmdArgs, options::OPT_L);
5985 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5986 Args.AddAllArgs(CmdArgs, options::OPT_e);
5987
Daniel Dunbar54423b22010-09-17 00:24:54 +00005988 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005989
Eli Friedman83de5132011-12-08 23:54:21 +00005990 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5991
Chris Lattner3e2ee142010-07-07 16:01:42 +00005992 if (!Args.hasArg(options::OPT_nostdlib) &&
5993 !Args.hasArg(options::OPT_nodefaultlibs)) {
5994 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005995 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005996 CmdArgs.push_back("-lm");
5997 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005998 }
5999
6000 if (!Args.hasArg(options::OPT_nostdlib) &&
6001 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006002 if (Args.hasArg(options::OPT_pthread))
6003 CmdArgs.push_back("-lpthread");
6004 CmdArgs.push_back("-lc");
6005 CmdArgs.push_back("-lCompilerRT-Generic");
6006 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6007 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006008 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006009 }
6010
Eli Friedman83de5132011-12-08 23:54:21 +00006011 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006012 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006013}
6014
Daniel Dunbarcc912342009-05-02 18:28:39 +00006015/// DragonFly Tools
6016
6017// For now, DragonFly Assemble does just about the same as for
6018// FreeBSD, but this may change soon.
6019void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006020 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006021 const InputInfoList &Inputs,
6022 const ArgList &Args,
6023 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006024 ArgStringList CmdArgs;
6025
6026 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6027 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006028 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006029 CmdArgs.push_back("--32");
6030
6031 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6032 options::OPT_Xassembler);
6033
6034 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006035 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006036
6037 for (InputInfoList::const_iterator
6038 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6039 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006040 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006041 }
6042
6043 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006044 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006045 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006046}
6047
6048void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006049 const InputInfo &Output,
6050 const InputInfoList &Inputs,
6051 const ArgList &Args,
6052 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006053 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006054 ArgStringList CmdArgs;
6055
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006056 if (!D.SysRoot.empty())
6057 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6058
Daniel Dunbarcc912342009-05-02 18:28:39 +00006059 if (Args.hasArg(options::OPT_static)) {
6060 CmdArgs.push_back("-Bstatic");
6061 } else {
6062 if (Args.hasArg(options::OPT_shared))
6063 CmdArgs.push_back("-Bshareable");
6064 else {
6065 CmdArgs.push_back("-dynamic-linker");
6066 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6067 }
6068 }
6069
6070 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6071 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006072 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006073 CmdArgs.push_back("-m");
6074 CmdArgs.push_back("elf_i386");
6075 }
6076
Daniel Dunbarb440f562010-08-02 02:38:21 +00006077 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006078 CmdArgs.push_back("-o");
6079 CmdArgs.push_back(Output.getFilename());
6080 } else {
6081 assert(Output.isNothing() && "Invalid output.");
6082 }
6083
6084 if (!Args.hasArg(options::OPT_nostdlib) &&
6085 !Args.hasArg(options::OPT_nostartfiles)) {
6086 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006087 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006088 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006089 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006090 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006091 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006092 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006093 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006094 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006095 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006096 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006097 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006098 }
6099 }
6100
6101 Args.AddAllArgs(CmdArgs, options::OPT_L);
6102 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6103 Args.AddAllArgs(CmdArgs, options::OPT_e);
6104
Daniel Dunbar54423b22010-09-17 00:24:54 +00006105 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006106
6107 if (!Args.hasArg(options::OPT_nostdlib) &&
6108 !Args.hasArg(options::OPT_nodefaultlibs)) {
6109 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6110 // rpaths
6111 CmdArgs.push_back("-L/usr/lib/gcc41");
6112
6113 if (!Args.hasArg(options::OPT_static)) {
6114 CmdArgs.push_back("-rpath");
6115 CmdArgs.push_back("/usr/lib/gcc41");
6116
6117 CmdArgs.push_back("-rpath-link");
6118 CmdArgs.push_back("/usr/lib/gcc41");
6119
6120 CmdArgs.push_back("-rpath");
6121 CmdArgs.push_back("/usr/lib");
6122
6123 CmdArgs.push_back("-rpath-link");
6124 CmdArgs.push_back("/usr/lib");
6125 }
6126
Rafael Espindola38360b32010-07-20 12:59:03 +00006127 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006128 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006129 CmdArgs.push_back("-lm");
6130 }
6131
Daniel Dunbarcc912342009-05-02 18:28:39 +00006132 if (Args.hasArg(options::OPT_shared)) {
6133 CmdArgs.push_back("-lgcc_pic");
6134 } else {
6135 CmdArgs.push_back("-lgcc");
6136 }
6137
6138
6139 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006140 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006141
6142 if (!Args.hasArg(options::OPT_nolibc)) {
6143 CmdArgs.push_back("-lc");
6144 }
6145
6146 if (Args.hasArg(options::OPT_shared)) {
6147 CmdArgs.push_back("-lgcc_pic");
6148 } else {
6149 CmdArgs.push_back("-lgcc");
6150 }
6151 }
6152
6153 if (!Args.hasArg(options::OPT_nostdlib) &&
6154 !Args.hasArg(options::OPT_nostartfiles)) {
6155 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006156 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006157 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006158 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006159 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006160 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006161 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006162 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006163 }
6164
Bill Wendling08760582011-06-27 19:15:03 +00006165 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006166
Daniel Dunbarcc912342009-05-02 18:28:39 +00006167 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006168 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006169 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006170}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006171
6172void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6173 const InputInfo &Output,
6174 const InputInfoList &Inputs,
6175 const ArgList &Args,
6176 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006177 ArgStringList CmdArgs;
6178
6179 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006180 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6181 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006182 } else {
6183 assert(Output.isNothing() && "Invalid output.");
6184 }
6185
6186 if (!Args.hasArg(options::OPT_nostdlib) &&
6187 !Args.hasArg(options::OPT_nostartfiles)) {
6188 CmdArgs.push_back("-defaultlib:libcmt");
6189 }
6190
6191 CmdArgs.push_back("-nologo");
6192
Michael J. Spencere2f49362012-06-18 16:56:04 +00006193 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6194
6195 // Add filenames immediately.
6196 for (InputInfoList::const_iterator
6197 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6198 if (it->isFilename())
6199 CmdArgs.push_back(it->getFilename());
6200 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006201
6202 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006203 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006204 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6205}