blob: 92c96b25c9553f70491ae56219348fdba8276707 [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"
11
Daniel Dunbara2aedc62009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall5fb5df92012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCall31168b02011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Alexey Samsonov627b10f2012-11-06 15:09:03 +000036#include "SanitizerArgs.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000037#include "ToolChains.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000038
Daniel Dunbar1a093d22009-03-18 06:00:36 +000039using namespace clang::driver;
40using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042
Daniel Dunbar64198ef2009-09-10 01:21:05 +000043/// CheckPreprocessingOptions - Perform some validation of preprocessing
44/// arguments that is shared with gcc.
45static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
46 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000047 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000048 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000049 << A->getAsString(Args) << "-E";
50}
51
Daniel Dunbar4eadb602009-09-10 01:21:12 +000052/// CheckCodeGenerationOptions - Perform some validation of code generation
53/// arguments that is shared with gcc.
54static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
55 // In gcc, only ARM checks this, but it seems reasonable to check universally.
56 if (Args.hasArg(options::OPT_static))
57 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
58 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000059 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000060 << A->getAsString(Args) << "-static";
61}
62
Chris Lattnerbf2803f2010-03-29 17:55:58 +000063// Quote target names for inclusion in GNU Make dependency files.
64// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000065static void QuoteTarget(StringRef Target,
66 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000067 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
68 switch (Target[i]) {
69 case ' ':
70 case '\t':
71 // Escape the preceding backslashes
72 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
73 Res.push_back('\\');
74
75 // Escape the space/tab
76 Res.push_back('\\');
77 break;
78 case '$':
79 Res.push_back('$');
80 break;
81 case '#':
82 Res.push_back('\\');
83 break;
84 default:
85 break;
86 }
87
88 Res.push_back(Target[i]);
89 }
90}
91
Bill Wendlingc0938f32012-03-12 22:10:06 +000092static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000093 ArgStringList &CmdArgs,
94 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000095 const char *EnvVar) {
96 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +000097 bool CombinedArg = false;
98
Bill Wendling281ca292012-03-12 21:22:35 +000099 if (!DirList)
100 return; // Nothing to do.
101
Chad Rosier616e8a52012-10-30 21:42:09 +0000102 StringRef Name(ArgName);
103 if (Name.equals("-I") || Name.equals("-L"))
104 CombinedArg = true;
105
Bill Wendling281ca292012-03-12 21:22:35 +0000106 StringRef Dirs(DirList);
107 if (Dirs.empty()) // Empty string should not add '.'.
108 return;
109
110 StringRef::size_type Delim;
111 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
112 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000113 if (CombinedArg) {
114 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
115 } else {
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 }
Bill Wendling281ca292012-03-12 21:22:35 +0000119 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000120 if (CombinedArg) {
121 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
122 } else {
123 CmdArgs.push_back(ArgName);
124 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
125 }
Bill Wendling281ca292012-03-12 21:22:35 +0000126 }
Nico Weber89355782012-03-19 15:00:03 +0000127 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000128 }
129
130 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000131 if (CombinedArg) {
132 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
133 } else {
134 CmdArgs.push_back(ArgName);
135 CmdArgs.push_back(".");
136 }
Bill Wendling281ca292012-03-12 21:22:35 +0000137 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000138 if (CombinedArg) {
139 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
140 } else {
141 CmdArgs.push_back(ArgName);
142 CmdArgs.push_back(Args.MakeArgString(Dirs));
143 }
Bill Wendling281ca292012-03-12 21:22:35 +0000144 }
145}
146
Daniel Dunbar54423b22010-09-17 00:24:54 +0000147static void AddLinkerInputs(const ToolChain &TC,
148 const InputInfoList &Inputs, const ArgList &Args,
149 ArgStringList &CmdArgs) {
150 const Driver &D = TC.getDriver();
151
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000152 // Add extra linker input arguments which are not treated as inputs
153 // (constructed via -Xarch_).
154 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
155
Daniel Dunbar54423b22010-09-17 00:24:54 +0000156 for (InputInfoList::const_iterator
157 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
158 const InputInfo &II = *it;
159
160 if (!TC.HasNativeLLVMSupport()) {
161 // Don't try to pass LLVM inputs unless we have native support.
162 if (II.getType() == types::TY_LLVM_IR ||
163 II.getType() == types::TY_LTO_IR ||
164 II.getType() == types::TY_LLVM_BC ||
165 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000166 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167 << TC.getTripleString();
168 }
169
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000170 // Add filenames immediately.
171 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000172 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000173 continue;
174 }
175
176 // Otherwise, this is a linker input argument.
177 const Arg &A = II.getInputArg();
178
179 // Handle reserved library options.
180 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000181 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000182 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
183 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000184 } else
185 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000186 }
Bill Wendling281ca292012-03-12 21:22:35 +0000187
188 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000189 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000190}
191
John McCall31168b02011-06-15 23:02:42 +0000192/// \brief Determine whether Objective-C automated reference counting is
193/// enabled.
194static bool isObjCAutoRefCount(const ArgList &Args) {
195 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
196}
197
Ted Kremeneke65b0862012-03-06 20:05:56 +0000198/// \brief Determine whether we are linking the ObjC runtime.
199static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000200 if (isObjCAutoRefCount(Args)) {
201 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000202 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000203 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000204 return Args.hasArg(options::OPT_fobjc_link_runtime);
205}
206
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000207static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000208 ArgStringList &CmdArgs,
209 llvm::Triple Triple) {
210 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
211 Args.hasArg(options::OPT_fprofile_generate) ||
212 Args.hasArg(options::OPT_fcreate_profile) ||
213 Args.hasArg(options::OPT_coverage)))
214 return;
215
216 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
217 // the link line. We cannot do the same thing because unlike gcov there is a
218 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
219 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000220 std::string ProfileRT =
221 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000222
Bill Wendling08760582011-06-27 19:15:03 +0000223 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000224}
225
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000226static bool forwardToGCC(const Option &O) {
227 return !O.hasFlag(options::NoForward) &&
228 !O.hasFlag(options::DriverOption) &&
229 !O.hasFlag(options::LinkerInput);
230}
231
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000232void Clang::AddPreprocessingOptions(Compilation &C,
233 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000234 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000235 ArgStringList &CmdArgs,
236 const InputInfo &Output,
237 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000239
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000240 CheckPreprocessingOptions(D, Args);
241
242 Args.AddLastArg(CmdArgs, options::OPT_C);
243 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000244
245 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000246 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000247 (A = Args.getLastArg(options::OPT_MD)) ||
248 (A = Args.getLastArg(options::OPT_MMD))) {
249 // Determine the output location.
250 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000251 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000252 DepFile = MF->getValue();
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000253 C.addFailureResultFile(DepFile);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000254 } else if (Output.getType() == types::TY_Dependencies) {
255 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000256 } else if (A->getOption().matches(options::OPT_M) ||
257 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000258 DepFile = "-";
259 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000260 DepFile = getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000261 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000262 }
263 CmdArgs.push_back("-dependency-file");
264 CmdArgs.push_back(DepFile);
265
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000266 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
268 const char *DepTarget;
269
270 // If user provided -o, that is the dependency target, except
271 // when we are only generating a dependency file.
272 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
273 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000274 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 } else {
276 // Otherwise derive from the base input.
277 //
278 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000279 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000280 llvm::sys::path::replace_extension(P, "o");
281 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 }
283
284 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000285 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 QuoteTarget(DepTarget, Quoted);
287 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 }
289
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000290 if (A->getOption().matches(options::OPT_M) ||
291 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000292 CmdArgs.push_back("-sys-header-deps");
293 }
294
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000295 if (Args.hasArg(options::OPT_MG)) {
296 if (!A || A->getOption().matches(options::OPT_MD) ||
297 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000298 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000299 CmdArgs.push_back("-MG");
300 }
301
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000302 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000303
304 // Convert all -MQ <target> args to -MT <quoted target>
305 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
306 options::OPT_MQ),
307 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000308 const Arg *A = *it;
309 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000310
Daniel Dunbara442fd52010-06-11 22:00:13 +0000311 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000312 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000313 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000314 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000315 CmdArgs.push_back(Args.MakeArgString(Quoted));
316
317 // -MT flag - no change
318 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000319 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 }
321 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 // Add -i* options, and automatically translate to
324 // -include-pch/-include-pth for transparent PCH support. It's
325 // wonky, but we include looking for .gch so we can support seamless
326 // replacement into a build system already set up to be generating
327 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000328 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000329 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
330 ie = Args.filtered_end(); it != ie; ++it) {
331 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332
333 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000334 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
335 RenderedImplicitInclude = true;
336
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000337 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000338 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000339
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000340 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000341 bool FoundPCH = false;
Richard Smithbd55daf2012-11-01 04:30:05 +0000342 llvm::sys::Path P(A->getValue());
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000343 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000344 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000345 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000346 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000347 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000348 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000349 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000350 }
351
Douglas Gregor111af7d2009-04-18 00:34:01 +0000352 if (!FoundPCH) {
353 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000354 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000355 FoundPTH = true;
356 else
357 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000358 }
359
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 if (!FoundPCH && !FoundPTH) {
361 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000362 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000363 FoundPCH = UsePCH;
364 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 }
Mike Stump11289f42009-09-09 15:08:12 +0000366 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000367 P.eraseSuffix();
368 }
369
370 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 if (IsFirstImplicitInclude) {
372 A->claim();
373 if (UsePCH)
374 CmdArgs.push_back("-include-pch");
375 else
376 CmdArgs.push_back("-include-pth");
377 CmdArgs.push_back(Args.MakeArgString(P.str()));
378 continue;
379 } else {
380 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000381 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000382 << P.str() << A->getAsString(Args);
383 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000384 }
385 }
386
387 // Not translated, render as usual.
388 A->claim();
389 A->render(Args, CmdArgs);
390 }
391
392 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000393 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
394 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000395
396 // Add -Wp, and -Xassembler if using the preprocessor.
397
398 // FIXME: There is a very unfortunate problem here, some troubled
399 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
400 // really support that we would have to parse and then translate
401 // those options. :(
402 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
403 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000404
405 // -I- is a deprecated GCC feature, reject it.
406 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000407 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000408
409 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
410 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000411 StringRef sysroot = C.getSysRoot();
412 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000413 if (!Args.hasArg(options::OPT_isysroot)) {
414 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000415 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000416 }
417 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000418
419 // If a module path was provided, pass it along. Otherwise, use a temporary
420 // directory.
421 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000422 A->claim();
423 A->render(Args, CmdArgs);
424 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000425 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000426 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
427 DefaultModuleCache);
428 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
429 CmdArgs.push_back("-fmodule-cache-path");
430 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
431 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000432
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000433 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000434 // FIXME: We should probably sink the logic for handling these from the
435 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000436 // CPATH - included following the user specified includes (but prior to
437 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000438 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000439 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000440 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000441 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000442 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000443 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000444 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000445 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000446 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000447
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000448 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000449 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000450 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000451
452 // Add system include arguments.
453 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000454}
455
Daniel Dunbarf492c922009-09-10 22:59:51 +0000456/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000457/// CPU.
458//
459// FIXME: This is redundant with -mcpu, why does LLVM use this.
460// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000461static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000462 return llvm::StringSwitch<const char *>(CPU)
463 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
464 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
465 .Cases("arm920", "arm920t", "arm922t", "v4t")
466 .Cases("arm940t", "ep9312","v4t")
467 .Cases("arm10tdmi", "arm1020t", "v5")
468 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
469 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
470 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
471 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
472 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
473 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Quentin Colombet2e9952e2012-11-29 23:15:27 +0000474 .Cases("cortex-a5", "cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000475 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000476 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000477 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000478 .Case("cortex-a9-mp", "v7f")
479 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000480 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000481}
482
Benjamin Kramer09811c72012-06-26 22:20:06 +0000483/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
484//
485// FIXME: tblgen this.
486static std::string getARMTargetCPU(const ArgList &Args,
487 const llvm::Triple &Triple) {
488 // FIXME: Warn on inconsistent use of -mcpu and -march.
489
490 // If we have -mcpu=, use that.
491 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000492 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000493 // Handle -mcpu=native.
494 if (MCPU == "native")
495 return llvm::sys::getHostCPUName();
496 else
497 return MCPU;
498 }
499
500 StringRef MArch;
501 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
502 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000503 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000504 } else {
505 // Otherwise, use the Arch from the triple.
506 MArch = Triple.getArchName();
507 }
508
509 // Handle -march=native.
510 std::string NativeMArch;
511 if (MArch == "native") {
512 std::string CPU = llvm::sys::getHostCPUName();
513 if (CPU != "generic") {
514 // Translate the native cpu into the architecture. The switch below will
515 // then chose the minimum cpu for that arch.
516 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
517 MArch = NativeMArch;
518 }
519 }
520
521 return llvm::StringSwitch<const char *>(MArch)
522 .Cases("armv2", "armv2a","arm2")
523 .Case("armv3", "arm6")
524 .Case("armv3m", "arm7m")
525 .Cases("armv4", "armv4t", "arm7tdmi")
526 .Cases("armv5", "armv5t", "arm10tdmi")
527 .Cases("armv5e", "armv5te", "arm1022e")
528 .Case("armv5tej", "arm926ej-s")
529 .Cases("armv6", "armv6k", "arm1136jf-s")
530 .Case("armv6j", "arm1136j-s")
531 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
532 .Case("armv6t2", "arm1156t2-s")
533 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000534 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
535 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000536 .Cases("armv7r", "armv7-r", "cortex-r4")
537 .Cases("armv7m", "armv7-m", "cortex-m3")
538 .Case("ep9312", "ep9312")
539 .Case("iwmmxt", "iwmmxt")
540 .Case("xscale", "xscale")
541 .Cases("armv6m", "armv6-m", "cortex-m0")
542 // If all else failed, return the most base CPU LLVM supports.
543 .Default("arm7tdmi");
544}
545
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000546// FIXME: Move to target hook.
547static bool isSignedCharDefault(const llvm::Triple &Triple) {
548 switch (Triple.getArch()) {
549 default:
550 return true;
551
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000552 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000553 case llvm::Triple::ppc:
554 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000555 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000556 return true;
557 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000558 }
559}
560
Chad Rosiercfbfc582012-04-04 20:51:35 +0000561// Handle -mfpu=.
562//
563// FIXME: Centralize feature selection, defaulting shouldn't be also in the
564// frontend target.
565static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
566 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000567 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000568
569 // Set the target features based on the FPU.
570 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
571 // Disable any default FPU support.
572 CmdArgs.push_back("-target-feature");
573 CmdArgs.push_back("-vfp2");
574 CmdArgs.push_back("-target-feature");
575 CmdArgs.push_back("-vfp3");
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("-neon");
578 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
579 CmdArgs.push_back("-target-feature");
580 CmdArgs.push_back("+vfp3");
581 CmdArgs.push_back("-target-feature");
582 CmdArgs.push_back("+d16");
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("-neon");
585 } else if (FPU == "vfp") {
586 CmdArgs.push_back("-target-feature");
587 CmdArgs.push_back("+vfp2");
588 CmdArgs.push_back("-target-feature");
589 CmdArgs.push_back("-neon");
590 } else if (FPU == "vfp3" || FPU == "vfpv3") {
591 CmdArgs.push_back("-target-feature");
592 CmdArgs.push_back("+vfp3");
593 CmdArgs.push_back("-target-feature");
594 CmdArgs.push_back("-neon");
595 } else if (FPU == "neon") {
596 CmdArgs.push_back("-target-feature");
597 CmdArgs.push_back("+neon");
598 } else
599 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
600}
601
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000602// Handle -mfpmath=.
603static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000604 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000605 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000606
607 // Set the target features based on the FPMath.
608 if (FPMath == "neon") {
609 CmdArgs.push_back("-target-feature");
610 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000611
Silviu Baranga157f7c62012-09-13 15:06:00 +0000612 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
Quentin Colombet2e9952e2012-11-29 23:15:27 +0000613 CPU != "cortex-a15" && CPU != "cortex-a5")
Chad Rosier45619cb2012-04-04 22:13:40 +0000614 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
615
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000616 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
617 FPMath == "vfp4") {
618 CmdArgs.push_back("-target-feature");
619 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000620
621 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000622 } else
623 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
624}
625
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000626// Select the float ABI as determined by -msoft-float, -mhard-float, and
627// -mfloat-abi=.
628static StringRef getARMFloatABI(const Driver &D,
629 const ArgList &Args,
630 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000631 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000632 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
633 options::OPT_mhard_float,
634 options::OPT_mfloat_abi_EQ)) {
635 if (A->getOption().matches(options::OPT_msoft_float))
636 FloatABI = "soft";
637 else if (A->getOption().matches(options::OPT_mhard_float))
638 FloatABI = "hard";
639 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000640 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000641 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000642 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000643 << A->getAsString(Args);
644 FloatABI = "soft";
645 }
646 }
647 }
648
649 // If unspecified, choose the default based on the platform.
650 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000651 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000652 case llvm::Triple::Darwin:
653 case llvm::Triple::MacOSX:
654 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000655 // Darwin defaults to "softfp" for v6 and v7.
656 //
657 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000658 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000659 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000660 if (StringRef(ArchName).startswith("v6") ||
661 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 FloatABI = "softfp";
663 else
664 FloatABI = "soft";
665 break;
666 }
667
668 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000669 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000670 case llvm::Triple::GNUEABIHF:
671 FloatABI = "hard";
672 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000673 case llvm::Triple::GNUEABI:
674 FloatABI = "softfp";
675 break;
676 case llvm::Triple::EABI:
677 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
678 FloatABI = "softfp";
679 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000680 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000681 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000682 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000683 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000684 FloatABI = "softfp";
685 else
686 FloatABI = "soft";
687 break;
688 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000689 default:
690 // Assume "soft", but warn the user we are guessing.
691 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000692 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000693 break;
694 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000695 }
696 }
697
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000698 return FloatABI;
699}
700
701
702void Clang::AddARMTargetArgs(const ArgList &Args,
703 ArgStringList &CmdArgs,
704 bool KernelOrKext) const {
705 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000706 // Get the effective triple, which takes into account the deployment target.
707 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
708 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000709 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000710
711 // Select the ABI to use.
712 //
713 // FIXME: Support -meabi.
714 const char *ABIName = 0;
715 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000716 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000717 } else if (Triple.isOSDarwin()) {
718 // The backend is hardwired to assume AAPCS for M-class processors, ensure
719 // the frontend matches that.
720 if (StringRef(CPUName).startswith("cortex-m")) {
721 ABIName = "aapcs";
722 } else {
723 ABIName = "apcs-gnu";
724 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000725 } else {
726 // Select the default based on the platform.
727 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000728 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000729 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000730 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000731 ABIName = "aapcs-linux";
732 break;
733 case llvm::Triple::EABI:
734 ABIName = "aapcs";
735 break;
736 default:
737 ABIName = "apcs-gnu";
738 }
739 }
740 CmdArgs.push_back("-target-abi");
741 CmdArgs.push_back(ABIName);
742
743 // Set the CPU based on -march= and -mcpu=.
744 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000745 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000746
747 // Determine floating point ABI from the options & target defaults.
748 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000749 if (FloatABI == "soft") {
750 // Floating point operations and argument passing are soft.
751 //
752 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000753 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000754 CmdArgs.push_back("-mfloat-abi");
755 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000756 } else if (FloatABI == "softfp") {
757 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000758 CmdArgs.push_back("-mfloat-abi");
759 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000760 } else {
761 // Floating point operations and argument passing are hard.
762 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000763 CmdArgs.push_back("-mfloat-abi");
764 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000765 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000766
767 // Set appropriate target features for floating point mode.
768 //
769 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
770 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
771 // stripped out by the ARM target.
772
773 // Use software floating point operations?
774 if (FloatABI == "soft") {
775 CmdArgs.push_back("-target-feature");
776 CmdArgs.push_back("+soft-float");
777 }
778
779 // Use software floating point argument passing?
780 if (FloatABI != "hard") {
781 CmdArgs.push_back("-target-feature");
782 CmdArgs.push_back("+soft-float-abi");
783 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000784
785 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000786 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000787 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000788
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000789 // Honor -mfpmath=.
790 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000791 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000792
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000793 // Setting -msoft-float effectively disables NEON because of the GCC
794 // implementation, although the same isn't true of VFP or VFP3.
795 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000796 CmdArgs.push_back("-target-feature");
797 CmdArgs.push_back("-neon");
798 }
799
800 // Kernel code has more strict alignment requirements.
801 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000802 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
803 CmdArgs.push_back("-backend-option");
804 CmdArgs.push_back("-arm-long-calls");
805 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000806
Daniel Dunbar12100e22011-03-22 16:48:17 +0000807 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000808 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000809
810 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000811 CmdArgs.push_back("-backend-option");
812 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000813 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000814
815 // Setting -mno-global-merge disables the codegen global merge pass. Setting
816 // -mglobal-merge has no effect as the pass is enabled by default.
817 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
818 options::OPT_mno_global_merge)) {
819 if (A->getOption().matches(options::OPT_mno_global_merge))
820 CmdArgs.push_back("-mno-global-merge");
821 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000822
Chad Rosierc14ded72012-05-16 21:19:55 +0000823 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000824 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000825}
826
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000827// Translate MIPS CPU name alias option to CPU name.
828static StringRef getMipsCPUFromAlias(const Arg &A) {
829 if (A.getOption().matches(options::OPT_mips32))
830 return "mips32";
831 if (A.getOption().matches(options::OPT_mips32r2))
832 return "mips32r2";
833 if (A.getOption().matches(options::OPT_mips64))
834 return "mips64";
835 if (A.getOption().matches(options::OPT_mips64r2))
836 return "mips64r2";
837 llvm_unreachable("Unexpected option");
838 return "";
839}
840
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000841// Get CPU and ABI names. They are not independent
842// so we have to calculate them together.
843static void getMipsCPUAndABI(const ArgList &Args,
844 const ToolChain &TC,
845 StringRef &CPUName,
846 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000847 const char *DefMips32CPU = "mips32";
848 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000849
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000850 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000851 options::OPT_mcpu_EQ,
852 options::OPT_mips_CPUs_Group)) {
853 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
854 CPUName = getMipsCPUFromAlias(*A);
855 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000856 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000857 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000858
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000859 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +0000860 ABIName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000861
862 // Setup default CPU and ABI names.
863 if (CPUName.empty() && ABIName.empty()) {
864 switch (TC.getTriple().getArch()) {
865 default:
866 llvm_unreachable("Unexpected triple arch name");
867 case llvm::Triple::mips:
868 case llvm::Triple::mipsel:
869 CPUName = DefMips32CPU;
870 break;
871 case llvm::Triple::mips64:
872 case llvm::Triple::mips64el:
873 CPUName = DefMips64CPU;
874 break;
875 }
876 }
877
878 if (!ABIName.empty()) {
879 // Deduce CPU name from ABI name.
880 CPUName = llvm::StringSwitch<const char *>(ABIName)
881 .Cases("o32", "eabi", DefMips32CPU)
882 .Cases("n32", "n64", DefMips64CPU)
883 .Default("");
884 }
885 else if (!CPUName.empty()) {
886 // Deduce ABI name from CPU name.
887 ABIName = llvm::StringSwitch<const char *>(CPUName)
888 .Cases("mips32", "mips32r2", "o32")
889 .Cases("mips64", "mips64r2", "n64")
890 .Default("");
891 }
892
893 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000894}
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
Eric Christopher0b26a612010-03-02 02:41:08 +0000958 if (FloatABI == "soft") {
959 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000960 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000961 CmdArgs.push_back("-mfloat-abi");
962 CmdArgs.push_back("soft");
963
964 // FIXME: Note, this is a hack. We need to pass the selected float
965 // mode to the MipsTargetInfoBase to define appropriate macros there.
966 // Now it is the only method.
967 CmdArgs.push_back("-target-feature");
968 CmdArgs.push_back("+soft-float");
969 }
970 else if (FloatABI == "single") {
971 // Restrict the use of hardware floating-point
972 // instructions to 32-bit operations.
973 CmdArgs.push_back("-target-feature");
974 CmdArgs.push_back("+single-float");
975 }
976 else {
977 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000978 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000979 CmdArgs.push_back("-mfloat-abi");
980 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000981 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000982
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000983 AddTargetFeature(Args, CmdArgs,
984 options::OPT_mips16, options::OPT_mno_mips16,
985 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000986 AddTargetFeature(Args, CmdArgs,
987 options::OPT_mdsp, options::OPT_mno_dsp,
988 "dsp");
989 AddTargetFeature(Args, CmdArgs,
990 options::OPT_mdspr2, options::OPT_mno_dspr2,
991 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000992
Simon Atanasyan2eaec512012-12-01 18:27:21 +0000993 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
994 if (A->getOption().matches(options::OPT_mxgot)) {
995 CmdArgs.push_back("-mllvm");
996 CmdArgs.push_back("-mxgot");
997 }
998 }
999
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001000 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001001 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001002 CmdArgs.push_back("-mllvm");
1003 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1004 A->claim();
1005 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001006}
1007
Hal Finkel8eb59282012-06-11 22:35:19 +00001008/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1009static std::string getPPCTargetCPU(const ArgList &Args) {
1010 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001011 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001012
1013 if (CPUName == "native") {
1014 std::string CPU = llvm::sys::getHostCPUName();
1015 if (!CPU.empty() && CPU != "generic")
1016 return CPU;
1017 else
1018 return "";
1019 }
1020
1021 return llvm::StringSwitch<const char *>(CPUName)
1022 .Case("common", "generic")
1023 .Case("440", "440")
1024 .Case("440fp", "440")
1025 .Case("450", "450")
1026 .Case("601", "601")
1027 .Case("602", "602")
1028 .Case("603", "603")
1029 .Case("603e", "603e")
1030 .Case("603ev", "603ev")
1031 .Case("604", "604")
1032 .Case("604e", "604e")
1033 .Case("620", "620")
1034 .Case("G3", "g3")
1035 .Case("7400", "7400")
1036 .Case("G4", "g4")
1037 .Case("7450", "7450")
1038 .Case("G4+", "g4+")
1039 .Case("750", "750")
1040 .Case("970", "970")
1041 .Case("G5", "g5")
1042 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001043 .Case("e500mc", "e500mc")
1044 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +00001045 .Case("power6", "pwr6")
1046 .Case("power7", "pwr7")
1047 .Case("powerpc", "ppc")
1048 .Case("powerpc64", "ppc64")
1049 .Default("");
1050 }
1051
1052 return "";
1053}
1054
1055void Clang::AddPPCTargetArgs(const ArgList &Args,
1056 ArgStringList &CmdArgs) const {
1057 std::string TargetCPUName = getPPCTargetCPU(Args);
1058
1059 // LLVM may default to generating code for the native CPU,
1060 // but, like gcc, we default to a more generic option for
1061 // each architecture. (except on Darwin)
1062 llvm::Triple Triple = getToolChain().getTriple();
1063 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1064 if (Triple.getArch() == llvm::Triple::ppc64)
1065 TargetCPUName = "ppc64";
1066 else
1067 TargetCPUName = "ppc";
1068 }
1069
1070 if (!TargetCPUName.empty()) {
1071 CmdArgs.push_back("-target-cpu");
1072 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1073 }
1074}
1075
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001076void Clang::AddSparcTargetArgs(const ArgList &Args,
1077 ArgStringList &CmdArgs) const {
1078 const Driver &D = getToolChain().getDriver();
1079
1080 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001081 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001082 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001083 }
1084
1085 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001086 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001087 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1088 options::OPT_mhard_float)) {
1089 if (A->getOption().matches(options::OPT_msoft_float))
1090 FloatABI = "soft";
1091 else if (A->getOption().matches(options::OPT_mhard_float))
1092 FloatABI = "hard";
1093 }
1094
1095 // If unspecified, choose the default based on the platform.
1096 if (FloatABI.empty()) {
1097 switch (getToolChain().getTriple().getOS()) {
1098 default:
1099 // Assume "soft", but warn the user we are guessing.
1100 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001101 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001102 break;
1103 }
1104 }
1105
1106 if (FloatABI == "soft") {
1107 // Floating point operations and argument passing are soft.
1108 //
1109 // FIXME: This changes CPP defines, we need -target-soft-float.
1110 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001111 CmdArgs.push_back("-target-feature");
1112 CmdArgs.push_back("+soft-float");
1113 } else {
1114 assert(FloatABI == "hard" && "Invalid float abi!");
1115 CmdArgs.push_back("-mhard-float");
1116 }
1117}
1118
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001119void Clang::AddX86TargetArgs(const ArgList &Args,
1120 ArgStringList &CmdArgs) const {
Rafael Espindola7df35012012-11-02 20:41:30 +00001121 const bool isAndroid =
1122 getToolChain().getTriple().getEnvironment() == llvm::Triple::Android;
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001123 if (!Args.hasFlag(options::OPT_mred_zone,
1124 options::OPT_mno_red_zone,
1125 true) ||
1126 Args.hasArg(options::OPT_mkernel) ||
1127 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001128 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001129
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001130 if (Args.hasFlag(options::OPT_msoft_float,
1131 options::OPT_mno_soft_float,
1132 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001133 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001134
Daniel Dunbare13ada62009-11-14 22:04:54 +00001135 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001136 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001137 if (StringRef(A->getValue()) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 // FIXME: Reject attempts to use -march=native unless the target matches
1139 // the host.
1140 //
1141 // FIXME: We should also incorporate the detected target features for use
1142 // with -native.
1143 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001144 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001145 CPUName = Args.MakeArgString(CPU);
1146 } else
Richard Smithbd55daf2012-11-01 04:30:05 +00001147 CPUName = A->getValue();
Daniel Dunbare13ada62009-11-14 22:04:54 +00001148 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001149
Daniel Dunbare13ada62009-11-14 22:04:54 +00001150 // Select the default CPU if none was given (or detection failed).
1151 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001152 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001153 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001154 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001155 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001156 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001157 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001158 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001159 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001160 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001161 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001162 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001163 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001164 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001165 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001166 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001167 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001168 } else if (getToolChain().getOS().startswith("bitrig")) {
1169 if (getToolChain().getArch() == llvm::Triple::x86_64)
1170 CPUName = "x86-64";
1171 else if (getToolChain().getArch() == llvm::Triple::x86)
1172 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001173 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001174 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001175 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001176 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001177 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001178 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001179 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001180 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001181 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001182 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001183 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001184 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001185 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001186 else if (getToolChain().getArch() == llvm::Triple::x86)
Rafael Espindola7df35012012-11-02 20:41:30 +00001187 // All x86 devices running Android have core2 as their common
1188 // denominator. This makes a better choice than pentium4.
1189 CPUName = isAndroid ? "core2" : "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001190 }
1191 }
1192
Daniel Dunbare13ada62009-11-14 22:04:54 +00001193 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001194 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001195 CmdArgs.push_back(CPUName);
1196 }
1197
Eli Friedmanad811f02011-07-02 00:34:19 +00001198 // The required algorithm here is slightly strange: the options are applied
1199 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1200 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1201 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1202 // former correctly, but not the latter; handle directly-overridden
1203 // attributes here.
1204 llvm::StringMap<unsigned> PrevFeature;
1205 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001206 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1207 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001208 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001209 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001210
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001211 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001212 assert(Name.startswith("m") && "Invalid feature name.");
1213 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001214
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001215 bool IsNegative = Name.startswith("no-");
1216 if (IsNegative)
1217 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001218
Eli Friedmanad811f02011-07-02 00:34:19 +00001219 unsigned& Prev = PrevFeature[Name];
1220 if (Prev)
1221 Features[Prev - 1] = 0;
1222 Prev = Features.size() + 1;
1223 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1224 }
1225 for (unsigned i = 0; i < Features.size(); i++) {
1226 if (Features[i]) {
1227 CmdArgs.push_back("-target-feature");
1228 CmdArgs.push_back(Features[i]);
1229 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001230 }
1231}
1232
Tony Linthicum76329bf2011-12-12 21:14:55 +00001233static Arg* getLastHexagonArchArg (const ArgList &Args)
1234{
1235 Arg * A = NULL;
1236
Sebastian Pop86500282012-01-13 20:37:10 +00001237 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1238 it != ie; ++it) {
1239 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001240 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1241 A = *it;
1242 A->claim();
1243 }
Sebastian Pop86500282012-01-13 20:37:10 +00001244 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
Richard Smithbd55daf2012-11-01 04:30:05 +00001245 StringRef Value = (*it)->getValue(0);
Sebastian Pop86500282012-01-13 20:37:10 +00001246 if (Value.startswith("v")) {
1247 A = *it;
1248 A->claim();
1249 }
1250 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001251 }
1252 return A;
1253}
1254
Sebastian Pop86500282012-01-13 20:37:10 +00001255static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001256{
1257 Arg *A;
1258 llvm::StringRef WhichHexagon;
1259
Sebastian Pop86500282012-01-13 20:37:10 +00001260 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001261 if ((A = getLastHexagonArchArg (Args))) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001262 WhichHexagon = A->getValue();
Sebastian Pop86500282012-01-13 20:37:10 +00001263 if (WhichHexagon == "")
1264 return "v4";
1265 else
1266 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001267 }
Sebastian Pop86500282012-01-13 20:37:10 +00001268 else
1269 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001270}
1271
1272void Clang::AddHexagonTargetArgs(const ArgList &Args,
1273 ArgStringList &CmdArgs) const {
1274 llvm::Triple Triple = getToolChain().getTriple();
1275
1276 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001277 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001278 CmdArgs.push_back("-fno-signed-char");
1279 CmdArgs.push_back("-nobuiltininc");
1280
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001281 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001282 CmdArgs.push_back("-mqdsp6-compat");
1283
1284 if (Arg *A = Args.getLastArg(options::OPT_G,
1285 options::OPT_msmall_data_threshold_EQ)) {
1286 std::string SmallDataThreshold="-small-data-threshold=";
Richard Smithbd55daf2012-11-01 04:30:05 +00001287 SmallDataThreshold += A->getValue();
Tony Linthicum76329bf2011-12-12 21:14:55 +00001288 CmdArgs.push_back ("-mllvm");
1289 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1290 A->claim();
1291 }
1292
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001293 if (!Args.hasArg(options::OPT_fno_short_enums))
1294 CmdArgs.push_back("-fshort-enums");
1295 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1296 CmdArgs.push_back ("-mllvm");
1297 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1298 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001299 CmdArgs.push_back ("-mllvm");
1300 CmdArgs.push_back ("-machine-sink-split=0");
1301}
1302
Eric Christopher84fbdb42011-08-19 00:30:14 +00001303static bool
John McCall5fb5df92012-06-20 06:18:46 +00001304shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001305 const llvm::Triple &Triple) {
1306 // We use the zero-cost exception tables for Objective-C if the non-fragile
1307 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1308 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001309 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001310 return true;
1311
Bob Wilson6524dd32011-10-14 05:03:44 +00001312 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001313 return false;
1314
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001315 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001316 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001317 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001318}
1319
Anders Carlssone96ab552011-02-28 02:27:16 +00001320/// addExceptionArgs - Adds exception related arguments to the driver command
1321/// arguments. There's a master flag, -fexceptions and also language specific
1322/// flags to enable/disable C++ and Objective-C exceptions.
1323/// This makes it possible to for example disable C++ exceptions but enable
1324/// Objective-C exceptions.
1325static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1326 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001327 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001328 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001329 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001330 if (KernelOrKext) {
1331 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1332 // arguments now to avoid warnings about unused arguments.
1333 Args.ClaimAllArgs(options::OPT_fexceptions);
1334 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1335 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1336 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1337 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1338 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001339 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001340 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001341
1342 // Exceptions are enabled by default.
1343 bool ExceptionsEnabled = true;
1344
1345 // This keeps track of whether exceptions were explicitly turned on or off.
1346 bool DidHaveExplicitExceptionFlag = false;
1347
Rafael Espindola00a66572009-10-01 13:33:33 +00001348 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1349 options::OPT_fno_exceptions)) {
1350 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001351 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001352 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001353 ExceptionsEnabled = false;
1354
1355 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001356 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001357
Anders Carlssone96ab552011-02-28 02:27:16 +00001358 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001359
Anders Carlssone96ab552011-02-28 02:27:16 +00001360 // Exception tables and cleanups can be enabled with -fexceptions even if the
1361 // language itself doesn't support exceptions.
1362 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1363 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001364
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001365 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1366 // is not necessarily sensible, but follows GCC.
1367 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001368 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001369 options::OPT_fno_objc_exceptions,
1370 true)) {
1371 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001372
Eric Christopher84fbdb42011-08-19 00:30:14 +00001373 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001374 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001375 }
1376
1377 if (types::isCXX(InputType)) {
1378 bool CXXExceptionsEnabled = ExceptionsEnabled;
1379
Eric Christopher84fbdb42011-08-19 00:30:14 +00001380 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1381 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001382 options::OPT_fexceptions,
1383 options::OPT_fno_exceptions)) {
1384 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1385 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001386 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001387 CXXExceptionsEnabled = false;
1388 }
1389
1390 if (CXXExceptionsEnabled) {
1391 CmdArgs.push_back("-fcxx-exceptions");
1392
1393 ShouldUseExceptionTables = true;
1394 }
1395 }
1396
1397 if (ShouldUseExceptionTables)
1398 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001399}
1400
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001401static bool ShouldDisableCFI(const ArgList &Args,
1402 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001403 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001404 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001405 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001406 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001407 Default = Args.hasFlag(options::OPT_integrated_as,
1408 options::OPT_no_integrated_as,
1409 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001410 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001411 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1412 options::OPT_fno_dwarf2_cfi_asm,
1413 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001414}
1415
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001416static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1417 const ToolChain &TC) {
1418 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1419 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1420 options::OPT_no_integrated_as,
1421 IsIADefault);
1422 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1423 options::OPT_fno_dwarf_directory_asm,
1424 UseIntegratedAs);
1425 return !UseDwarfDirectory;
1426}
1427
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001428/// \brief Check whether the given input tree contains any compilation actions.
1429static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001430 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001431 return true;
1432
1433 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1434 if (ContainsCompileAction(*it))
1435 return true;
1436
1437 return false;
1438}
1439
1440/// \brief Check if -relax-all should be passed to the internal assembler.
1441/// This is done by default when compiling non-assembler source with -O0.
1442static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1443 bool RelaxDefault = true;
1444
1445 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1446 RelaxDefault = A->getOption().matches(options::OPT_O0);
1447
1448 if (RelaxDefault) {
1449 RelaxDefault = false;
1450 for (ActionList::const_iterator it = C.getActions().begin(),
1451 ie = C.getActions().end(); it != ie; ++it) {
1452 if (ContainsCompileAction(*it)) {
1453 RelaxDefault = true;
1454 break;
1455 }
1456 }
1457 }
1458
1459 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1460 RelaxDefault);
1461}
1462
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001463SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) {
1464 Kind = 0;
Richard Smith52be6192012-11-05 22:04:41 +00001465
Richard Smith52be6192012-11-05 22:04:41 +00001466 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001467 unsigned Add, Remove;
1468 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001469 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001470 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001471 Kind |= Add;
1472 Kind &= ~Remove;
Richard Smith52be6192012-11-05 22:04:41 +00001473 }
1474
1475 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001476 bool NeedsAsan = needsAsanRt();
1477 bool NeedsTsan = needsTsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001478 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001479 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001480 << lastArgumentForKind(D, Args, NeedsAsanRt)
1481 << lastArgumentForKind(D, Args, NeedsTsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001482
1483 // If -fsanitize contains extra features of ASan, it should also
1484 // explicitly contain -fsanitize=address.
1485 if (NeedsAsan && ((Kind & Address) == 0))
1486 D.Diag(diag::err_drv_argument_only_allowed_with)
1487 << lastArgumentForKind(D, Args, NeedsAsanRt)
1488 << "-fsanitize=address";
Richard Smith52be6192012-11-05 22:04:41 +00001489}
1490
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001491/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1492/// This needs to be called before we add the C run-time (malloc, etc).
1493static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001494 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001495 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001496 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001497 if (!Args.hasArg(options::OPT_pie))
1498 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001499 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001500
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001501 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1502 llvm::sys::path::append(LibAsan, "lib", "linux",
1503 (Twine("libclang_rt.asan-") +
1504 TC.getArchName() + "-android.so"));
1505 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001506 } else {
1507 if (!Args.hasArg(options::OPT_shared)) {
1508 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1509 // resource directory.
1510 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1511 llvm::sys::path::append(LibAsan, "lib", "linux",
1512 (Twine("libclang_rt.asan-") +
1513 TC.getArchName() + ".a"));
1514 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1515 CmdArgs.push_back("-lpthread");
1516 CmdArgs.push_back("-ldl");
1517 CmdArgs.push_back("-export-dynamic");
1518 }
1519 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001520}
1521
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001522/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1523/// This needs to be called before we add the C run-time (malloc, etc).
1524static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1525 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001526 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001527 if (!Args.hasArg(options::OPT_pie))
1528 TC.getDriver().Diag(diag::err_drv_sanitizer_requires_pie) <<
1529 /* Thread */ 0;
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001530 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1531 // resource directory.
1532 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1533 llvm::sys::path::append(LibTsan, "lib", "linux",
1534 (Twine("libclang_rt.tsan-") +
1535 TC.getArchName() + ".a"));
1536 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1537 CmdArgs.push_back("-lpthread");
1538 CmdArgs.push_back("-ldl");
1539 CmdArgs.push_back("-export-dynamic");
1540 }
1541}
1542
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001543/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1544/// This needs to be called before we add the C run-time (malloc, etc).
1545static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1546 ArgStringList &CmdArgs) {
1547 if (!Args.hasArg(options::OPT_shared)) {
1548 if (!Args.hasArg(options::OPT_pie))
1549 TC.getDriver().Diag(diag::err_drv_sanitizer_requires_pie) <<
1550 /* Memory */ 1;
1551 // LibMsan is "libclang_rt.msan-<ArchName>.a" in the Linux library
1552 // resource directory.
1553 SmallString<128> LibMsan(TC.getDriver().ResourceDir);
1554 llvm::sys::path::append(LibMsan, "lib", "linux",
1555 (Twine("libclang_rt.msan-") +
1556 TC.getArchName() + ".a"));
1557 CmdArgs.push_back(Args.MakeArgString(LibMsan));
1558 CmdArgs.push_back("-lpthread");
1559 CmdArgs.push_back("-ldl");
1560 CmdArgs.push_back("-export-dynamic");
1561 }
1562}
1563
Richard Smithe30752c2012-10-09 19:52:38 +00001564/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1565/// (Linux).
1566static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1567 ArgStringList &CmdArgs) {
Richard Smithe30752c2012-10-09 19:52:38 +00001568 if (!Args.hasArg(options::OPT_shared)) {
1569 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1570 // resource directory.
1571 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1572 llvm::sys::path::append(LibUbsan, "lib", "linux",
1573 (Twine("libclang_rt.ubsan-") +
1574 TC.getArchName() + ".a"));
1575 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
Richard Smith437abed2012-11-02 20:32:19 +00001576 CmdArgs.push_back("-lpthread");
Richard Smith06d87f12012-12-01 01:02:45 +00001577 CmdArgs.push_back("-export-dynamic");
Richard Smithe30752c2012-10-09 19:52:38 +00001578 }
1579}
1580
Rafael Espindola224dd632011-12-14 21:02:23 +00001581static bool shouldUseFramePointer(const ArgList &Args,
1582 const llvm::Triple &Triple) {
1583 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1584 options::OPT_fomit_frame_pointer))
1585 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1586
Rafael Espindola00b29182011-12-14 21:50:24 +00001587 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001588 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1589 Triple.getArch() == llvm::Triple::x86) &&
1590 Triple.getOS() == llvm::Triple::Linux) {
1591 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1592 if (!A->getOption().matches(options::OPT_O0))
1593 return false;
1594 }
1595
1596 return true;
1597}
1598
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001599void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001600 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001601 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001602 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001603 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001604 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1605 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001606 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001607 ArgStringList CmdArgs;
1608
Daniel Dunbare521a892009-03-31 20:53:55 +00001609 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1610
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001611 // Invoke ourselves in -cc1 mode.
1612 //
1613 // FIXME: Implement custom jobs for internal actions.
1614 CmdArgs.push_back("-cc1");
1615
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001616 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001617 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001618 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001619 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001620
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001621 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001622 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001623
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001624 if (isa<AnalyzeJobAction>(JA)) {
1625 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1626 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001627 } else if (isa<MigrateJobAction>(JA)) {
1628 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001629 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001630 if (Output.getType() == types::TY_Dependencies)
1631 CmdArgs.push_back("-Eonly");
1632 else
1633 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001634 } else if (isa<AssembleJobAction>(JA)) {
1635 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001636
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001637 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001638 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001639
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001640 // When using an integrated assembler, translate -Wa, and -Xassembler
1641 // options.
1642 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1643 options::OPT_Xassembler),
1644 ie = Args.filtered_end(); it != ie; ++it) {
1645 const Arg *A = *it;
1646 A->claim();
1647
1648 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001649 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001650
1651 if (Value == "-force_cpusubtype_ALL") {
1652 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001653 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001654 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001655 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001656 CmdArgs.push_back("-mllvm");
1657 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001658 } else if (Value == "--noexecstack") {
1659 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001660 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001661 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001662 << A->getOption().getName() << Value;
1663 }
1664 }
1665 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001666
1667 // Also ignore explicit -force_cpusubtype_ALL option.
1668 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001669 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001670 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001671 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001672
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001673 if (JA.getType() == types::TY_Nothing)
1674 CmdArgs.push_back("-fsyntax-only");
1675 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001676 CmdArgs.push_back("-emit-pch");
1677 else
1678 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001679 } else {
1680 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001681
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001682 if (JA.getType() == types::TY_Nothing) {
1683 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001684 } else if (JA.getType() == types::TY_LLVM_IR ||
1685 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001686 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001687 } else if (JA.getType() == types::TY_LLVM_BC ||
1688 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001689 CmdArgs.push_back("-emit-llvm-bc");
1690 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001691 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001692 } else if (JA.getType() == types::TY_AST) {
1693 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001694 } else if (JA.getType() == types::TY_RewrittenObjC) {
1695 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001696 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001697 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1698 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001699 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001700 } else {
1701 assert(JA.getType() == types::TY_PP_Asm &&
1702 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001703 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001704 }
1705
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001706 // The make clang go fast button.
1707 CmdArgs.push_back("-disable-free");
1708
John McCallbb79b5f2010-02-13 03:50:24 +00001709 // Disable the verification pass in -asserts builds.
1710#ifdef NDEBUG
1711 CmdArgs.push_back("-disable-llvm-verifier");
1712#endif
1713
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001714 // Set the main file name, so that debug info works even with
1715 // -save-temps.
1716 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001717 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001718
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001719 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001720 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001721 if (Args.hasArg(options::OPT_static))
1722 CmdArgs.push_back("-static-define");
1723
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001724 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001725 // Enable region store model by default.
1726 CmdArgs.push_back("-analyzer-store=region");
1727
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001728 // Treat blocks as analysis entry points.
1729 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1730
Ted Kremenek49c79792011-03-24 00:28:47 +00001731 CmdArgs.push_back("-analyzer-eagerly-assume");
1732
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001733 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001734 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001735 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001736
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001737 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1738 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001739
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001740 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001741 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001742
1743 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001744
1745 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001746 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1747 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1748 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1749 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1750 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1751 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001752 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001753
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001754 // Set the output format. The default is plist, for (lame) historical
1755 // reasons.
1756 CmdArgs.push_back("-analyzer-output");
1757 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001758 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001759 else
1760 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001761
Ted Kremenekfe449a22010-03-22 22:32:05 +00001762 // Disable the presentation of standard compiler warnings when
1763 // using --analyze. We only want to show static analyzer diagnostics
1764 // or frontend errors.
1765 CmdArgs.push_back("-w");
1766
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001767 // Add -Xanalyzer arguments when running as analyzer.
1768 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001769 }
1770
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001771 CheckCodeGenerationOptions(D, Args);
1772
Chandler Carruth76a943b2012-11-19 03:52:03 +00001773 // For the PIC and PIE flag options, this logic is different from the legacy
1774 // logic in very old versions of GCC, as that logic was just a bug no one had
1775 // ever fixed. This logic is both more rational and consistent with GCC's new
1776 // logic now that the bugs are fixed. The last argument relating to either
1777 // PIC or PIE wins, and no other argument is used. If the last argument is
1778 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1779 // PIE option implicitly enables PIC at the same level.
1780 bool PIE = false;
1781 bool PIC = getToolChain().isPICDefault();
1782 bool IsPICLevelTwo = PIC;
1783 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1784 options::OPT_fpic, options::OPT_fno_pic,
1785 options::OPT_fPIE, options::OPT_fno_PIE,
1786 options::OPT_fpie, options::OPT_fno_pie)) {
1787 Option O = A->getOption();
1788 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1789 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1790 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1791 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1792 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1793 O.matches(options::OPT_fPIC);
1794 } else {
1795 PIE = PIC = false;
1796 }
Benjamin Kramer76db2902012-11-13 15:32:35 +00001797 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001798 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1799 // is forced, then neither PIC nor PIE flags will have no effect.
1800 if (getToolChain().isPICDefaultForced()) {
1801 PIE = false;
1802 PIC = getToolChain().isPICDefault();
1803 IsPICLevelTwo = PIC;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001804 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001805
1806 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1807 // specified while enabling PIC enabled level 1 PIC, just force it back to
1808 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1809 // informal testing).
1810 if (PIC && getToolChain().getTriple().isOSDarwin())
1811 IsPICLevelTwo |= getToolChain().isPICDefault();
1812
Chandler Carruthc0c04552012-04-08 16:40:35 +00001813 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1814 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001815 llvm::Triple Triple(TripleStr);
1816 if ((Args.hasArg(options::OPT_mkernel) ||
1817 Args.hasArg(options::OPT_fapple_kext)) &&
1818 (Triple.getOS() != llvm::Triple::IOS ||
1819 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001820 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001821 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001822 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001823
Chandler Carruth76a943b2012-11-19 03:52:03 +00001824 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1825 // This is a very special mode. It trumps the other modes, almost no one
1826 // uses it, and it isn't even valid on any OS but Darwin.
1827 if (!getToolChain().getTriple().isOSDarwin())
1828 D.Diag(diag::err_drv_unsupported_opt_for_target)
1829 << A->getSpelling() << getToolChain().getTriple().str();
1830
1831 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
1832
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001833 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00001834 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001835
Chandler Carruth76a943b2012-11-19 03:52:03 +00001836 // Only a forced PIC mode can cause the actual compile to have PIC defines
1837 // etc., no flags are sufficient. This behavior was selected to closely
1838 // match that of llvm-gcc and Apple GCC before that.
1839 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
1840 CmdArgs.push_back("-pic-level");
1841 CmdArgs.push_back("2");
1842 }
1843 } else {
1844 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
1845 // handled in Clang's IRGen by the -pie-level flag.
1846 CmdArgs.push_back("-mrelocation-model");
1847 CmdArgs.push_back(PIC ? "pic" : "static");
1848
1849 if (PIC) {
1850 CmdArgs.push_back("-pic-level");
1851 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1852 if (PIE) {
1853 CmdArgs.push_back("-pie-level");
1854 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1855 }
1856 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001857 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001858
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001859 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1860 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001861 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001862
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001863 // LLVM Code Generator Options.
1864
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001865 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1866 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00001867 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001868 }
1869
Roman Divacky65b88cd2011-03-01 17:40:53 +00001870 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1871 CmdArgs.push_back("-mrtd");
1872
Rafael Espindola224dd632011-12-14 21:02:23 +00001873 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001874 CmdArgs.push_back("-mdisable-fp-elim");
1875 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1876 options::OPT_fno_zero_initialized_in_bss))
1877 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001878 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1879 options::OPT_fno_strict_aliasing,
1880 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001881 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001882 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1883 false))
1884 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001885 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1886 options::OPT_fno_optimize_sibling_calls))
1887 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001888
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001889 // Handle various floating point optimization flags, mapping them to the
1890 // appropriate LLVM code generation flags. The pattern for all of these is to
1891 // default off the codegen optimizations, and if any flag enables them and no
1892 // flag disables them after the flag enabling them, enable the codegen
1893 // optimization. This is complicated by several "umbrella" flags.
1894 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001895 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001896 options::OPT_ffinite_math_only,
1897 options::OPT_fno_finite_math_only,
1898 options::OPT_fhonor_infinities,
1899 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001900 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1901 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001902 A->getOption().getID() != options::OPT_fhonor_infinities)
1903 CmdArgs.push_back("-menable-no-infs");
1904 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001905 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001906 options::OPT_ffinite_math_only,
1907 options::OPT_fno_finite_math_only,
1908 options::OPT_fhonor_nans,
1909 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001910 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1911 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001912 A->getOption().getID() != options::OPT_fhonor_nans)
1913 CmdArgs.push_back("-menable-no-nans");
1914
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001915 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1916 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001917 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001918 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001919 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001920 options::OPT_fno_math_errno))
1921 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1922 if (MathErrno)
1923 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001924
1925 // There are several flags which require disabling very specific
1926 // optimizations. Any of these being disabled forces us to turn off the
1927 // entire set of LLVM optimizations, so collect them through all the flag
1928 // madness.
1929 bool AssociativeMath = false;
1930 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001931 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001932 options::OPT_funsafe_math_optimizations,
1933 options::OPT_fno_unsafe_math_optimizations,
1934 options::OPT_fassociative_math,
1935 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001936 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1937 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001938 A->getOption().getID() != options::OPT_fno_associative_math)
1939 AssociativeMath = true;
1940 bool ReciprocalMath = false;
1941 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001942 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001943 options::OPT_funsafe_math_optimizations,
1944 options::OPT_fno_unsafe_math_optimizations,
1945 options::OPT_freciprocal_math,
1946 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001947 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1948 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001949 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1950 ReciprocalMath = true;
1951 bool SignedZeros = true;
1952 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001953 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001954 options::OPT_funsafe_math_optimizations,
1955 options::OPT_fno_unsafe_math_optimizations,
1956 options::OPT_fsigned_zeros,
1957 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001958 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1959 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001960 A->getOption().getID() != options::OPT_fsigned_zeros)
1961 SignedZeros = false;
1962 bool TrappingMath = true;
1963 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001964 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001965 options::OPT_funsafe_math_optimizations,
1966 options::OPT_fno_unsafe_math_optimizations,
1967 options::OPT_ftrapping_math,
1968 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001969 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1970 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001971 A->getOption().getID() != options::OPT_ftrapping_math)
1972 TrappingMath = false;
1973 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1974 !TrappingMath)
1975 CmdArgs.push_back("-menable-unsafe-fp-math");
1976
Lang Hamesaa53b932012-07-06 00:59:19 +00001977
1978 // Validate and pass through -fp-contract option.
1979 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001980 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001981 options::OPT_ffp_contract)) {
1982 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001983 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00001984 if (Val == "fast" || Val == "on" || Val == "off") {
1985 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1986 } else {
1987 D.Diag(diag::err_drv_unsupported_option_argument)
1988 << A->getOption().getName() << Val;
1989 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001990 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001991 // If fast-math is set then set the fp-contract mode to fast.
1992 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1993 }
1994 }
1995
Bob Wilson6a039162012-07-19 03:52:53 +00001996 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1997 // and if we find them, tell the frontend to provide the appropriate
1998 // preprocessor macros. This is distinct from enabling any optimizations as
1999 // these options induce language changes which must survive serialization
2000 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002001 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2002 if (A->getOption().matches(options::OPT_ffast_math))
2003 CmdArgs.push_back("-ffast-math");
2004 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2005 if (A->getOption().matches(options::OPT_ffinite_math_only))
2006 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002007
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002008 // Decide whether to use verbose asm. Verbose assembly is the default on
2009 // toolchains which have the integrated assembler on by default.
2010 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2011 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002012 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002013 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002014 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002015
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002016 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2017 CmdArgs.push_back("-mdebug-pass");
2018 CmdArgs.push_back("Structure");
2019 }
2020 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2021 CmdArgs.push_back("-mdebug-pass");
2022 CmdArgs.push_back("Arguments");
2023 }
2024
John McCall8517abc2010-02-19 02:45:38 +00002025 // Enable -mconstructor-aliases except on darwin, where we have to
2026 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002027 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002028 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002029
John McCall7ef5cb32011-03-18 02:56:14 +00002030 // Darwin's kernel doesn't support guard variables; just die if we
2031 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002032 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002033 CmdArgs.push_back("-fforbid-guard-variables");
2034
Douglas Gregordbe39272011-02-01 15:15:22 +00002035 if (Args.hasArg(options::OPT_mms_bitfields)) {
2036 CmdArgs.push_back("-mms-bitfields");
2037 }
John McCall8517abc2010-02-19 02:45:38 +00002038
Daniel Dunbar306945d2009-09-16 06:17:29 +00002039 // This is a coarse approximation of what llvm-gcc actually does, both
2040 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2041 // complicated ways.
2042 bool AsynchronousUnwindTables =
2043 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2044 options::OPT_fno_asynchronous_unwind_tables,
2045 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002046 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002047 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2048 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002049 CmdArgs.push_back("-munwind-tables");
2050
Chandler Carruth05fb5852012-11-21 23:40:23 +00002051 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002052
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002053 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2054 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002055 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002056 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002057
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002058 // FIXME: Handle -mtune=.
2059 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002060
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002061 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002062 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002063 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002064 }
2065
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002066 // Add target specific cpu and features flags.
2067 switch(getToolChain().getTriple().getArch()) {
2068 default:
2069 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002070
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002071 case llvm::Triple::arm:
2072 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002073 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002074 break;
2075
Eric Christopher0b26a612010-03-02 02:41:08 +00002076 case llvm::Triple::mips:
2077 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002078 case llvm::Triple::mips64:
2079 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002080 AddMIPSTargetArgs(Args, CmdArgs);
2081 break;
2082
Hal Finkel8eb59282012-06-11 22:35:19 +00002083 case llvm::Triple::ppc:
2084 case llvm::Triple::ppc64:
2085 AddPPCTargetArgs(Args, CmdArgs);
2086 break;
2087
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002088 case llvm::Triple::sparc:
2089 AddSparcTargetArgs(Args, CmdArgs);
2090 break;
2091
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002092 case llvm::Triple::x86:
2093 case llvm::Triple::x86_64:
2094 AddX86TargetArgs(Args, CmdArgs);
2095 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002096
2097 case llvm::Triple::hexagon:
2098 AddHexagonTargetArgs(Args, CmdArgs);
2099 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002100 }
2101
Tony Linthicum76329bf2011-12-12 21:14:55 +00002102
2103
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002104 // Pass the linker version in use.
2105 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2106 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002107 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002108 }
2109
Nick Lewycky75033772011-02-02 06:43:03 +00002110 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002111 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002112 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002113 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002114 CmdArgs.push_back("-momit-leaf-frame-pointer");
2115
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002116 // Explicitly error on some things we know we don't support and can't just
2117 // ignore.
2118 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002119 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2120 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002121 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002122 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002123 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002124 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2125 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002126 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002127 << Unsupported->getOption().getName();
2128 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002129 }
2130
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002131 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002132 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002133 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002134 CmdArgs.push_back("-header-include-file");
2135 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2136 D.CCPrintHeadersFilename : "-");
2137 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002138 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002139 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002140
Chad Rosierbe10f982011-08-02 17:58:04 +00002141 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002142 CmdArgs.push_back("-diagnostic-log-file");
2143 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2144 D.CCLogDiagnosticsFilename : "-");
2145 }
2146
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002147 // Use the last option from "-g" group. "-gline-tables-only" is
2148 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002149 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002150 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2151 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2152 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002153 } else if (!A->getOption().matches(options::OPT_g0) &&
2154 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002155 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002156 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002157 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002158
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002159 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2160 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002161 if (Args.hasArg(options::OPT_gcolumn_info))
2162 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002163
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002164 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2165 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2166
Chris Lattner3c77a352010-06-22 00:03:40 +00002167 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2168
Nick Lewycky207bce32011-04-21 23:44:07 +00002169 if (Args.hasArg(options::OPT_ftest_coverage) ||
2170 Args.hasArg(options::OPT_coverage))
2171 CmdArgs.push_back("-femit-coverage-notes");
2172 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2173 Args.hasArg(options::OPT_coverage))
2174 CmdArgs.push_back("-femit-coverage-data");
2175
Nick Lewycky480cb992011-05-04 20:46:58 +00002176 if (C.getArgs().hasArg(options::OPT_c) ||
2177 C.getArgs().hasArg(options::OPT_S)) {
2178 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002179 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002180 SmallString<128> absFilename(Output.getFilename());
2181 llvm::sys::fs::make_absolute(absFilename);
2182 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002183 }
2184 }
2185
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002186 // Pass options for controlling the default header search paths.
2187 if (Args.hasArg(options::OPT_nostdinc)) {
2188 CmdArgs.push_back("-nostdsysteminc");
2189 CmdArgs.push_back("-nobuiltininc");
2190 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002191 if (Args.hasArg(options::OPT_nostdlibinc))
2192 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002193 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2194 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2195 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002196
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002197 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002198 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002199 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002200
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002201 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2202
Ted Kremenekf7639e12012-03-06 20:06:33 +00002203 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002204 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002205 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002206 options::OPT_ccc_arcmt_modify,
2207 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002208 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002209 switch (A->getOption().getID()) {
2210 default:
2211 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002212 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002213 CmdArgs.push_back("-arcmt-check");
2214 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002215 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002216 CmdArgs.push_back("-arcmt-modify");
2217 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002218 case options::OPT_ccc_arcmt_migrate:
2219 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002220 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002221 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002222
2223 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2224 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002225 break;
John McCalld70fb982011-06-15 23:25:17 +00002226 }
2227 }
2228 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002229
Ted Kremenekf7639e12012-03-06 20:06:33 +00002230 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2231 if (ARCMTEnabled) {
2232 D.Diag(diag::err_drv_argument_not_allowed_with)
2233 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2234 }
2235 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002236 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002237
2238 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2239 options::OPT_objcmt_migrate_subscripting)) {
2240 // None specified, means enable them all.
2241 CmdArgs.push_back("-objcmt-migrate-literals");
2242 CmdArgs.push_back("-objcmt-migrate-subscripting");
2243 } else {
2244 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2245 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2246 }
2247 }
2248
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002249 // Add preprocessing options like -I, -D, etc. if we are using the
2250 // preprocessor.
2251 //
2252 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002253 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002254 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002255
Rafael Espindolaa7431922011-07-21 23:40:37 +00002256 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2257 // that "The compiler can only warn and ignore the option if not recognized".
2258 // When building with ccache, it will pass -D options to clang even on
2259 // preprocessed inputs and configure concludes that -fPIC is not supported.
2260 Args.ClaimAllArgs(options::OPT_D);
2261
Daniel Dunbar58f78332009-09-17 06:53:36 +00002262 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002263 // others.
2264 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002265 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002266 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002267 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002268 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002269 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002270 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002271 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002272 }
2273
Daniel Dunbar945577c2009-10-29 02:24:45 +00002274 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002275 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2276 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002277 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002278 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002279
2280 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2281 // (-ansi is equivalent to -std=c89).
2282 //
2283 // If a std is supplied, only add -trigraphs if it follows the
2284 // option.
2285 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2286 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002287 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002288 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002289 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002290 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002291 else
2292 Std->render(Args, CmdArgs);
2293
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002294 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2295 options::OPT_trigraphs))
2296 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002297 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002298 } else {
2299 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002300 //
2301 // FIXME: Clang doesn't correctly handle -std= when the input language
2302 // doesn't match. For the time being just ignore this for C++ inputs;
2303 // eventually we want to do all the standard defaulting here instead of
2304 // splitting it between the driver and clang -cc1.
2305 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002306 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2307 "-std=", /*Joined=*/true);
2308 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2309 CmdArgs.push_back("-std=c++11");
2310
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002311 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002312 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002313
Chandler Carruthb009b142011-04-23 06:30:43 +00002314 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2315 // '-fconst-strings'; this better indicates its actual behavior.
2316 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2317 false)) {
2318 // For perfect compatibility with GCC, we do this even in the presence of
2319 // '-w'. This flag names something other than a warning for GCC.
2320 CmdArgs.push_back("-fconst-strings");
2321 }
2322
Chandler Carruth61fbf622011-04-23 09:27:53 +00002323 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002324 // during C++ compilation, which it is by default. GCC keeps this define even
2325 // in the presence of '-w', match this behavior bug-for-bug.
2326 if (types::isCXX(InputType) &&
2327 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2328 true)) {
2329 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002330 }
2331
Chandler Carruthe0391482010-05-22 02:21:53 +00002332 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2333 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2334 if (Asm->getOption().matches(options::OPT_fasm))
2335 CmdArgs.push_back("-fgnu-keywords");
2336 else
2337 CmdArgs.push_back("-fno-gnu-keywords");
2338 }
2339
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002340 if (ShouldDisableCFI(Args, getToolChain()))
2341 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002342
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002343 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2344 CmdArgs.push_back("-fno-dwarf-directory-asm");
2345
Nick Lewyckyba743b72011-10-21 02:32:14 +00002346 if (const char *pwd = ::getenv("PWD")) {
2347 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2348 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002349 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002350 std::string CompDir = pwd;
2351 CmdArgs.push_back("-fdebug-compilation-dir");
2352 CmdArgs.push_back(Args.MakeArgString(CompDir));
2353 }
2354 }
2355
Richard Smith9a568822011-11-21 19:36:32 +00002356 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2357 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002358 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002359 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002360 }
2361
Richard Smith9a568822011-11-21 19:36:32 +00002362 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2363 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002364 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002365 }
2366
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002367 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2368 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002369 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002370 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002371 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2372 } else
2373 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002374 }
2375
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002376
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002377 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002378 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002379
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002380 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2381 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002382 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002383 }
David Chisnall5778fce2009-08-31 16:41:57 +00002384
Chris Lattnere23003d2010-01-09 21:54:33 +00002385 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2386 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002387 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002388 }
2389
Chris Lattnerb35583d2010-04-07 20:49:23 +00002390 CmdArgs.push_back("-ferror-limit");
2391 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002392 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002393 else
2394 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002395
Chandler Carrutha77a7272010-05-06 04:55:18 +00002396 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2397 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002398 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002399 }
2400
2401 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2402 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002403 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002404 }
2405
Richard Smithf6f003a2011-12-16 19:06:07 +00002406 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2407 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002408 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002409 }
2410
Daniel Dunbar2c978472009-11-04 06:24:47 +00002411 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002412 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002413 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002414 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002415 } else {
2416 // If -fmessage-length=N was not specified, determine whether this is a
2417 // terminal and, if so, implicitly define -fmessage-length appropriately.
2418 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002419 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002420 }
2421
Daniel Dunbare357d562009-12-03 18:42:11 +00002422 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2423 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002424 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002425 }
2426
Douglas Gregor08329632010-06-15 17:05:35 +00002427 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002428
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002429 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2430
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002431 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002432 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2433 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002434 CmdArgs.push_back("-ffreestanding");
2435
Daniel Dunbare357d562009-12-03 18:42:11 +00002436 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002437 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002438 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002439 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002440 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002441 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002442 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002443 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2444 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002445
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002446 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002447 Sanitize.addArgs(Args, CmdArgs);
2448
Chad Rosier864dfe12012-03-13 23:45:51 +00002449 // Report and error for -faltivec on anything other then PowerPC.
2450 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2451 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2452 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2453 D.Diag(diag::err_drv_argument_only_allowed_with)
2454 << A->getAsString(Args) << "ppc/ppc64";
2455
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002456 if (getToolChain().SupportsProfiling())
2457 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002458
2459 // -flax-vector-conversions is default.
2460 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2461 options::OPT_fno_lax_vector_conversions))
2462 CmdArgs.push_back("-fno-lax-vector-conversions");
2463
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002464 if (Args.getLastArg(options::OPT_fapple_kext))
2465 CmdArgs.push_back("-fapple-kext");
2466
David Blaikie690f21e2012-06-14 18:55:27 +00002467 if (Args.hasFlag(options::OPT_frewrite_includes,
2468 options::OPT_fno_rewrite_includes, false))
2469 CmdArgs.push_back("-frewrite-includes");
2470
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002471 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002472 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002473 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002474 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2475 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002476
2477 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2478 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002479 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002480 }
2481
Bob Wilson14adb362012-02-03 06:27:22 +00002482 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002483
Chandler Carruth6e501032011-03-27 00:04:55 +00002484 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2485 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2486 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2487 options::OPT_fno_wrapv)) {
2488 if (A->getOption().matches(options::OPT_fwrapv))
2489 CmdArgs.push_back("-fwrapv");
2490 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2491 options::OPT_fno_strict_overflow)) {
2492 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2493 CmdArgs.push_back("-fwrapv");
2494 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002495 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002496 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002497
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002498 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2499
Mahesha S6a682be42012-10-27 07:47:56 +00002500
Daniel Dunbar4930e332009-11-17 08:07:36 +00002501 // -stack-protector=0 is default.
2502 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002503 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2504 options::OPT_fstack_protector_all,
2505 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002506 if (A->getOption().matches(options::OPT_fstack_protector))
2507 StackProtectorLevel = 1;
2508 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2509 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002510 } else {
2511 StackProtectorLevel =
2512 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2513 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002514 if (StackProtectorLevel) {
2515 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002516 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002517 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002518
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002519 // --param ssp-buffer-size=
2520 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2521 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002522 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002523 if (Str.startswith("ssp-buffer-size=")) {
2524 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002525 CmdArgs.push_back("-stack-protector-buffer-size");
2526 // FIXME: Verify the argument is a valid integer.
2527 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002528 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002529 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002530 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002531 }
2532
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002533 // Translate -mstackrealign
2534 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2535 false)) {
2536 CmdArgs.push_back("-backend-option");
2537 CmdArgs.push_back("-force-align-stack");
2538 }
2539 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2540 false)) {
2541 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2542 }
2543
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002544 if (Args.hasArg(options::OPT_mstack_alignment)) {
2545 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2546 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002547 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002548 // -mkernel implies -mstrict-align; don't add the redundant option.
2549 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002550 CmdArgs.push_back("-backend-option");
2551 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002552 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002553
Daniel Dunbard18049a2009-04-07 21:16:11 +00002554 // Forward -f options with positive and negative forms; we translate
2555 // these by hand.
2556
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002557 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002558 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002559 CmdArgs.push_back("-fapple-kext");
2560 if (!Args.hasArg(options::OPT_fbuiltin))
2561 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002562 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002563 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002564 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002565 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002566 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002567
Nuno Lopes13c88c72009-12-16 16:59:22 +00002568 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2569 options::OPT_fno_assume_sane_operator_new))
2570 CmdArgs.push_back("-fno-assume-sane-operator-new");
2571
Daniel Dunbar4930e332009-11-17 08:07:36 +00002572 // -fblocks=0 is default.
2573 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002574 getToolChain().IsBlocksDefault()) ||
2575 (Args.hasArg(options::OPT_fgnu_runtime) &&
2576 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2577 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002578 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002579
2580 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2581 !getToolChain().hasBlocksRuntime())
2582 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002583 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002584
Douglas Gregor226173a2012-01-18 15:19:58 +00002585 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2586 // users must also pass -fcxx-modules. The latter flag will disappear once the
2587 // modules implementation is solid for C++/Objective-C++ programs as well.
2588 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2589 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2590 options::OPT_fno_cxx_modules,
2591 false);
2592 if (AllowedInCXX || !types::isCXX(InputType))
2593 CmdArgs.push_back("-fmodules");
2594 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002595
John McCalldfea9982010-04-09 19:12:06 +00002596 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002597 if (Args.hasFlag(options::OPT_fno_access_control,
2598 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002599 false))
John McCall3155f572010-04-09 19:03:51 +00002600 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002601
Anders Carlssond470fef2010-11-21 00:09:52 +00002602 // -felide-constructors is the default.
2603 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2604 options::OPT_felide_constructors,
2605 false))
2606 CmdArgs.push_back("-fno-elide-constructors");
2607
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002608 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002609 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002610 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002611 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002612
Richard Smith52be6192012-11-05 22:04:41 +00002613 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002614 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002615 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002616 Args.getLastArg(options::OPT_mkernel,
2617 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002618 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002619 D.Diag(diag::err_drv_argument_not_allowed_with)
2620 << "-fsanitize=vptr" << NoRttiArg;
2621 }
2622 }
2623
Tony Linthicum76329bf2011-12-12 21:14:55 +00002624 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002625 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002626 options::OPT_fno_short_enums,
2627 getToolChain().getTriple().getArch() ==
2628 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002629 CmdArgs.push_back("-fshort-enums");
2630
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002631 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002632 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002633 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002634 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002635
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002636 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002637 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002638 options::OPT_fno_threadsafe_statics))
2639 CmdArgs.push_back("-fno-threadsafe-statics");
2640
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002641 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002642 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2643 options::OPT_fno_use_cxa_atexit,
2644 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002645 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002646 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2647 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002648 CmdArgs.push_back("-fno-use-cxa-atexit");
2649
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002650 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002651 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002652 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2653 CmdArgs.push_back("-fms-extensions");
2654
Chad Rosiered943242012-07-20 21:20:33 +00002655 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002656 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2657 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002658
Francois Pichet1b4f1632011-09-17 04:32:15 +00002659 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002660 if (Args.hasFlag(options::OPT_fms_compatibility,
2661 options::OPT_fno_ms_compatibility,
2662 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2663 Args.hasFlag(options::OPT_fms_extensions,
2664 options::OPT_fno_ms_extensions,
2665 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002666 CmdArgs.push_back("-fms-compatibility");
2667
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002668 // -fmsc-version=1300 is default.
2669 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2670 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2671 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002672 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002673 if (msc_ver.empty())
2674 CmdArgs.push_back("-fmsc-version=1300");
2675 else
2676 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2677 }
2678
2679
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002680 // -fborland-extensions=0 is default.
2681 if (Args.hasFlag(options::OPT_fborland_extensions,
2682 options::OPT_fno_borland_extensions, false))
2683 CmdArgs.push_back("-fborland-extensions");
2684
Francois Pichet02744872011-09-01 16:38:08 +00002685 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2686 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002687 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2688 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002689 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002690 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002691
Chandler Carruthe03aa552010-04-17 20:17:31 +00002692 // -fgnu-keywords default varies depending on language; only pass if
2693 // specified.
2694 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002695 options::OPT_fno_gnu_keywords))
2696 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002697
Rafael Espindola922a6242011-06-02 17:30:53 +00002698 if (Args.hasFlag(options::OPT_fgnu89_inline,
2699 options::OPT_fno_gnu89_inline,
2700 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002701 CmdArgs.push_back("-fgnu89-inline");
2702
Chad Rosier9c76d242012-03-15 22:31:42 +00002703 if (Args.hasArg(options::OPT_fno_inline))
2704 CmdArgs.push_back("-fno-inline");
2705
Chad Rosier64d6be92012-03-06 21:17:19 +00002706 if (Args.hasArg(options::OPT_fno_inline_functions))
2707 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002708
John McCall5fb5df92012-06-20 06:18:46 +00002709 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002710
John McCall5fb5df92012-06-20 06:18:46 +00002711 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2712 // legacy is the default.
2713 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002714 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2715 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002716 objcRuntime.isLegacyDispatchDefaultForArch(
2717 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002718 if (getToolChain().UseObjCMixedDispatch())
2719 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2720 else
2721 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2722 }
2723 }
2724
Nico Weber97bd94b2012-03-09 21:19:44 +00002725 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2726 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002727 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002728 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2729 }
2730
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002731 // -fencode-extended-block-signature=1 is default.
2732 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2733 CmdArgs.push_back("-fencode-extended-block-signature");
2734 }
2735
John McCall24fc0de2011-07-06 00:26:06 +00002736 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2737 // NOTE: This logic is duplicated in ToolChains.cpp.
2738 bool ARC = isObjCAutoRefCount(Args);
2739 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002740 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002741
John McCall24fc0de2011-07-06 00:26:06 +00002742 CmdArgs.push_back("-fobjc-arc");
2743
Chandler Carruth491db322011-11-04 07:34:47 +00002744 // FIXME: It seems like this entire block, and several around it should be
2745 // wrapped in isObjC, but for now we just use it here as this is where it
2746 // was being used previously.
2747 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2748 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2749 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2750 else
2751 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2752 }
2753
John McCall24fc0de2011-07-06 00:26:06 +00002754 // Allow the user to enable full exceptions code emission.
2755 // We define off for Objective-CC, on for Objective-C++.
2756 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2757 options::OPT_fno_objc_arc_exceptions,
2758 /*default*/ types::isCXX(InputType)))
2759 CmdArgs.push_back("-fobjc-arc-exceptions");
2760 }
2761
2762 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2763 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002764 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002765 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002766
John McCall24fc0de2011-07-06 00:26:06 +00002767 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2768 // takes precedence.
2769 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2770 if (!GCArg)
2771 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2772 if (GCArg) {
2773 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002774 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002775 << GCArg->getAsString(Args);
2776 } else if (getToolChain().SupportsObjCGC()) {
2777 GCArg->render(Args, CmdArgs);
2778 } else {
2779 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002780 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002781 << GCArg->getAsString(Args);
2782 }
2783 }
2784
John McCallb5f652e2011-06-22 00:53:57 +00002785 // Add exception args.
2786 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002787 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002788
2789 if (getToolChain().UseSjLjExceptions())
2790 CmdArgs.push_back("-fsjlj-exceptions");
2791
2792 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002793 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2794 options::OPT_fno_assume_sane_operator_new))
2795 CmdArgs.push_back("-fno-assume-sane-operator-new");
2796
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002797 // -fconstant-cfstrings is default, and may be subject to argument translation
2798 // on Darwin.
2799 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2800 options::OPT_fno_constant_cfstrings) ||
2801 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2802 options::OPT_mno_constant_cfstrings))
2803 CmdArgs.push_back("-fno-constant-cfstrings");
2804
John Thompsoned4e2952009-11-05 20:14:16 +00002805 // -fshort-wchar default varies depending on platform; only
2806 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002807 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2808 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002809
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002810 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2811 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002812 //
2813 // FIXME: This is gross; that translation should be pulled from the
2814 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002815 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002816 options::OPT_fno_pascal_strings,
2817 false) ||
2818 Args.hasFlag(options::OPT_mpascal_strings,
2819 options::OPT_mno_pascal_strings,
2820 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002821 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002822
Daniel Dunbar096ed292011-10-05 21:04:55 +00002823 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2824 // -fno-pack-struct doesn't apply to -fpack-struct=.
2825 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002826 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002827 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002828 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002829 } else if (Args.hasFlag(options::OPT_fpack_struct,
2830 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002831 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002832 }
2833
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002834 if (Args.hasArg(options::OPT_mkernel) ||
2835 Args.hasArg(options::OPT_fapple_kext)) {
2836 if (!Args.hasArg(options::OPT_fcommon))
2837 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002838 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002839 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002840
Daniel Dunbard18049a2009-04-07 21:16:11 +00002841 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002842 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002843 CmdArgs.push_back("-fno-common");
2844
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002845 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002846 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002847 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002848 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002849 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002850 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2851
Daniel Dunbar6358d682010-10-15 22:30:42 +00002852 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2853 if (!Args.hasFlag(options::OPT_ffor_scope,
2854 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002855 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002856 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2857
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002858 // -fcaret-diagnostics is default.
2859 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2860 options::OPT_fno_caret_diagnostics, true))
2861 CmdArgs.push_back("-fno-caret-diagnostics");
2862
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002863 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002864 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002865 options::OPT_fno_diagnostics_fixit_info))
2866 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002867
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002868 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002869 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002870 options::OPT_fno_diagnostics_show_option))
2871 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002872
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002873 if (const Arg *A =
2874 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2875 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00002876 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002877 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002878
Douglas Gregor643c9222011-05-21 17:07:29 +00002879 if (const Arg *A =
2880 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2881 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00002882 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00002883 }
2884
Chandler Carruthb6766f02011-03-27 01:50:55 +00002885 if (Arg *A = Args.getLastArg(
2886 options::OPT_fdiagnostics_show_note_include_stack,
2887 options::OPT_fno_diagnostics_show_note_include_stack)) {
2888 if (A->getOption().matches(
2889 options::OPT_fdiagnostics_show_note_include_stack))
2890 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2891 else
2892 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2893 }
2894
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002895 // Color diagnostics are the default, unless the terminal doesn't support
2896 // them.
2897 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002898 options::OPT_fno_color_diagnostics,
2899 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002900 CmdArgs.push_back("-fcolor-diagnostics");
2901
Daniel Dunbardb097022009-06-08 21:13:54 +00002902 if (!Args.hasFlag(options::OPT_fshow_source_location,
2903 options::OPT_fno_show_source_location))
2904 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002905
Douglas Gregor643c9222011-05-21 17:07:29 +00002906 if (!Args.hasFlag(options::OPT_fshow_column,
2907 options::OPT_fno_show_column,
2908 true))
2909 CmdArgs.push_back("-fno-show-column");
2910
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002911 if (!Args.hasFlag(options::OPT_fspell_checking,
2912 options::OPT_fno_spell_checking))
2913 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002914
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002915
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002916 // Silently ignore -fasm-blocks for now.
2917 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2918 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002919
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002920 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2921 A->render(Args, CmdArgs);
2922
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002923 // -fdollars-in-identifiers default varies depending on platform and
2924 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002925 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002926 options::OPT_fno_dollars_in_identifiers)) {
2927 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002928 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002929 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002930 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002931 }
2932
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002933 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2934 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002935 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002936 options::OPT_fno_unit_at_a_time)) {
2937 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002938 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002939 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002940
Eli Friedman055c9702011-11-02 01:53:16 +00002941 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2942 options::OPT_fno_apple_pragma_pack, false))
2943 CmdArgs.push_back("-fapple-pragma-pack");
2944
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002945 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002946 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002947 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002948#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002949 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002950 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2951 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2952 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2953 CmdArgs.push_back("-fno-builtin-strcat");
2954 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2955 CmdArgs.push_back("-fno-builtin-strcpy");
2956 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002957#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002958
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002959 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002960 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002961 options::OPT_traditional_cpp)) {
2962 if (isa<PreprocessJobAction>(JA))
2963 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002964 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002965 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002966 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002967
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002968 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002969 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002970
2971 // Handle serialized diagnostics.
2972 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2973 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00002974 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002975 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002976
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002977 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2978 CmdArgs.push_back("-fretain-comments-from-system-headers");
2979
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002980 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2981 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002982 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002983 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2984 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002985 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002986
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002987 // We translate this by hand to the -cc1 argument, since nightly test uses
2988 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00002989 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002990 CmdArgs.push_back("-disable-llvm-optzns");
2991 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002992 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002993 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002994
Daniel Dunbard67a3222009-03-30 06:36:42 +00002995 if (Output.getType() == types::TY_Dependencies) {
2996 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002997 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002998 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002999 CmdArgs.push_back(Output.getFilename());
3000 } else {
3001 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003002 }
3003
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003004 for (InputInfoList::const_iterator
3005 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3006 const InputInfo &II = *it;
3007 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003008 if (Args.hasArg(options::OPT_rewrite_objc))
3009 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3010 else
3011 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003012 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003013 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003014 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003015 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003016 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003017
Chris Lattnere9d7d782009-11-03 19:50:27 +00003018 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3019
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003020 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003021
3022 // Optionally embed the -cc1 level arguments into the debug info, for build
3023 // analysis.
3024 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003025 ArgStringList OriginalArgs;
3026 for (ArgList::const_iterator it = Args.begin(),
3027 ie = Args.end(); it != ie; ++it)
3028 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003029
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003030 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003031 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003032 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003033 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003034 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003035 }
3036 CmdArgs.push_back("-dwarf-debug-flags");
3037 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3038 }
3039
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003040 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003041
Roman Divacky178e01602011-02-10 16:52:03 +00003042 if (Arg *A = Args.getLastArg(options::OPT_pg))
3043 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003044 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003045 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003046
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003047 // Claim some arguments which clang supports automatically.
3048
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003049 // -fpch-preprocess is used with gcc to add a special marker in the output to
3050 // include the PCH file. Clang's PTH solution is completely transparent, so we
3051 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003052 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003053
Daniel Dunbar17731772009-03-23 19:03:36 +00003054 // Claim some arguments which clang doesn't support, but we don't
3055 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003056 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3057 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003058
Rafael Espindolad95a8122011-03-01 05:25:27 +00003059 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003060 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003061 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003062}
3063
Jim Grosbach576452b2012-02-10 20:37:10 +00003064void ClangAs::AddARMTargetArgs(const ArgList &Args,
3065 ArgStringList &CmdArgs) const {
3066 const Driver &D = getToolChain().getDriver();
3067 llvm::Triple Triple = getToolChain().getTriple();
3068
3069 // Set the CPU based on -march= and -mcpu=.
3070 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003071 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003072
3073 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003074 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003075 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003076
3077 // Honor -mfpmath=.
3078 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003079 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003080}
3081
John McCall5fb5df92012-06-20 06:18:46 +00003082/// Add options related to the Objective-C runtime/ABI.
3083///
3084/// Returns true if the runtime is non-fragile.
3085ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3086 ArgStringList &cmdArgs,
3087 RewriteKind rewriteKind) const {
3088 // Look for the controlling runtime option.
3089 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3090 options::OPT_fgnu_runtime,
3091 options::OPT_fobjc_runtime_EQ);
3092
3093 // Just forward -fobjc-runtime= to the frontend. This supercedes
3094 // options about fragility.
3095 if (runtimeArg &&
3096 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3097 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003098 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003099 if (runtime.tryParse(value)) {
3100 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3101 << value;
3102 }
3103
3104 runtimeArg->render(args, cmdArgs);
3105 return runtime;
3106 }
3107
3108 // Otherwise, we'll need the ABI "version". Version numbers are
3109 // slightly confusing for historical reasons:
3110 // 1 - Traditional "fragile" ABI
3111 // 2 - Non-fragile ABI, version 1
3112 // 3 - Non-fragile ABI, version 2
3113 unsigned objcABIVersion = 1;
3114 // If -fobjc-abi-version= is present, use that to set the version.
3115 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003116 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003117 if (value == "1")
3118 objcABIVersion = 1;
3119 else if (value == "2")
3120 objcABIVersion = 2;
3121 else if (value == "3")
3122 objcABIVersion = 3;
3123 else
3124 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3125 << value;
3126 } else {
3127 // Otherwise, determine if we are using the non-fragile ABI.
3128 bool nonFragileABIIsDefault =
3129 (rewriteKind == RK_NonFragile ||
3130 (rewriteKind == RK_None &&
3131 getToolChain().IsObjCNonFragileABIDefault()));
3132 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3133 options::OPT_fno_objc_nonfragile_abi,
3134 nonFragileABIIsDefault)) {
3135 // Determine the non-fragile ABI version to use.
3136#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3137 unsigned nonFragileABIVersion = 1;
3138#else
3139 unsigned nonFragileABIVersion = 2;
3140#endif
3141
3142 if (Arg *abiArg = args.getLastArg(
3143 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003144 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003145 if (value == "1")
3146 nonFragileABIVersion = 1;
3147 else if (value == "2")
3148 nonFragileABIVersion = 2;
3149 else
3150 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3151 << value;
3152 }
3153
3154 objcABIVersion = 1 + nonFragileABIVersion;
3155 } else {
3156 objcABIVersion = 1;
3157 }
3158 }
3159
3160 // We don't actually care about the ABI version other than whether
3161 // it's non-fragile.
3162 bool isNonFragile = objcABIVersion != 1;
3163
3164 // If we have no runtime argument, ask the toolchain for its default runtime.
3165 // However, the rewriter only really supports the Mac runtime, so assume that.
3166 ObjCRuntime runtime;
3167 if (!runtimeArg) {
3168 switch (rewriteKind) {
3169 case RK_None:
3170 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3171 break;
3172 case RK_Fragile:
3173 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3174 break;
3175 case RK_NonFragile:
3176 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3177 break;
3178 }
3179
3180 // -fnext-runtime
3181 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3182 // On Darwin, make this use the default behavior for the toolchain.
3183 if (getToolChain().getTriple().isOSDarwin()) {
3184 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3185
3186 // Otherwise, build for a generic macosx port.
3187 } else {
3188 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3189 }
3190
3191 // -fgnu-runtime
3192 } else {
3193 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003194 // Legacy behaviour is to target the gnustep runtime if we are i
3195 // non-fragile mode or the GCC runtime in fragile mode.
3196 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003197 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003198 else
3199 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003200 }
3201
3202 cmdArgs.push_back(args.MakeArgString(
3203 "-fobjc-runtime=" + runtime.getAsString()));
3204 return runtime;
3205}
3206
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003207void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003208 const InputInfo &Output,
3209 const InputInfoList &Inputs,
3210 const ArgList &Args,
3211 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003212 ArgStringList CmdArgs;
3213
3214 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3215 const InputInfo &Input = Inputs[0];
3216
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003217 // Don't warn about "clang -w -c foo.s"
3218 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003219 // and "clang -emit-llvm -c foo.s"
3220 Args.ClaimAllArgs(options::OPT_emit_llvm);
3221 // and "clang -use-gold-plugin -c foo.s"
3222 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003223
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003224 // Invoke ourselves in -cc1as mode.
3225 //
3226 // FIXME: Implement custom jobs for internal actions.
3227 CmdArgs.push_back("-cc1as");
3228
3229 // Add the "effective" target triple.
3230 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003231 std::string TripleStr =
3232 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003233 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3234
3235 // Set the output mode, we currently only expect to be used as a real
3236 // assembler.
3237 CmdArgs.push_back("-filetype");
3238 CmdArgs.push_back("obj");
3239
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003240 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003241 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003242
Jim Grosbach576452b2012-02-10 20:37:10 +00003243 // Add target specific cpu and features flags.
3244 switch(getToolChain().getTriple().getArch()) {
3245 default:
3246 break;
3247
3248 case llvm::Triple::arm:
3249 case llvm::Triple::thumb:
3250 AddARMTargetArgs(Args, CmdArgs);
3251 break;
3252 }
3253
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003254 // Ignore explicit -force_cpusubtype_ALL option.
3255 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003256
Eric Christopherfc3ee562012-01-10 00:38:01 +00003257 // Determine the original source input.
3258 const Action *SourceAction = &JA;
3259 while (SourceAction->getKind() != Action::InputClass) {
3260 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3261 SourceAction = SourceAction->getInputs()[0];
3262 }
3263
3264 // Forward -g, assuming we are dealing with an actual assembly file.
3265 if (SourceAction->getType() == types::TY_Asm ||
3266 SourceAction->getType() == types::TY_PP_Asm) {
3267 Args.ClaimAllArgs(options::OPT_g_Group);
3268 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3269 if (!A->getOption().matches(options::OPT_g0))
3270 CmdArgs.push_back("-g");
3271 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003272
3273 // Optionally embed the -cc1as level arguments into the debug info, for build
3274 // analysis.
3275 if (getToolChain().UseDwarfDebugFlags()) {
3276 ArgStringList OriginalArgs;
3277 for (ArgList::const_iterator it = Args.begin(),
3278 ie = Args.end(); it != ie; ++it)
3279 (*it)->render(Args, OriginalArgs);
3280
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003281 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003282 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3283 Flags += Exec;
3284 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3285 Flags += " ";
3286 Flags += OriginalArgs[i];
3287 }
3288 CmdArgs.push_back("-dwarf-debug-flags");
3289 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3290 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003291
3292 // FIXME: Add -static support, once we have it.
3293
3294 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3295 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003296 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003297
3298 assert(Output.isFilename() && "Unexpected lipo output.");
3299 CmdArgs.push_back("-o");
3300 CmdArgs.push_back(Output.getFilename());
3301
Daniel Dunbarb440f562010-08-02 02:38:21 +00003302 assert(Input.isFilename() && "Invalid input.");
3303 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003304
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003305 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003306 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003307}
3308
Daniel Dunbara3246a02009-03-18 08:07:30 +00003309void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003310 const InputInfo &Output,
3311 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003312 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003313 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003314 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003315 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003316
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003317 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003318 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003319 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003320 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003321 // Don't forward any -g arguments to assembly steps.
3322 if (isa<AssembleJobAction>(JA) &&
3323 A->getOption().matches(options::OPT_g_Group))
3324 continue;
3325
Daniel Dunbar2da02722009-03-19 07:55:12 +00003326 // It is unfortunate that we have to claim here, as this means
3327 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003328 // platforms using a generic gcc, even if we are just using gcc
3329 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003330 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003331 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003332 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003333 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003334
Daniel Dunbar4e295052010-01-25 22:35:08 +00003335 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003336
3337 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003338 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003339 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003340 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003341
3342 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003343 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003344 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003345 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003346 CmdArgs.push_back("ppc64");
3347 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003348 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003349 }
3350
Daniel Dunbar5716d872009-05-02 21:41:52 +00003351 // Try to force gcc to match the tool chain we want, if we recognize
3352 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003353 //
3354 // FIXME: The triple class should directly provide the information we want
3355 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003356 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003357 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003358 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003359 CmdArgs.push_back("-m64");
3360
Daniel Dunbarb440f562010-08-02 02:38:21 +00003361 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003362 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003363 CmdArgs.push_back(Output.getFilename());
3364 } else {
3365 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003366 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003367 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003368
Tony Linthicum76329bf2011-12-12 21:14:55 +00003369 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3370 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003371
3372 // Only pass -x if gcc will understand it; otherwise hope gcc
3373 // understands the suffix correctly. The main use case this would go
3374 // wrong in is for linker inputs if they happened to have an odd
3375 // suffix; really the only way to get this to happen is a command
3376 // like '-x foobar a.c' which will treat a.c like a linker input.
3377 //
3378 // FIXME: For the linker case specifically, can we safely convert
3379 // inputs into '-Wl,' options?
3380 for (InputInfoList::const_iterator
3381 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3382 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003383
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003384 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003385 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3386 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003387 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003388 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003389 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003390 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003391 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003392
Daniel Dunbara3246a02009-03-18 08:07:30 +00003393 if (types::canTypeBeUserSpecified(II.getType())) {
3394 CmdArgs.push_back("-x");
3395 CmdArgs.push_back(types::getTypeName(II.getType()));
3396 }
3397
Daniel Dunbarb440f562010-08-02 02:38:21 +00003398 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003399 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003400 else {
3401 const Arg &A = II.getInputArg();
3402
3403 // Reverse translate some rewritten options.
3404 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3405 CmdArgs.push_back("-lstdc++");
3406 continue;
3407 }
3408
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003409 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003410 A.render(Args, CmdArgs);
3411 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003412 }
3413
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003414 const std::string customGCCName = D.getCCCGenericGCCName();
3415 const char *GCCName;
3416 if (!customGCCName.empty())
3417 GCCName = customGCCName.c_str();
3418 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003419 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003420 } else
3421 GCCName = "gcc";
3422
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003423 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003424 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003425 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003426}
3427
Daniel Dunbar4e295052010-01-25 22:35:08 +00003428void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3429 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003430 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003431}
3432
Daniel Dunbar4e295052010-01-25 22:35:08 +00003433void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3434 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003435 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003436}
3437
Daniel Dunbar4e295052010-01-25 22:35:08 +00003438void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3439 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003440 const Driver &D = getToolChain().getDriver();
3441
Daniel Dunbar4e295052010-01-25 22:35:08 +00003442 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003443 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3444 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003445 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003446 else {
3447 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003448 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003449 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003450
Daniel Dunbar4e295052010-01-25 22:35:08 +00003451 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003452 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003453}
3454
Daniel Dunbar4e295052010-01-25 22:35:08 +00003455void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3456 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003457 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003458}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003459
Daniel Dunbar4e295052010-01-25 22:35:08 +00003460void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3461 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003462 // The types are (hopefully) good enough.
3463}
3464
Tony Linthicum76329bf2011-12-12 21:14:55 +00003465// Hexagon tools start.
3466void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3467 ArgStringList &CmdArgs) const {
3468
3469}
3470void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3471 const InputInfo &Output,
3472 const InputInfoList &Inputs,
3473 const ArgList &Args,
3474 const char *LinkingOutput) const {
3475
3476 const Driver &D = getToolChain().getDriver();
3477 ArgStringList CmdArgs;
3478
3479 std::string MarchString = "-march=";
3480 MarchString += getHexagonTargetCPU(Args);
3481 CmdArgs.push_back(Args.MakeArgString(MarchString));
3482
3483 RenderExtraToolArgs(JA, CmdArgs);
3484
3485 if (Output.isFilename()) {
3486 CmdArgs.push_back("-o");
3487 CmdArgs.push_back(Output.getFilename());
3488 } else {
3489 assert(Output.isNothing() && "Unexpected output");
3490 CmdArgs.push_back("-fsyntax-only");
3491 }
3492
3493
3494 // Only pass -x if gcc will understand it; otherwise hope gcc
3495 // understands the suffix correctly. The main use case this would go
3496 // wrong in is for linker inputs if they happened to have an odd
3497 // suffix; really the only way to get this to happen is a command
3498 // like '-x foobar a.c' which will treat a.c like a linker input.
3499 //
3500 // FIXME: For the linker case specifically, can we safely convert
3501 // inputs into '-Wl,' options?
3502 for (InputInfoList::const_iterator
3503 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3504 const InputInfo &II = *it;
3505
3506 // Don't try to pass LLVM or AST inputs to a generic gcc.
3507 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3508 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3509 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3510 << getToolChain().getTripleString();
3511 else if (II.getType() == types::TY_AST)
3512 D.Diag(clang::diag::err_drv_no_ast_support)
3513 << getToolChain().getTripleString();
3514
3515 if (II.isFilename())
3516 CmdArgs.push_back(II.getFilename());
3517 else
3518 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3519 II.getInputArg().render(Args, CmdArgs);
3520 }
3521
3522 const char *GCCName = "hexagon-as";
3523 const char *Exec =
3524 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3525 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3526
3527}
3528void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3529 ArgStringList &CmdArgs) const {
3530 // The types are (hopefully) good enough.
3531}
3532
3533void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3534 const InputInfo &Output,
3535 const InputInfoList &Inputs,
3536 const ArgList &Args,
3537 const char *LinkingOutput) const {
3538
3539 const Driver &D = getToolChain().getDriver();
3540 ArgStringList CmdArgs;
3541
3542 for (ArgList::const_iterator
3543 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3544 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003545 if (forwardToGCC(A->getOption())) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00003546 // Don't forward any -g arguments to assembly steps.
3547 if (isa<AssembleJobAction>(JA) &&
3548 A->getOption().matches(options::OPT_g_Group))
3549 continue;
3550
3551 // It is unfortunate that we have to claim here, as this means
3552 // we will basically never report anything interesting for
3553 // platforms using a generic gcc, even if we are just using gcc
3554 // to get to the assembler.
3555 A->claim();
3556 A->render(Args, CmdArgs);
3557 }
3558 }
3559
3560 RenderExtraToolArgs(JA, CmdArgs);
3561
3562 // Add Arch Information
3563 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003564 if ((A = getLastHexagonArchArg(Args))) {
3565 if (A->getOption().matches(options::OPT_m_Joined))
3566 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003567 else
Sebastian Pop86500282012-01-13 20:37:10 +00003568 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003569 }
Sebastian Pop86500282012-01-13 20:37:10 +00003570 else {
3571 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3572 }
3573
Tony Linthicum76329bf2011-12-12 21:14:55 +00003574 CmdArgs.push_back("-mqdsp6-compat");
3575
3576 const char *GCCName;
3577 if (C.getDriver().CCCIsCXX)
3578 GCCName = "hexagon-g++";
3579 else
3580 GCCName = "hexagon-gcc";
3581 const char *Exec =
3582 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3583
3584 if (Output.isFilename()) {
3585 CmdArgs.push_back("-o");
3586 CmdArgs.push_back(Output.getFilename());
3587 }
3588
3589 for (InputInfoList::const_iterator
3590 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3591 const InputInfo &II = *it;
3592
3593 // Don't try to pass LLVM or AST inputs to a generic gcc.
3594 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3595 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3596 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3597 << getToolChain().getTripleString();
3598 else if (II.getType() == types::TY_AST)
3599 D.Diag(clang::diag::err_drv_no_ast_support)
3600 << getToolChain().getTripleString();
3601
3602 if (II.isFilename())
3603 CmdArgs.push_back(II.getFilename());
3604 else
3605 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3606 II.getInputArg().render(Args, CmdArgs);
3607 }
3608 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3609
3610}
3611// Hexagon tools end.
3612
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003613llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3614 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3615 // archs which Darwin doesn't use.
3616
3617 // The matching this routine does is fairly pointless, since it is neither the
3618 // complete architecture list, nor a reasonable subset. The problem is that
3619 // historically the driver driver accepts this and also ties its -march=
3620 // handling to the architecture name, so we need to be careful before removing
3621 // support for it.
3622
3623 // This code must be kept in sync with Clang's Darwin specific argument
3624 // translation.
3625
3626 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3627 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3628 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3629 .Case("ppc64", llvm::Triple::ppc64)
3630 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3631 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3632 llvm::Triple::x86)
3633 .Case("x86_64", llvm::Triple::x86_64)
3634 // This is derived from the driver driver.
3635 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3636 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3637 .Case("r600", llvm::Triple::r600)
3638 .Case("nvptx", llvm::Triple::nvptx)
3639 .Case("nvptx64", llvm::Triple::nvptx64)
3640 .Case("amdil", llvm::Triple::amdil)
3641 .Case("spir", llvm::Triple::spir)
3642 .Default(llvm::Triple::UnknownArch);
3643}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003644
Bob Wilsondecc03e2012-11-23 06:14:39 +00003645const char *Clang::getBaseInputName(const ArgList &Args,
3646 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003647 return Args.MakeArgString(
3648 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003649}
3650
Bob Wilsondecc03e2012-11-23 06:14:39 +00003651const char *Clang::getBaseInputStem(const ArgList &Args,
3652 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003653 const char *Str = getBaseInputName(Args, Inputs);
3654
Chris Lattner906bb902011-01-16 08:14:11 +00003655 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003656 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003657
3658 return Str;
3659}
3660
Bob Wilsondecc03e2012-11-23 06:14:39 +00003661const char *Clang::getDependencyFileName(const ArgList &Args,
3662 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003663 // FIXME: Think about this more.
3664 std::string Res;
3665
3666 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003667 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003668 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003669 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00003670 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003671 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003672 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003673}
3674
Daniel Dunbarbe220842009-03-20 16:06:39 +00003675void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003676 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003677 const InputInfoList &Inputs,
3678 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00003679 const char *LinkingOutput) const {
3680 ArgStringList CmdArgs;
3681
3682 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3683 const InputInfo &Input = Inputs[0];
3684
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003685 // Determine the original source input.
3686 const Action *SourceAction = &JA;
3687 while (SourceAction->getKind() != Action::InputClass) {
3688 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3689 SourceAction = SourceAction->getInputs()[0];
3690 }
3691
3692 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00003693 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003694 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003695 if (Args.hasArg(options::OPT_gstabs))
3696 CmdArgs.push_back("--gstabs");
3697 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00003698 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003699 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003700
Daniel Dunbarbe220842009-03-20 16:06:39 +00003701 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003702 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00003703
Daniel Dunbar6d484762010-07-22 01:47:22 +00003704 // Use -force_cpusubtype_ALL on x86 by default.
3705 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3706 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003707 Args.hasArg(options::OPT_force__cpusubtype__ALL))
3708 CmdArgs.push_back("-force_cpusubtype_ALL");
3709
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00003710 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003711 (((Args.hasArg(options::OPT_mkernel) ||
3712 Args.hasArg(options::OPT_fapple_kext)) &&
3713 (!getDarwinToolChain().isTargetIPhoneOS() ||
3714 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
3715 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003716 CmdArgs.push_back("-static");
3717
Daniel Dunbarbe220842009-03-20 16:06:39 +00003718 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3719 options::OPT_Xassembler);
3720
3721 assert(Output.isFilename() && "Unexpected lipo output.");
3722 CmdArgs.push_back("-o");
3723 CmdArgs.push_back(Output.getFilename());
3724
Daniel Dunbarb440f562010-08-02 02:38:21 +00003725 assert(Input.isFilename() && "Invalid input.");
3726 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00003727
3728 // asm_final spec is empty.
3729
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003730 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003731 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003732 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00003733}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00003734
David Blaikie68e081d2011-12-20 02:48:34 +00003735void darwin::DarwinTool::anchor() {}
3736
Daniel Dunbare9ded432009-09-09 18:36:20 +00003737void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3738 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003739 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003740
Daniel Dunbarc1964212009-03-26 16:23:12 +00003741 // Derived from darwin_arch spec.
3742 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003743 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003744
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003745 // FIXME: Is this needed anymore?
3746 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003747 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00003748}
3749
Bill Wendling3b2000f2012-10-02 18:02:50 +00003750bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
3751 // We only need to generate a temp path for LTO if we aren't compiling object
3752 // files. When compiling source files, we run 'dsymutil' after linking. We
3753 // don't run 'dsymutil' when compiling object files.
3754 for (InputInfoList::const_iterator
3755 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
3756 if (it->getType() != types::TY_Object)
3757 return true;
3758
3759 return false;
3760}
3761
Daniel Dunbarccbc4522010-09-09 21:51:05 +00003762void darwin::Link::AddLinkArgs(Compilation &C,
3763 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00003764 ArgStringList &CmdArgs,
3765 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003766 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003767 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00003768
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003769 unsigned Version[3] = { 0, 0, 0 };
3770 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3771 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00003772 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003773 Version[1], Version[2], HadExtra) ||
3774 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003775 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003776 << A->getAsString(Args);
3777 }
3778
3779 // Newer linkers support -demangle, pass it if supported and not disabled by
3780 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00003781 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00003782 // Don't pass -demangle to ld_classic.
3783 //
3784 // FIXME: This is a temporary workaround, ld should be handling this.
3785 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
3786 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00003787 if (getToolChain().getArch() == llvm::Triple::x86) {
3788 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
3789 options::OPT_Wl_COMMA),
3790 ie = Args.filtered_end(); it != ie; ++it) {
3791 const Arg *A = *it;
3792 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00003793 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00003794 UsesLdClassic = true;
3795 }
3796 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00003797 if (!UsesLdClassic)
3798 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003799 }
3800
Bill Wendling313b6bf2012-11-16 23:03:00 +00003801 // If we are using LTO, then automatically create a temporary file path for
3802 // the linker to use, so that it's lifetime will extend past a possible
3803 // dsymutil step.
3804 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
3805 const char *TmpPath = C.getArgs().MakeArgString(
3806 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
3807 C.addTempFile(TmpPath);
3808 CmdArgs.push_back("-object_path_lto");
3809 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00003810 }
3811
Daniel Dunbarc1964212009-03-26 16:23:12 +00003812 // Derived from the "link" spec.
3813 Args.AddAllArgs(CmdArgs, options::OPT_static);
3814 if (!Args.hasArg(options::OPT_static))
3815 CmdArgs.push_back("-dynamic");
3816 if (Args.hasArg(options::OPT_fgnu_runtime)) {
3817 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
3818 // here. How do we wish to handle such things?
3819 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003820
Daniel Dunbarc1964212009-03-26 16:23:12 +00003821 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00003822 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00003823 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00003824 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003825
3826 Args.AddLastArg(CmdArgs, options::OPT_bundle);
3827 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
3828 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
3829
3830 Arg *A;
3831 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
3832 (A = Args.getLastArg(options::OPT_current__version)) ||
3833 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003834 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00003835 << A->getAsString(Args) << "-dynamiclib";
3836
3837 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
3838 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
3839 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
3840 } else {
3841 CmdArgs.push_back("-dylib");
3842
3843 Arg *A;
3844 if ((A = Args.getLastArg(options::OPT_bundle)) ||
3845 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
3846 (A = Args.getLastArg(options::OPT_client__name)) ||
3847 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
3848 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
3849 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003850 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00003851 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003852
Daniel Dunbarc1964212009-03-26 16:23:12 +00003853 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
3854 "-dylib_compatibility_version");
3855 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
3856 "-dylib_current_version");
3857
Daniel Dunbara48823f2010-01-22 02:04:52 +00003858 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003859
3860 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
3861 "-dylib_install_name");
3862 }
3863
3864 Args.AddLastArg(CmdArgs, options::OPT_all__load);
3865 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
3866 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003867 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003868 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003869 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
3870 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
3871 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
3872 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
3873 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
3874 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00003875 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003876 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
3877 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
3878 Args.AddAllArgs(CmdArgs, options::OPT_init);
3879
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003880 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00003881 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00003882
3883 // If we had an explicit -mios-simulator-version-min argument, honor that,
3884 // otherwise use the traditional deployment targets. We can't just check the
3885 // is-sim attribute because existing code follows this path, and the linker
3886 // may not handle the argument.
3887 //
3888 // FIXME: We may be able to remove this, once we can verify no one depends on
3889 // it.
3890 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
3891 CmdArgs.push_back("-ios_simulator_version_min");
3892 else if (DarwinTC.isTargetIPhoneOS())
3893 CmdArgs.push_back("-iphoneos_version_min");
3894 else
3895 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00003896 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003897
Daniel Dunbarc1964212009-03-26 16:23:12 +00003898 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
3899 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
3900 Args.AddLastArg(CmdArgs, options::OPT_single__module);
3901 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
3902 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003903
Daniel Dunbaraf68a882010-07-13 23:31:40 +00003904 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
3905 options::OPT_fno_pie,
3906 options::OPT_fno_PIE)) {
3907 if (A->getOption().matches(options::OPT_fpie) ||
3908 A->getOption().matches(options::OPT_fPIE))
3909 CmdArgs.push_back("-pie");
3910 else
3911 CmdArgs.push_back("-no_pie");
3912 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00003913
3914 Args.AddLastArg(CmdArgs, options::OPT_prebind);
3915 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
3916 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
3917 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
3918 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
3919 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
3920 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
3921 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
3922 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
3923 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
3924 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
3925 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
3926 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
3927 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
3928 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
3929 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003930
Daniel Dunbar84384642011-05-02 21:03:47 +00003931 // Give --sysroot= preference, over the Apple specific behavior to also use
3932 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00003933 StringRef sysroot = C.getSysRoot();
3934 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00003935 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00003936 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00003937 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3938 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00003939 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003940 }
3941
Daniel Dunbarc1964212009-03-26 16:23:12 +00003942 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
3943 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
3944 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
3945 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
3946 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003947 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003948 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
3949 Args.AddAllArgs(CmdArgs, options::OPT_y);
3950 Args.AddLastArg(CmdArgs, options::OPT_w);
3951 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
3952 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
3953 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
3954 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
3955 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
3956 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
3957 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
3958 Args.AddLastArg(CmdArgs, options::OPT_whyload);
3959 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
3960 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
3961 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
3962 Args.AddLastArg(CmdArgs, options::OPT_Mach);
3963}
3964
3965void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003966 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003967 const InputInfoList &Inputs,
3968 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00003969 const char *LinkingOutput) const {
3970 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00003971
Daniel Dunbarc1964212009-03-26 16:23:12 +00003972 // The logic here is derived from gcc's behavior; most of which
3973 // comes from specs (starting with link_command). Consult gcc for
3974 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00003975 ArgStringList CmdArgs;
3976
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00003977 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
3978 if (Args.hasArg(options::OPT_ccc_arcmt_check,
3979 options::OPT_ccc_arcmt_migrate)) {
3980 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
3981 (*I)->claim();
3982 const char *Exec =
3983 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
3984 CmdArgs.push_back(Output.getFilename());
3985 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3986 return;
3987 }
3988
Daniel Dunbarc1964212009-03-26 16:23:12 +00003989 // I'm not sure why this particular decomposition exists in gcc, but
3990 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00003991 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003992
Daniel Dunbarc1964212009-03-26 16:23:12 +00003993 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
3994 Args.AddAllArgs(CmdArgs, options::OPT_s);
3995 Args.AddAllArgs(CmdArgs, options::OPT_t);
3996 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
3997 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003998 Args.AddLastArg(CmdArgs, options::OPT_e);
3999 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4000 Args.AddAllArgs(CmdArgs, options::OPT_r);
4001
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004002 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4003 // members of static archive libraries which implement Objective-C classes or
4004 // categories.
4005 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4006 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004007
Daniel Dunbarc1964212009-03-26 16:23:12 +00004008 CmdArgs.push_back("-o");
4009 CmdArgs.push_back(Output.getFilename());
4010
Chad Rosier06fd3c62012-05-16 23:45:12 +00004011 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004012 !Args.hasArg(options::OPT_nostartfiles)) {
4013 // Derived from startfile spec.
4014 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004015 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004016 if (getDarwinToolChain().isTargetIOSSimulator()) {
4017 // The simulator doesn't have a versioned crt1 file.
4018 CmdArgs.push_back("-ldylib1.o");
4019 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004020 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4021 CmdArgs.push_back("-ldylib1.o");
4022 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004023 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004024 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004025 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004026 CmdArgs.push_back("-ldylib1.10.5.o");
4027 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004028 } else {
4029 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004030 if (!Args.hasArg(options::OPT_static)) {
4031 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004032 if (getDarwinToolChain().isTargetIOSSimulator()) {
4033 // The simulator doesn't have a versioned crt1 file.
4034 CmdArgs.push_back("-lbundle1.o");
4035 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004036 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4037 CmdArgs.push_back("-lbundle1.o");
4038 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004039 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004040 CmdArgs.push_back("-lbundle1.o");
4041 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004042 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004043 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004044 if (Args.hasArg(options::OPT_pg) &&
4045 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004046 if (Args.hasArg(options::OPT_static) ||
4047 Args.hasArg(options::OPT_object) ||
4048 Args.hasArg(options::OPT_preload)) {
4049 CmdArgs.push_back("-lgcrt0.o");
4050 } else {
4051 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004052
Daniel Dunbarc1964212009-03-26 16:23:12 +00004053 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004054 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004055 // By default on OS X 10.8 and later, we don't link with a crt1.o
4056 // file and the linker knows to use _main as the entry point. But,
4057 // when compiling with -pg, we need to link with the gcrt1.o file,
4058 // so pass the -no_new_main option to tell the linker to use the
4059 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004060 if (getDarwinToolChain().isTargetMacOS() &&
4061 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4062 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004063 } else {
4064 if (Args.hasArg(options::OPT_static) ||
4065 Args.hasArg(options::OPT_object) ||
4066 Args.hasArg(options::OPT_preload)) {
4067 CmdArgs.push_back("-lcrt0.o");
4068 } else {
4069 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004070 if (getDarwinToolChain().isTargetIOSSimulator()) {
4071 // The simulator doesn't have a versioned crt1 file.
4072 CmdArgs.push_back("-lcrt1.o");
4073 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004074 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4075 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004076 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004077 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004078 } else {
4079 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4080 CmdArgs.push_back("-lcrt1.o");
4081 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4082 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004083 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004084 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004085
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004086 // darwin_crt2 spec is empty.
4087 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004088 }
4089 }
4090 }
4091 }
4092
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004093 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4094 Args.hasArg(options::OPT_shared_libgcc) &&
4095 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004096 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004097 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004098 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004099 }
4100 }
4101
4102 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004103
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004104 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonovcc429802012-11-16 12:53:14 +00004105 // If we're building a dynamic lib with -fsanitize=address, or
4106 // -fsanitize=undefined, unresolved symbols may appear. Mark all
4107 // of them as dynamic_lookup. Linking executables is handled in
4108 // lib/Driver/ToolChains.cpp.
4109 if (Sanitize.needsAsanRt() || Sanitize.needsUbsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004110 if (Args.hasArg(options::OPT_dynamiclib) ||
4111 Args.hasArg(options::OPT_bundle)) {
4112 CmdArgs.push_back("-undefined");
4113 CmdArgs.push_back("dynamic_lookup");
4114 }
4115 }
4116
Daniel Dunbarc1964212009-03-26 16:23:12 +00004117 if (Args.hasArg(options::OPT_fopenmp))
4118 // This is more complicated in gcc...
4119 CmdArgs.push_back("-lgomp");
4120
Douglas Gregor9295df02012-05-15 21:00:27 +00004121 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4122
Bob Wilson16d93952012-05-15 18:57:39 +00004123 if (isObjCRuntimeLinked(Args) &&
4124 !Args.hasArg(options::OPT_nostdlib) &&
4125 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004126 // Avoid linking compatibility stubs on i386 mac.
4127 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004128 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004129 // If we don't have ARC or subscripting runtime support, link in the
4130 // runtime stubs. We have to do this *before* adding any of the normal
4131 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004132 ObjCRuntime runtime =
4133 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004134 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004135 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004136 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004137 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004138 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004139 CmdArgs.push_back("-framework");
4140 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004141 // Link libobj.
4142 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004143 }
John McCall31168b02011-06-15 23:02:42 +00004144
Daniel Dunbarc1964212009-03-26 16:23:12 +00004145 if (LinkingOutput) {
4146 CmdArgs.push_back("-arch_multiple");
4147 CmdArgs.push_back("-final_output");
4148 CmdArgs.push_back(LinkingOutput);
4149 }
4150
Daniel Dunbarc1964212009-03-26 16:23:12 +00004151 if (Args.hasArg(options::OPT_fnested_functions))
4152 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004153
Daniel Dunbarc1964212009-03-26 16:23:12 +00004154 if (!Args.hasArg(options::OPT_nostdlib) &&
4155 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004156 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004157 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004158
Daniel Dunbarc1964212009-03-26 16:23:12 +00004159 // link_ssp spec is empty.
4160
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004161 // Let the tool chain choose which runtime library to link.
4162 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004163 }
4164
Chad Rosier06fd3c62012-05-16 23:45:12 +00004165 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004166 !Args.hasArg(options::OPT_nostartfiles)) {
4167 // endfile_spec is empty.
4168 }
4169
4170 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4171 Args.AddAllArgs(CmdArgs, options::OPT_F);
4172
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004173 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004174 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004175 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004176}
4177
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004178void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004179 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004180 const InputInfoList &Inputs,
4181 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004182 const char *LinkingOutput) const {
4183 ArgStringList CmdArgs;
4184
4185 CmdArgs.push_back("-create");
4186 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004187
4188 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004189 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004190
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004191 for (InputInfoList::const_iterator
4192 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4193 const InputInfo &II = *it;
4194 assert(II.isFilename() && "Unexpected lipo input.");
4195 CmdArgs.push_back(II.getFilename());
4196 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004197 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004198 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004199 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004200}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004201
Daniel Dunbar88299622010-06-04 18:28:36 +00004202void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004203 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004204 const InputInfoList &Inputs,
4205 const ArgList &Args,
4206 const char *LinkingOutput) const {
4207 ArgStringList CmdArgs;
4208
Daniel Dunbareb86b042011-05-09 17:23:16 +00004209 CmdArgs.push_back("-o");
4210 CmdArgs.push_back(Output.getFilename());
4211
Daniel Dunbar88299622010-06-04 18:28:36 +00004212 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4213 const InputInfo &Input = Inputs[0];
4214 assert(Input.isFilename() && "Unexpected dsymutil input.");
4215 CmdArgs.push_back(Input.getFilename());
4216
Daniel Dunbar88299622010-06-04 18:28:36 +00004217 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004218 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004219 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004220}
4221
Eric Christopher551ef452011-08-23 17:56:55 +00004222void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4223 const InputInfo &Output,
4224 const InputInfoList &Inputs,
4225 const ArgList &Args,
4226 const char *LinkingOutput) const {
4227 ArgStringList CmdArgs;
4228 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004229 CmdArgs.push_back("--debug-info");
4230 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004231 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004232
4233 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4234 const InputInfo &Input = Inputs[0];
4235 assert(Input.isFilename() && "Unexpected verify input");
4236
4237 // Grabbing the output of the earlier dsymutil run.
4238 CmdArgs.push_back(Input.getFilename());
4239
4240 const char *Exec =
4241 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4242 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4243}
4244
David Chisnallf571cde2012-02-15 13:39:01 +00004245void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4246 const InputInfo &Output,
4247 const InputInfoList &Inputs,
4248 const ArgList &Args,
4249 const char *LinkingOutput) const {
4250 ArgStringList CmdArgs;
4251
4252 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4253 options::OPT_Xassembler);
4254
4255 CmdArgs.push_back("-o");
4256 CmdArgs.push_back(Output.getFilename());
4257
4258 for (InputInfoList::const_iterator
4259 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4260 const InputInfo &II = *it;
4261 CmdArgs.push_back(II.getFilename());
4262 }
4263
4264 const char *Exec =
4265 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4266 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4267}
4268
4269
4270void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4271 const InputInfo &Output,
4272 const InputInfoList &Inputs,
4273 const ArgList &Args,
4274 const char *LinkingOutput) const {
4275 // FIXME: Find a real GCC, don't hard-code versions here
4276 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4277 const llvm::Triple &T = getToolChain().getTriple();
4278 std::string LibPath = "/usr/lib/";
4279 llvm::Triple::ArchType Arch = T.getArch();
4280 switch (Arch) {
4281 case llvm::Triple::x86:
4282 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4283 T.getOSName()).str() + "/4.5.2/";
4284 break;
4285 case llvm::Triple::x86_64:
4286 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4287 T.getOSName()).str();
4288 GCCLibPath += "/4.5.2/amd64/";
4289 LibPath += "amd64/";
4290 break;
4291 default:
4292 assert(0 && "Unsupported architecture");
4293 }
4294
4295 ArgStringList CmdArgs;
4296
David Chisnall272a0712012-02-29 15:06:12 +00004297 // Demangle C++ names in errors
4298 CmdArgs.push_back("-C");
4299
David Chisnallf571cde2012-02-15 13:39:01 +00004300 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4301 (!Args.hasArg(options::OPT_shared))) {
4302 CmdArgs.push_back("-e");
4303 CmdArgs.push_back("_start");
4304 }
4305
4306 if (Args.hasArg(options::OPT_static)) {
4307 CmdArgs.push_back("-Bstatic");
4308 CmdArgs.push_back("-dn");
4309 } else {
4310 CmdArgs.push_back("-Bdynamic");
4311 if (Args.hasArg(options::OPT_shared)) {
4312 CmdArgs.push_back("-shared");
4313 } else {
4314 CmdArgs.push_back("--dynamic-linker");
4315 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4316 }
4317 }
4318
4319 if (Output.isFilename()) {
4320 CmdArgs.push_back("-o");
4321 CmdArgs.push_back(Output.getFilename());
4322 } else {
4323 assert(Output.isNothing() && "Invalid output.");
4324 }
4325
4326 if (!Args.hasArg(options::OPT_nostdlib) &&
4327 !Args.hasArg(options::OPT_nostartfiles)) {
4328 if (!Args.hasArg(options::OPT_shared)) {
4329 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4330 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004331 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004332 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4333 } else {
4334 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004335 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4336 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004337 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004338 if (getToolChain().getDriver().CCCIsCXX)
4339 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004340 }
4341
4342 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4343
4344 Args.AddAllArgs(CmdArgs, options::OPT_L);
4345 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4346 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004347 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004348
4349 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4350
4351 if (!Args.hasArg(options::OPT_nostdlib) &&
4352 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004353 if (getToolChain().getDriver().CCCIsCXX)
4354 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004355 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004356 if (!Args.hasArg(options::OPT_shared)) {
4357 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004358 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004359 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004360 }
David Chisnallf571cde2012-02-15 13:39:01 +00004361 }
4362
4363 if (!Args.hasArg(options::OPT_nostdlib) &&
4364 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004365 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004366 }
David Chisnall96de9932012-02-16 16:00:47 +00004367 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004368
4369 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4370
4371 const char *Exec =
4372 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4373 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4374}
4375
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004376void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004377 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004378 const InputInfoList &Inputs,
4379 const ArgList &Args,
4380 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004381 ArgStringList CmdArgs;
4382
4383 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4384 options::OPT_Xassembler);
4385
4386 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004387 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004388
4389 for (InputInfoList::const_iterator
4390 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4391 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004392 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004393 }
4394
4395 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004396 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004397 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004398}
4399
4400void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004401 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004402 const InputInfoList &Inputs,
4403 const ArgList &Args,
4404 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004405 ArgStringList CmdArgs;
4406
4407 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004408 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004409 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004410 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004411 }
4412
4413 if (Args.hasArg(options::OPT_static)) {
4414 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004415 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004416 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004417// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004418 CmdArgs.push_back("-Bdynamic");
4419 if (Args.hasArg(options::OPT_shared)) {
4420 CmdArgs.push_back("-shared");
4421 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004422 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004423 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4424 }
4425 }
4426
Daniel Dunbarb440f562010-08-02 02:38:21 +00004427 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004428 CmdArgs.push_back("-o");
4429 CmdArgs.push_back(Output.getFilename());
4430 } else {
4431 assert(Output.isNothing() && "Invalid output.");
4432 }
4433
4434 if (!Args.hasArg(options::OPT_nostdlib) &&
4435 !Args.hasArg(options::OPT_nostartfiles)) {
4436 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004437 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004438 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004439 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004440 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004441 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004442 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004443 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004444 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004445 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004446 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004447 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004448 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004449 }
4450
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004451 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4452 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004453 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004454
4455 Args.AddAllArgs(CmdArgs, options::OPT_L);
4456 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4457 Args.AddAllArgs(CmdArgs, options::OPT_e);
4458
Daniel Dunbar54423b22010-09-17 00:24:54 +00004459 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004460
4461 if (!Args.hasArg(options::OPT_nostdlib) &&
4462 !Args.hasArg(options::OPT_nodefaultlibs)) {
4463 // FIXME: For some reason GCC passes -lgcc before adding
4464 // the default system libraries. Just mimic this for now.
4465 CmdArgs.push_back("-lgcc");
4466
4467 if (Args.hasArg(options::OPT_pthread))
4468 CmdArgs.push_back("-pthread");
4469 if (!Args.hasArg(options::OPT_shared))
4470 CmdArgs.push_back("-lc");
4471 CmdArgs.push_back("-lgcc");
4472 }
4473
4474 if (!Args.hasArg(options::OPT_nostdlib) &&
4475 !Args.hasArg(options::OPT_nostartfiles)) {
4476 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004477 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004478 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004479 }
4480
Bill Wendling08760582011-06-27 19:15:03 +00004481 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004482
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004483 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004484 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004485 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004486}
4487
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004488void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004489 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004490 const InputInfoList &Inputs,
4491 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004492 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004493 ArgStringList CmdArgs;
4494
4495 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4496 options::OPT_Xassembler);
4497
4498 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004499 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004500
4501 for (InputInfoList::const_iterator
4502 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4503 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004504 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004505 }
4506
4507 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004508 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004509 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004510}
4511
4512void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004513 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004514 const InputInfoList &Inputs,
4515 const ArgList &Args,
4516 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004517 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004518 ArgStringList CmdArgs;
4519
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004520 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004521 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004522 CmdArgs.push_back("-e");
4523 CmdArgs.push_back("__start");
4524 }
4525
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004526 if (Args.hasArg(options::OPT_static)) {
4527 CmdArgs.push_back("-Bstatic");
4528 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004529 if (Args.hasArg(options::OPT_rdynamic))
4530 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004531 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004532 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004533 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004534 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004535 } else {
4536 CmdArgs.push_back("-dynamic-linker");
4537 CmdArgs.push_back("/usr/libexec/ld.so");
4538 }
4539 }
4540
Daniel Dunbarb440f562010-08-02 02:38:21 +00004541 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004542 CmdArgs.push_back("-o");
4543 CmdArgs.push_back(Output.getFilename());
4544 } else {
4545 assert(Output.isNothing() && "Invalid output.");
4546 }
4547
4548 if (!Args.hasArg(options::OPT_nostdlib) &&
4549 !Args.hasArg(options::OPT_nostartfiles)) {
4550 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004551 if (Args.hasArg(options::OPT_pg))
4552 CmdArgs.push_back(Args.MakeArgString(
4553 getToolChain().GetFilePath("gcrt0.o")));
4554 else
4555 CmdArgs.push_back(Args.MakeArgString(
4556 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004557 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004558 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004559 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004560 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004561 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004562 }
4563 }
4564
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004565 std::string Triple = getToolChain().getTripleString();
4566 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004567 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004568 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004569 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004570
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004571 Args.AddAllArgs(CmdArgs, options::OPT_L);
4572 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4573 Args.AddAllArgs(CmdArgs, options::OPT_e);
4574
Daniel Dunbar54423b22010-09-17 00:24:54 +00004575 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004576
4577 if (!Args.hasArg(options::OPT_nostdlib) &&
4578 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004579 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004580 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004581 if (Args.hasArg(options::OPT_pg))
4582 CmdArgs.push_back("-lm_p");
4583 else
4584 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004585 }
4586
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004587 // FIXME: For some reason GCC passes -lgcc before adding
4588 // the default system libraries. Just mimic this for now.
4589 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004590
Eric Christopher17674ec2012-09-13 06:32:34 +00004591 if (Args.hasArg(options::OPT_pthread)) {
4592 if (!Args.hasArg(options::OPT_shared) &&
4593 Args.hasArg(options::OPT_pg))
4594 CmdArgs.push_back("-lpthread_p");
4595 else
4596 CmdArgs.push_back("-lpthread");
4597 }
4598
Chandler Carruth45661652011-12-17 22:32:42 +00004599 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004600 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004601 CmdArgs.push_back("-lc_p");
4602 else
4603 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004604 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004605
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004606 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004607 }
4608
4609 if (!Args.hasArg(options::OPT_nostdlib) &&
4610 !Args.hasArg(options::OPT_nostartfiles)) {
4611 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004612 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004613 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004614 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004615 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004616 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004617 }
4618
4619 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004620 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004621 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004622}
Ed Schoutene33194b2009-04-02 19:13:12 +00004623
Eli Friedman9fa28852012-08-08 23:57:20 +00004624void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4625 const InputInfo &Output,
4626 const InputInfoList &Inputs,
4627 const ArgList &Args,
4628 const char *LinkingOutput) const {
4629 ArgStringList CmdArgs;
4630
4631 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4632 options::OPT_Xassembler);
4633
4634 CmdArgs.push_back("-o");
4635 CmdArgs.push_back(Output.getFilename());
4636
4637 for (InputInfoList::const_iterator
4638 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4639 const InputInfo &II = *it;
4640 CmdArgs.push_back(II.getFilename());
4641 }
4642
4643 const char *Exec =
4644 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4645 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4646}
4647
4648void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4649 const InputInfo &Output,
4650 const InputInfoList &Inputs,
4651 const ArgList &Args,
4652 const char *LinkingOutput) const {
4653 const Driver &D = getToolChain().getDriver();
4654 ArgStringList CmdArgs;
4655
4656 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4657 (!Args.hasArg(options::OPT_shared))) {
4658 CmdArgs.push_back("-e");
4659 CmdArgs.push_back("__start");
4660 }
4661
4662 if (Args.hasArg(options::OPT_static)) {
4663 CmdArgs.push_back("-Bstatic");
4664 } else {
4665 if (Args.hasArg(options::OPT_rdynamic))
4666 CmdArgs.push_back("-export-dynamic");
4667 CmdArgs.push_back("--eh-frame-hdr");
4668 CmdArgs.push_back("-Bdynamic");
4669 if (Args.hasArg(options::OPT_shared)) {
4670 CmdArgs.push_back("-shared");
4671 } else {
4672 CmdArgs.push_back("-dynamic-linker");
4673 CmdArgs.push_back("/usr/libexec/ld.so");
4674 }
4675 }
4676
4677 if (Output.isFilename()) {
4678 CmdArgs.push_back("-o");
4679 CmdArgs.push_back(Output.getFilename());
4680 } else {
4681 assert(Output.isNothing() && "Invalid output.");
4682 }
4683
4684 if (!Args.hasArg(options::OPT_nostdlib) &&
4685 !Args.hasArg(options::OPT_nostartfiles)) {
4686 if (!Args.hasArg(options::OPT_shared)) {
4687 if (Args.hasArg(options::OPT_pg))
4688 CmdArgs.push_back(Args.MakeArgString(
4689 getToolChain().GetFilePath("gcrt0.o")));
4690 else
4691 CmdArgs.push_back(Args.MakeArgString(
4692 getToolChain().GetFilePath("crt0.o")));
4693 CmdArgs.push_back(Args.MakeArgString(
4694 getToolChain().GetFilePath("crtbegin.o")));
4695 } else {
4696 CmdArgs.push_back(Args.MakeArgString(
4697 getToolChain().GetFilePath("crtbeginS.o")));
4698 }
4699 }
4700
4701 Args.AddAllArgs(CmdArgs, options::OPT_L);
4702 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4703 Args.AddAllArgs(CmdArgs, options::OPT_e);
4704
4705 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4706
4707 if (!Args.hasArg(options::OPT_nostdlib) &&
4708 !Args.hasArg(options::OPT_nodefaultlibs)) {
4709 if (D.CCCIsCXX) {
4710 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4711 if (Args.hasArg(options::OPT_pg))
4712 CmdArgs.push_back("-lm_p");
4713 else
4714 CmdArgs.push_back("-lm");
4715 }
4716
Rafael Espindola1ad26f02012-10-23 17:07:31 +00004717 if (Args.hasArg(options::OPT_pthread)) {
4718 if (!Args.hasArg(options::OPT_shared) &&
4719 Args.hasArg(options::OPT_pg))
4720 CmdArgs.push_back("-lpthread_p");
4721 else
4722 CmdArgs.push_back("-lpthread");
4723 }
4724
Eli Friedman9fa28852012-08-08 23:57:20 +00004725 if (!Args.hasArg(options::OPT_shared)) {
4726 if (Args.hasArg(options::OPT_pg))
4727 CmdArgs.push_back("-lc_p");
4728 else
4729 CmdArgs.push_back("-lc");
4730 }
4731
4732 std::string myarch = "-lclang_rt.";
4733 const llvm::Triple &T = getToolChain().getTriple();
4734 llvm::Triple::ArchType Arch = T.getArch();
4735 switch (Arch) {
4736 case llvm::Triple::arm:
4737 myarch += ("arm");
4738 break;
4739 case llvm::Triple::x86:
4740 myarch += ("i386");
4741 break;
4742 case llvm::Triple::x86_64:
4743 myarch += ("amd64");
4744 break;
4745 default:
4746 assert(0 && "Unsupported architecture");
4747 }
4748 CmdArgs.push_back(Args.MakeArgString(myarch));
4749 }
4750
4751 if (!Args.hasArg(options::OPT_nostdlib) &&
4752 !Args.hasArg(options::OPT_nostartfiles)) {
4753 if (!Args.hasArg(options::OPT_shared))
4754 CmdArgs.push_back(Args.MakeArgString(
4755 getToolChain().GetFilePath("crtend.o")));
4756 else
4757 CmdArgs.push_back(Args.MakeArgString(
4758 getToolChain().GetFilePath("crtendS.o")));
4759 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00004760
4761 const char *Exec =
4762 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4763 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00004764}
4765
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004766void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004767 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004768 const InputInfoList &Inputs,
4769 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004770 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004771 ArgStringList CmdArgs;
4772
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004773 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4774 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004775 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004776 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004777 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00004778 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004779 else if (getToolChain().getArch() == llvm::Triple::mips ||
4780 getToolChain().getArch() == llvm::Triple::mipsel ||
4781 getToolChain().getArch() == llvm::Triple::mips64 ||
4782 getToolChain().getArch() == llvm::Triple::mips64el) {
4783 StringRef CPUName;
4784 StringRef ABIName;
4785 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004786
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004787 CmdArgs.push_back("-march");
4788 CmdArgs.push_back(CPUName.data());
4789
4790 // Convert ABI name to the GNU tools acceptable variant.
4791 if (ABIName == "o32")
4792 ABIName = "32";
4793 else if (ABIName == "n64")
4794 ABIName = "64";
4795
4796 CmdArgs.push_back("-mabi");
4797 CmdArgs.push_back(ABIName.data());
4798
4799 if (getToolChain().getArch() == llvm::Triple::mips ||
4800 getToolChain().getArch() == llvm::Triple::mips64)
4801 CmdArgs.push_back("-EB");
4802 else
4803 CmdArgs.push_back("-EL");
4804
4805 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
4806 options::OPT_fpic, options::OPT_fno_pic,
4807 options::OPT_fPIE, options::OPT_fno_PIE,
4808 options::OPT_fpie, options::OPT_fno_pie);
4809 if (LastPICArg &&
4810 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
4811 LastPICArg->getOption().matches(options::OPT_fpic) ||
4812 LastPICArg->getOption().matches(options::OPT_fPIE) ||
4813 LastPICArg->getOption().matches(options::OPT_fpie))) {
4814 CmdArgs.push_back("-KPIC");
4815 }
4816 }
Eric Christopher0b26a612010-03-02 02:41:08 +00004817
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004818 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4819 options::OPT_Xassembler);
4820
4821 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004822 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004823
4824 for (InputInfoList::const_iterator
4825 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4826 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004827 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004828 }
4829
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004830 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004831 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004832 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004833}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004834
4835void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004836 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004837 const InputInfoList &Inputs,
4838 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004839 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00004840 const toolchains::FreeBSD& ToolChain =
4841 static_cast<const toolchains::FreeBSD&>(getToolChain());
4842 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004843 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00004844
4845 // Silence warning for "clang -g foo.o -o foo"
4846 Args.ClaimAllArgs(options::OPT_g_Group);
4847 // and "clang -emit-llvm foo.o -o foo"
4848 Args.ClaimAllArgs(options::OPT_emit_llvm);
4849 // and for "clang -w foo.o -o foo". Other warning options are already
4850 // handled somewhere else.
4851 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004852
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00004853 if (!D.SysRoot.empty())
4854 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
4855
Roman Divackyafe2f232012-08-28 15:09:03 +00004856 if (Args.hasArg(options::OPT_pie))
4857 CmdArgs.push_back("-pie");
4858
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004859 if (Args.hasArg(options::OPT_static)) {
4860 CmdArgs.push_back("-Bstatic");
4861 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004862 if (Args.hasArg(options::OPT_rdynamic))
4863 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004864 CmdArgs.push_back("--eh-frame-hdr");
4865 if (Args.hasArg(options::OPT_shared)) {
4866 CmdArgs.push_back("-Bshareable");
4867 } else {
4868 CmdArgs.push_back("-dynamic-linker");
4869 CmdArgs.push_back("/libexec/ld-elf.so.1");
4870 }
Roman Divackyafe2f232012-08-28 15:09:03 +00004871 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
4872 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00004873 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
4874 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
4875 CmdArgs.push_back("--hash-style=both");
4876 }
4877 }
4878 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004879 }
4880
4881 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4882 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004883 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004884 CmdArgs.push_back("-m");
4885 CmdArgs.push_back("elf_i386_fbsd");
4886 }
4887
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004888 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00004889 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00004890 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00004891 }
4892
Daniel Dunbarb440f562010-08-02 02:38:21 +00004893 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004894 CmdArgs.push_back("-o");
4895 CmdArgs.push_back(Output.getFilename());
4896 } else {
4897 assert(Output.isNothing() && "Invalid output.");
4898 }
4899
4900 if (!Args.hasArg(options::OPT_nostdlib) &&
4901 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00004902 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004903 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00004904 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00004905 crt1 = "gcrt1.o";
4906 else if (Args.hasArg(options::OPT_pie))
4907 crt1 = "Scrt1.o";
4908 else
4909 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004910 }
Roman Divackyafe2f232012-08-28 15:09:03 +00004911 if (crt1)
4912 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
4913
4914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
4915
4916 const char *crtbegin = NULL;
4917 if (Args.hasArg(options::OPT_static))
4918 crtbegin = "crtbeginT.o";
4919 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
4920 crtbegin = "crtbeginS.o";
4921 else
4922 crtbegin = "crtbegin.o";
4923
4924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004925 }
4926
4927 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00004928 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00004929 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
4930 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004931 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004932 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4933 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00004934 Args.AddAllArgs(CmdArgs, options::OPT_s);
4935 Args.AddAllArgs(CmdArgs, options::OPT_t);
4936 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4937 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004938
Roman Divackyafe2f232012-08-28 15:09:03 +00004939 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004940
4941 if (!Args.hasArg(options::OPT_nostdlib) &&
4942 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00004943 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00004944 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00004945 if (Args.hasArg(options::OPT_pg))
4946 CmdArgs.push_back("-lm_p");
4947 else
4948 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00004949 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004950 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
4951 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00004952 if (Args.hasArg(options::OPT_pg))
4953 CmdArgs.push_back("-lgcc_p");
4954 else
4955 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004956 if (Args.hasArg(options::OPT_static)) {
4957 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00004958 } else if (Args.hasArg(options::OPT_pg)) {
4959 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004960 } else {
4961 CmdArgs.push_back("--as-needed");
4962 CmdArgs.push_back("-lgcc_s");
4963 CmdArgs.push_back("--no-as-needed");
4964 }
4965
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00004966 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00004967 if (Args.hasArg(options::OPT_pg))
4968 CmdArgs.push_back("-lpthread_p");
4969 else
4970 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00004971 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004972
Roman Divacky66f22762011-02-10 16:59:40 +00004973 if (Args.hasArg(options::OPT_pg)) {
4974 if (Args.hasArg(options::OPT_shared))
4975 CmdArgs.push_back("-lc");
4976 else
4977 CmdArgs.push_back("-lc_p");
4978 CmdArgs.push_back("-lgcc_p");
4979 } else {
4980 CmdArgs.push_back("-lc");
4981 CmdArgs.push_back("-lgcc");
4982 }
4983
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004984 if (Args.hasArg(options::OPT_static)) {
4985 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00004986 } else if (Args.hasArg(options::OPT_pg)) {
4987 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004988 } else {
4989 CmdArgs.push_back("--as-needed");
4990 CmdArgs.push_back("-lgcc_s");
4991 CmdArgs.push_back("--no-as-needed");
4992 }
4993 }
4994
4995 if (!Args.hasArg(options::OPT_nostdlib) &&
4996 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00004997 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00004998 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00004999 else
5000 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005001 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005002 }
5003
Roman Divackyafe2f232012-08-28 15:09:03 +00005004 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005005
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005006 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005007 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005008 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005009}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005010
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005011void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5012 const InputInfo &Output,
5013 const InputInfoList &Inputs,
5014 const ArgList &Args,
5015 const char *LinkingOutput) const {
5016 ArgStringList CmdArgs;
5017
5018 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5019 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005020 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005021 CmdArgs.push_back("--32");
5022
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005023 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005024 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005025 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005026 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005027 CmdArgs.push_back("-EL");
5028
5029 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5030 options::OPT_Xassembler);
5031
5032 CmdArgs.push_back("-o");
5033 CmdArgs.push_back(Output.getFilename());
5034
5035 for (InputInfoList::const_iterator
5036 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5037 const InputInfo &II = *it;
5038 CmdArgs.push_back(II.getFilename());
5039 }
5040
David Chisnallddbd68f2011-09-27 22:03:18 +00005041 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5043}
5044
5045void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5046 const InputInfo &Output,
5047 const InputInfoList &Inputs,
5048 const ArgList &Args,
5049 const char *LinkingOutput) const {
5050 const Driver &D = getToolChain().getDriver();
5051 ArgStringList CmdArgs;
5052
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005053 if (!D.SysRoot.empty())
5054 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5055
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005056 if (Args.hasArg(options::OPT_static)) {
5057 CmdArgs.push_back("-Bstatic");
5058 } else {
5059 if (Args.hasArg(options::OPT_rdynamic))
5060 CmdArgs.push_back("-export-dynamic");
5061 CmdArgs.push_back("--eh-frame-hdr");
5062 if (Args.hasArg(options::OPT_shared)) {
5063 CmdArgs.push_back("-Bshareable");
5064 } else {
5065 CmdArgs.push_back("-dynamic-linker");
5066 CmdArgs.push_back("/libexec/ld.elf_so");
5067 }
5068 }
5069
5070 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5071 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005072 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005073 CmdArgs.push_back("-m");
5074 CmdArgs.push_back("elf_i386");
5075 }
5076
5077 if (Output.isFilename()) {
5078 CmdArgs.push_back("-o");
5079 CmdArgs.push_back(Output.getFilename());
5080 } else {
5081 assert(Output.isNothing() && "Invalid output.");
5082 }
5083
5084 if (!Args.hasArg(options::OPT_nostdlib) &&
5085 !Args.hasArg(options::OPT_nostartfiles)) {
5086 if (!Args.hasArg(options::OPT_shared)) {
5087 CmdArgs.push_back(Args.MakeArgString(
5088 getToolChain().GetFilePath("crt0.o")));
5089 CmdArgs.push_back(Args.MakeArgString(
5090 getToolChain().GetFilePath("crti.o")));
5091 CmdArgs.push_back(Args.MakeArgString(
5092 getToolChain().GetFilePath("crtbegin.o")));
5093 } else {
5094 CmdArgs.push_back(Args.MakeArgString(
5095 getToolChain().GetFilePath("crti.o")));
5096 CmdArgs.push_back(Args.MakeArgString(
5097 getToolChain().GetFilePath("crtbeginS.o")));
5098 }
5099 }
5100
5101 Args.AddAllArgs(CmdArgs, options::OPT_L);
5102 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5103 Args.AddAllArgs(CmdArgs, options::OPT_e);
5104 Args.AddAllArgs(CmdArgs, options::OPT_s);
5105 Args.AddAllArgs(CmdArgs, options::OPT_t);
5106 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5107 Args.AddAllArgs(CmdArgs, options::OPT_r);
5108
5109 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5110
5111 if (!Args.hasArg(options::OPT_nostdlib) &&
5112 !Args.hasArg(options::OPT_nodefaultlibs)) {
5113 if (D.CCCIsCXX) {
5114 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5115 CmdArgs.push_back("-lm");
5116 }
5117 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5118 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005119 if (Args.hasArg(options::OPT_static)) {
5120 CmdArgs.push_back("-lgcc_eh");
5121 } else {
5122 CmdArgs.push_back("--as-needed");
5123 CmdArgs.push_back("-lgcc_s");
5124 CmdArgs.push_back("--no-as-needed");
5125 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005126 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005127
5128 if (Args.hasArg(options::OPT_pthread))
5129 CmdArgs.push_back("-lpthread");
5130 CmdArgs.push_back("-lc");
5131
5132 CmdArgs.push_back("-lgcc");
5133 if (Args.hasArg(options::OPT_static)) {
5134 CmdArgs.push_back("-lgcc_eh");
5135 } else {
5136 CmdArgs.push_back("--as-needed");
5137 CmdArgs.push_back("-lgcc_s");
5138 CmdArgs.push_back("--no-as-needed");
5139 }
5140 }
5141
5142 if (!Args.hasArg(options::OPT_nostdlib) &&
5143 !Args.hasArg(options::OPT_nostartfiles)) {
5144 if (!Args.hasArg(options::OPT_shared))
5145 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5146 "crtend.o")));
5147 else
5148 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5149 "crtendS.o")));
5150 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5151 "crtn.o")));
5152 }
5153
Bill Wendling08760582011-06-27 19:15:03 +00005154 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005155
David Chisnallddbd68f2011-09-27 22:03:18 +00005156 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005157 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5158}
5159
Rafael Espindola92b00932010-08-10 00:25:48 +00005160void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5161 const InputInfo &Output,
5162 const InputInfoList &Inputs,
5163 const ArgList &Args,
5164 const char *LinkingOutput) const {
5165 ArgStringList CmdArgs;
5166
5167 // Add --32/--64 to make sure we get the format we want.
5168 // This is incomplete
5169 if (getToolChain().getArch() == llvm::Triple::x86) {
5170 CmdArgs.push_back("--32");
5171 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5172 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005173 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5174 CmdArgs.push_back("-a32");
5175 CmdArgs.push_back("-mppc");
5176 CmdArgs.push_back("-many");
5177 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5178 CmdArgs.push_back("-a64");
5179 CmdArgs.push_back("-mppc64");
5180 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005181 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005182 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005183 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5184 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005185
5186 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5187 getToolChain().getTriple());
5188 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005189
5190 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5191 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5192 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005193 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5194 getToolChain().getArch() == llvm::Triple::mipsel ||
5195 getToolChain().getArch() == llvm::Triple::mips64 ||
5196 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005197 StringRef CPUName;
5198 StringRef ABIName;
5199 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005200
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005201 CmdArgs.push_back("-march");
5202 CmdArgs.push_back(CPUName.data());
5203
5204 // Convert ABI name to the GNU tools acceptable variant.
5205 if (ABIName == "o32")
5206 ABIName = "32";
5207 else if (ABIName == "n64")
5208 ABIName = "64";
5209
5210 CmdArgs.push_back("-mabi");
5211 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005212
5213 if (getToolChain().getArch() == llvm::Triple::mips ||
5214 getToolChain().getArch() == llvm::Triple::mips64)
5215 CmdArgs.push_back("-EB");
5216 else
5217 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005218
5219 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5220 options::OPT_fpic, options::OPT_fno_pic,
5221 options::OPT_fPIE, options::OPT_fno_PIE,
5222 options::OPT_fpie, options::OPT_fno_pie);
5223 if (LastPICArg &&
5224 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5225 LastPICArg->getOption().matches(options::OPT_fpic) ||
5226 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5227 LastPICArg->getOption().matches(options::OPT_fpie))) {
5228 CmdArgs.push_back("-KPIC");
5229 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005230 }
5231
5232 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5233 options::OPT_Xassembler);
5234
5235 CmdArgs.push_back("-o");
5236 CmdArgs.push_back(Output.getFilename());
5237
5238 for (InputInfoList::const_iterator
5239 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5240 const InputInfo &II = *it;
5241 CmdArgs.push_back(II.getFilename());
5242 }
5243
5244 const char *Exec =
5245 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5246 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5247}
5248
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005249static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5250 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005251 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien3d3373c2012-11-19 12:04:11 +00005252 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5253 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolacc354322011-10-17 21:39:04 +00005254 if (!D.CCCIsCXX)
5255 CmdArgs.push_back("-lgcc");
5256
Logan Chien3d3373c2012-11-19 12:04:11 +00005257 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005258 if (D.CCCIsCXX)
5259 CmdArgs.push_back("-lgcc");
5260 } else {
5261 if (!D.CCCIsCXX)
5262 CmdArgs.push_back("--as-needed");
5263 CmdArgs.push_back("-lgcc_s");
5264 if (!D.CCCIsCXX)
5265 CmdArgs.push_back("--no-as-needed");
5266 }
5267
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005268 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005269 CmdArgs.push_back("-lgcc_eh");
5270 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5271 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005272
5273 // According to Android ABI, we have to link with libdl if we are
5274 // linking with non-static libgcc.
5275 //
5276 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5277 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5278 if (isAndroid && !StaticLibgcc)
5279 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005280}
5281
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005282static bool hasMipsN32ABIArg(const ArgList &Args) {
5283 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005284 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005285}
5286
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005287void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5288 const InputInfo &Output,
5289 const InputInfoList &Inputs,
5290 const ArgList &Args,
5291 const char *LinkingOutput) const {
5292 const toolchains::Linux& ToolChain =
5293 static_cast<const toolchains::Linux&>(getToolChain());
5294 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005295 const bool isAndroid =
5296 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005297
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005298 ArgStringList CmdArgs;
5299
Rafael Espindolad1002f62010-11-15 18:28:16 +00005300 // Silence warning for "clang -g foo.o -o foo"
5301 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005302 // and "clang -emit-llvm foo.o -o foo"
5303 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005304 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005305 // handled somewhere else.
5306 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005307
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005308 if (!D.SysRoot.empty())
5309 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005310
Rafael Espindolad47ac232010-11-17 22:26:15 +00005311 if (Args.hasArg(options::OPT_pie))
5312 CmdArgs.push_back("-pie");
5313
Rafael Espindola1c76c592010-11-07 22:57:16 +00005314 if (Args.hasArg(options::OPT_rdynamic))
5315 CmdArgs.push_back("-export-dynamic");
5316
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005317 if (Args.hasArg(options::OPT_s))
5318 CmdArgs.push_back("-s");
5319
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005320 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5321 e = ToolChain.ExtraOpts.end();
5322 i != e; ++i)
5323 CmdArgs.push_back(i->c_str());
5324
5325 if (!Args.hasArg(options::OPT_static)) {
5326 CmdArgs.push_back("--eh-frame-hdr");
5327 }
5328
5329 CmdArgs.push_back("-m");
5330 if (ToolChain.getArch() == llvm::Triple::x86)
5331 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005332 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005333 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005334 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005335 else if (ToolChain.getArch() == llvm::Triple::ppc)
5336 CmdArgs.push_back("elf32ppclinux");
5337 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5338 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005339 else if (ToolChain.getArch() == llvm::Triple::mips)
5340 CmdArgs.push_back("elf32btsmip");
5341 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5342 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005343 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5344 if (hasMipsN32ABIArg(Args))
5345 CmdArgs.push_back("elf32btsmipn32");
5346 else
5347 CmdArgs.push_back("elf64btsmip");
5348 }
5349 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5350 if (hasMipsN32ABIArg(Args))
5351 CmdArgs.push_back("elf32ltsmipn32");
5352 else
5353 CmdArgs.push_back("elf64ltsmip");
5354 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005355 else
5356 CmdArgs.push_back("elf_x86_64");
5357
5358 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005359 if (ToolChain.getArch() == llvm::Triple::arm
5360 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005361 CmdArgs.push_back("-Bstatic");
5362 else
5363 CmdArgs.push_back("-static");
5364 } else if (Args.hasArg(options::OPT_shared)) {
5365 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005366 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005367 CmdArgs.push_back("-Bsymbolic");
5368 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005369 }
5370
5371 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005372 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005373 (!Args.hasArg(options::OPT_static) &&
5374 !Args.hasArg(options::OPT_shared))) {
5375 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005376 if (isAndroid)
5377 CmdArgs.push_back("/system/bin/linker");
5378 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005379 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005380 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005381 ToolChain.getArch() == llvm::Triple::thumb) {
5382 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5383 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5384 else
5385 CmdArgs.push_back("/lib/ld-linux.so.3");
5386 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005387 else if (ToolChain.getArch() == llvm::Triple::mips ||
5388 ToolChain.getArch() == llvm::Triple::mipsel)
5389 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005390 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005391 ToolChain.getArch() == llvm::Triple::mips64el) {
5392 if (hasMipsN32ABIArg(Args))
5393 CmdArgs.push_back("/lib32/ld.so.1");
5394 else
5395 CmdArgs.push_back("/lib64/ld.so.1");
5396 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005397 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005398 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005399 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005400 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005401 else
5402 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5403 }
5404
5405 CmdArgs.push_back("-o");
5406 CmdArgs.push_back(Output.getFilename());
5407
Rafael Espindola81937ec2010-12-01 01:52:43 +00005408 if (!Args.hasArg(options::OPT_nostdlib) &&
5409 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005410 if (!isAndroid) {
5411 const char *crt1 = NULL;
5412 if (!Args.hasArg(options::OPT_shared)){
5413 if (Args.hasArg(options::OPT_pie))
5414 crt1 = "Scrt1.o";
5415 else
5416 crt1 = "crt1.o";
5417 }
5418 if (crt1)
5419 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005420
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005421 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5422 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005423
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005424 const char *crtbegin;
5425 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005426 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005427 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005428 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005429 else if (Args.hasArg(options::OPT_pie))
5430 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005431 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005432 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005433 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005434
5435 // Add crtfastmath.o if available and fast math is enabled.
5436 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005437 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005438
5439 Args.AddAllArgs(CmdArgs, options::OPT_L);
5440
5441 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5442
Roman Divackyee8188a2011-03-01 17:53:14 +00005443 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5444 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005445 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005446
Rafael Espindola9446d762012-04-09 23:53:34 +00005447 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5448 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5449 // forward.
5450 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5451 CmdArgs.push_back("-plugin");
5452 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5453 CmdArgs.push_back(Args.MakeArgString(Plugin));
5454 }
5455
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005456 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5457 CmdArgs.push_back("--no-demangle");
5458
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005459 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5460
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005461 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005462
Eric Christopher04997782012-11-29 18:51:05 +00005463 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005464 if (Sanitize.needsUbsanRt())
5465 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Eric Christopher04997782012-11-29 18:51:05 +00005466 if (Sanitize.needsAsanRt())
5467 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5468 if (Sanitize.needsTsanRt())
5469 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00005470 if (Sanitize.needsMsanRt())
5471 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005472
Chandler Carruth94a32012012-05-14 18:31:18 +00005473 if (D.CCCIsCXX &&
5474 !Args.hasArg(options::OPT_nostdlib) &&
5475 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005476 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5477 !Args.hasArg(options::OPT_static);
5478 if (OnlyLibstdcxxStatic)
5479 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005480 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005481 if (OnlyLibstdcxxStatic)
5482 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005483 CmdArgs.push_back("-lm");
5484 }
5485
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005486 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005487 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5488 if (Args.hasArg(options::OPT_static))
5489 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005490
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005491 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005492
Chandler Carruth94a32012012-05-14 18:31:18 +00005493 if (Args.hasArg(options::OPT_pthread) ||
5494 Args.hasArg(options::OPT_pthreads))
5495 CmdArgs.push_back("-lpthread");
5496
5497 CmdArgs.push_back("-lc");
5498
5499 if (Args.hasArg(options::OPT_static))
5500 CmdArgs.push_back("--end-group");
5501 else
5502 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5503 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005504
Rafael Espindola81937ec2010-12-01 01:52:43 +00005505 if (!Args.hasArg(options::OPT_nostartfiles)) {
5506 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005507 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005508 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005509 else if (Args.hasArg(options::OPT_pie))
5510 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005511 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005512 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005513
Rafael Espindola81937ec2010-12-01 01:52:43 +00005514 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005515 if (!isAndroid)
5516 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005517 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005518 }
5519
Bill Wendling08760582011-06-27 19:15:03 +00005520 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005521
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005522 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5523}
Rafael Espindola92b00932010-08-10 00:25:48 +00005524
Chris Lattner3e2ee142010-07-07 16:01:42 +00005525void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005526 const InputInfo &Output,
5527 const InputInfoList &Inputs,
5528 const ArgList &Args,
5529 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005530 ArgStringList CmdArgs;
5531
5532 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5533 options::OPT_Xassembler);
5534
5535 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005536 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005537
5538 for (InputInfoList::const_iterator
5539 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5540 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005541 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005542 }
5543
5544 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005545 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005546 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005547}
5548
5549void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005550 const InputInfo &Output,
5551 const InputInfoList &Inputs,
5552 const ArgList &Args,
5553 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005554 const Driver &D = getToolChain().getDriver();
5555 ArgStringList CmdArgs;
5556
Daniel Dunbarb440f562010-08-02 02:38:21 +00005557 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005558 CmdArgs.push_back("-o");
5559 CmdArgs.push_back(Output.getFilename());
5560 } else {
5561 assert(Output.isNothing() && "Invalid output.");
5562 }
5563
5564 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005565 !Args.hasArg(options::OPT_nostartfiles)) {
5566 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5567 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5568 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5569 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5570 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005571
5572 Args.AddAllArgs(CmdArgs, options::OPT_L);
5573 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5574 Args.AddAllArgs(CmdArgs, options::OPT_e);
5575
Daniel Dunbar54423b22010-09-17 00:24:54 +00005576 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005577
Eli Friedman83de5132011-12-08 23:54:21 +00005578 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5579
Chris Lattner3e2ee142010-07-07 16:01:42 +00005580 if (!Args.hasArg(options::OPT_nostdlib) &&
5581 !Args.hasArg(options::OPT_nodefaultlibs)) {
5582 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005583 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005584 CmdArgs.push_back("-lm");
5585 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005586 }
5587
5588 if (!Args.hasArg(options::OPT_nostdlib) &&
5589 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005590 if (Args.hasArg(options::OPT_pthread))
5591 CmdArgs.push_back("-lpthread");
5592 CmdArgs.push_back("-lc");
5593 CmdArgs.push_back("-lCompilerRT-Generic");
5594 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5595 CmdArgs.push_back(
5596 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005597 }
5598
Eli Friedman83de5132011-12-08 23:54:21 +00005599 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005600 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005601}
5602
Daniel Dunbarcc912342009-05-02 18:28:39 +00005603/// DragonFly Tools
5604
5605// For now, DragonFly Assemble does just about the same as for
5606// FreeBSD, but this may change soon.
5607void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005608 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005609 const InputInfoList &Inputs,
5610 const ArgList &Args,
5611 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005612 ArgStringList CmdArgs;
5613
5614 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5615 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005616 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00005617 CmdArgs.push_back("--32");
5618
5619 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5620 options::OPT_Xassembler);
5621
5622 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005623 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005624
5625 for (InputInfoList::const_iterator
5626 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5627 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005628 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005629 }
5630
5631 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005632 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005633 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005634}
5635
5636void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005637 const InputInfo &Output,
5638 const InputInfoList &Inputs,
5639 const ArgList &Args,
5640 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005641 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005642 ArgStringList CmdArgs;
5643
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005644 if (!D.SysRoot.empty())
5645 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5646
Daniel Dunbarcc912342009-05-02 18:28:39 +00005647 if (Args.hasArg(options::OPT_static)) {
5648 CmdArgs.push_back("-Bstatic");
5649 } else {
5650 if (Args.hasArg(options::OPT_shared))
5651 CmdArgs.push_back("-Bshareable");
5652 else {
5653 CmdArgs.push_back("-dynamic-linker");
5654 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5655 }
5656 }
5657
5658 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5659 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005660 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005661 CmdArgs.push_back("-m");
5662 CmdArgs.push_back("elf_i386");
5663 }
5664
Daniel Dunbarb440f562010-08-02 02:38:21 +00005665 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005666 CmdArgs.push_back("-o");
5667 CmdArgs.push_back(Output.getFilename());
5668 } else {
5669 assert(Output.isNothing() && "Invalid output.");
5670 }
5671
5672 if (!Args.hasArg(options::OPT_nostdlib) &&
5673 !Args.hasArg(options::OPT_nostartfiles)) {
5674 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005675 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005676 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005677 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005678 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005679 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005680 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005681 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005682 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005683 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005684 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005685 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005686 }
5687 }
5688
5689 Args.AddAllArgs(CmdArgs, options::OPT_L);
5690 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5691 Args.AddAllArgs(CmdArgs, options::OPT_e);
5692
Daniel Dunbar54423b22010-09-17 00:24:54 +00005693 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00005694
5695 if (!Args.hasArg(options::OPT_nostdlib) &&
5696 !Args.hasArg(options::OPT_nodefaultlibs)) {
5697 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5698 // rpaths
5699 CmdArgs.push_back("-L/usr/lib/gcc41");
5700
5701 if (!Args.hasArg(options::OPT_static)) {
5702 CmdArgs.push_back("-rpath");
5703 CmdArgs.push_back("/usr/lib/gcc41");
5704
5705 CmdArgs.push_back("-rpath-link");
5706 CmdArgs.push_back("/usr/lib/gcc41");
5707
5708 CmdArgs.push_back("-rpath");
5709 CmdArgs.push_back("/usr/lib");
5710
5711 CmdArgs.push_back("-rpath-link");
5712 CmdArgs.push_back("/usr/lib");
5713 }
5714
Rafael Espindola38360b32010-07-20 12:59:03 +00005715 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005716 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00005717 CmdArgs.push_back("-lm");
5718 }
5719
Daniel Dunbarcc912342009-05-02 18:28:39 +00005720 if (Args.hasArg(options::OPT_shared)) {
5721 CmdArgs.push_back("-lgcc_pic");
5722 } else {
5723 CmdArgs.push_back("-lgcc");
5724 }
5725
5726
5727 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00005728 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00005729
5730 if (!Args.hasArg(options::OPT_nolibc)) {
5731 CmdArgs.push_back("-lc");
5732 }
5733
5734 if (Args.hasArg(options::OPT_shared)) {
5735 CmdArgs.push_back("-lgcc_pic");
5736 } else {
5737 CmdArgs.push_back("-lgcc");
5738 }
5739 }
5740
5741 if (!Args.hasArg(options::OPT_nostdlib) &&
5742 !Args.hasArg(options::OPT_nostartfiles)) {
5743 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005744 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005745 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005746 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005747 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005748 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005749 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005750 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005751 }
5752
Bill Wendling08760582011-06-27 19:15:03 +00005753 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005754
Daniel Dunbarcc912342009-05-02 18:28:39 +00005755 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005756 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005757 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005758}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005759
5760void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
5761 const InputInfo &Output,
5762 const InputInfoList &Inputs,
5763 const ArgList &Args,
5764 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005765 ArgStringList CmdArgs;
5766
5767 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00005768 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
5769 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005770 } else {
5771 assert(Output.isNothing() && "Invalid output.");
5772 }
5773
5774 if (!Args.hasArg(options::OPT_nostdlib) &&
5775 !Args.hasArg(options::OPT_nostartfiles)) {
5776 CmdArgs.push_back("-defaultlib:libcmt");
5777 }
5778
5779 CmdArgs.push_back("-nologo");
5780
Michael J. Spencere2f49362012-06-18 16:56:04 +00005781 Args.AddAllArgValues(CmdArgs, options::OPT_l);
5782
5783 // Add filenames immediately.
5784 for (InputInfoList::const_iterator
5785 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5786 if (it->isFilename())
5787 CmdArgs.push_back(it->getFilename());
5788 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005789
5790 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00005791 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005792 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5793}