blob: 9beba88b149164fb8bc3c0f649fd774e3bf35593 [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
993 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000994 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000995 CmdArgs.push_back("-mllvm");
996 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
997 A->claim();
998 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000999}
1000
Hal Finkel8eb59282012-06-11 22:35:19 +00001001/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1002static std::string getPPCTargetCPU(const ArgList &Args) {
1003 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001004 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001005
1006 if (CPUName == "native") {
1007 std::string CPU = llvm::sys::getHostCPUName();
1008 if (!CPU.empty() && CPU != "generic")
1009 return CPU;
1010 else
1011 return "";
1012 }
1013
1014 return llvm::StringSwitch<const char *>(CPUName)
1015 .Case("common", "generic")
1016 .Case("440", "440")
1017 .Case("440fp", "440")
1018 .Case("450", "450")
1019 .Case("601", "601")
1020 .Case("602", "602")
1021 .Case("603", "603")
1022 .Case("603e", "603e")
1023 .Case("603ev", "603ev")
1024 .Case("604", "604")
1025 .Case("604e", "604e")
1026 .Case("620", "620")
1027 .Case("G3", "g3")
1028 .Case("7400", "7400")
1029 .Case("G4", "g4")
1030 .Case("7450", "7450")
1031 .Case("G4+", "g4+")
1032 .Case("750", "750")
1033 .Case("970", "970")
1034 .Case("G5", "g5")
1035 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001036 .Case("e500mc", "e500mc")
1037 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +00001038 .Case("power6", "pwr6")
1039 .Case("power7", "pwr7")
1040 .Case("powerpc", "ppc")
1041 .Case("powerpc64", "ppc64")
1042 .Default("");
1043 }
1044
1045 return "";
1046}
1047
1048void Clang::AddPPCTargetArgs(const ArgList &Args,
1049 ArgStringList &CmdArgs) const {
1050 std::string TargetCPUName = getPPCTargetCPU(Args);
1051
1052 // LLVM may default to generating code for the native CPU,
1053 // but, like gcc, we default to a more generic option for
1054 // each architecture. (except on Darwin)
1055 llvm::Triple Triple = getToolChain().getTriple();
1056 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1057 if (Triple.getArch() == llvm::Triple::ppc64)
1058 TargetCPUName = "ppc64";
1059 else
1060 TargetCPUName = "ppc";
1061 }
1062
1063 if (!TargetCPUName.empty()) {
1064 CmdArgs.push_back("-target-cpu");
1065 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1066 }
1067}
1068
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001069void Clang::AddSparcTargetArgs(const ArgList &Args,
1070 ArgStringList &CmdArgs) const {
1071 const Driver &D = getToolChain().getDriver();
1072
1073 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001074 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001075 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001076 }
1077
1078 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001079 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001080 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1081 options::OPT_mhard_float)) {
1082 if (A->getOption().matches(options::OPT_msoft_float))
1083 FloatABI = "soft";
1084 else if (A->getOption().matches(options::OPT_mhard_float))
1085 FloatABI = "hard";
1086 }
1087
1088 // If unspecified, choose the default based on the platform.
1089 if (FloatABI.empty()) {
1090 switch (getToolChain().getTriple().getOS()) {
1091 default:
1092 // Assume "soft", but warn the user we are guessing.
1093 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001094 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001095 break;
1096 }
1097 }
1098
1099 if (FloatABI == "soft") {
1100 // Floating point operations and argument passing are soft.
1101 //
1102 // FIXME: This changes CPP defines, we need -target-soft-float.
1103 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001104 CmdArgs.push_back("-target-feature");
1105 CmdArgs.push_back("+soft-float");
1106 } else {
1107 assert(FloatABI == "hard" && "Invalid float abi!");
1108 CmdArgs.push_back("-mhard-float");
1109 }
1110}
1111
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001112void Clang::AddX86TargetArgs(const ArgList &Args,
1113 ArgStringList &CmdArgs) const {
Rafael Espindola7df35012012-11-02 20:41:30 +00001114 const bool isAndroid =
1115 getToolChain().getTriple().getEnvironment() == llvm::Triple::Android;
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001116 if (!Args.hasFlag(options::OPT_mred_zone,
1117 options::OPT_mno_red_zone,
1118 true) ||
1119 Args.hasArg(options::OPT_mkernel) ||
1120 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001121 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001122
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001123 if (Args.hasFlag(options::OPT_msoft_float,
1124 options::OPT_mno_soft_float,
1125 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001126 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001127
Daniel Dunbare13ada62009-11-14 22:04:54 +00001128 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001129 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001130 if (StringRef(A->getValue()) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001131 // FIXME: Reject attempts to use -march=native unless the target matches
1132 // the host.
1133 //
1134 // FIXME: We should also incorporate the detected target features for use
1135 // with -native.
1136 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001137 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 CPUName = Args.MakeArgString(CPU);
1139 } else
Richard Smithbd55daf2012-11-01 04:30:05 +00001140 CPUName = A->getValue();
Daniel Dunbare13ada62009-11-14 22:04:54 +00001141 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001142
Daniel Dunbare13ada62009-11-14 22:04:54 +00001143 // Select the default CPU if none was given (or detection failed).
1144 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001145 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001146 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001147 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001148 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001149 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001150 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001151 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001152 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001153 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001154 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001155 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001156 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001157 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001158 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001159 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001160 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001161 } else if (getToolChain().getOS().startswith("bitrig")) {
1162 if (getToolChain().getArch() == llvm::Triple::x86_64)
1163 CPUName = "x86-64";
1164 else if (getToolChain().getArch() == llvm::Triple::x86)
1165 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001166 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001167 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001168 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001169 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001170 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001171 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001172 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001173 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001174 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001175 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001176 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001177 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001178 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001179 else if (getToolChain().getArch() == llvm::Triple::x86)
Rafael Espindola7df35012012-11-02 20:41:30 +00001180 // All x86 devices running Android have core2 as their common
1181 // denominator. This makes a better choice than pentium4.
1182 CPUName = isAndroid ? "core2" : "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001183 }
1184 }
1185
Daniel Dunbare13ada62009-11-14 22:04:54 +00001186 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001187 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001188 CmdArgs.push_back(CPUName);
1189 }
1190
Eli Friedmanad811f02011-07-02 00:34:19 +00001191 // The required algorithm here is slightly strange: the options are applied
1192 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1193 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1194 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1195 // former correctly, but not the latter; handle directly-overridden
1196 // attributes here.
1197 llvm::StringMap<unsigned> PrevFeature;
1198 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001199 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1200 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001201 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001202 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001203
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001204 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001205 assert(Name.startswith("m") && "Invalid feature name.");
1206 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001207
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001208 bool IsNegative = Name.startswith("no-");
1209 if (IsNegative)
1210 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001211
Eli Friedmanad811f02011-07-02 00:34:19 +00001212 unsigned& Prev = PrevFeature[Name];
1213 if (Prev)
1214 Features[Prev - 1] = 0;
1215 Prev = Features.size() + 1;
1216 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1217 }
1218 for (unsigned i = 0; i < Features.size(); i++) {
1219 if (Features[i]) {
1220 CmdArgs.push_back("-target-feature");
1221 CmdArgs.push_back(Features[i]);
1222 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001223 }
1224}
1225
Tony Linthicum76329bf2011-12-12 21:14:55 +00001226static Arg* getLastHexagonArchArg (const ArgList &Args)
1227{
1228 Arg * A = NULL;
1229
Sebastian Pop86500282012-01-13 20:37:10 +00001230 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1231 it != ie; ++it) {
1232 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001233 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1234 A = *it;
1235 A->claim();
1236 }
Sebastian Pop86500282012-01-13 20:37:10 +00001237 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
Richard Smithbd55daf2012-11-01 04:30:05 +00001238 StringRef Value = (*it)->getValue(0);
Sebastian Pop86500282012-01-13 20:37:10 +00001239 if (Value.startswith("v")) {
1240 A = *it;
1241 A->claim();
1242 }
1243 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001244 }
1245 return A;
1246}
1247
Sebastian Pop86500282012-01-13 20:37:10 +00001248static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001249{
1250 Arg *A;
1251 llvm::StringRef WhichHexagon;
1252
Sebastian Pop86500282012-01-13 20:37:10 +00001253 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001254 if ((A = getLastHexagonArchArg (Args))) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001255 WhichHexagon = A->getValue();
Sebastian Pop86500282012-01-13 20:37:10 +00001256 if (WhichHexagon == "")
1257 return "v4";
1258 else
1259 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001260 }
Sebastian Pop86500282012-01-13 20:37:10 +00001261 else
1262 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001263}
1264
1265void Clang::AddHexagonTargetArgs(const ArgList &Args,
1266 ArgStringList &CmdArgs) const {
1267 llvm::Triple Triple = getToolChain().getTriple();
1268
1269 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001270 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001271 CmdArgs.push_back("-fno-signed-char");
1272 CmdArgs.push_back("-nobuiltininc");
1273
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001274 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001275 CmdArgs.push_back("-mqdsp6-compat");
1276
1277 if (Arg *A = Args.getLastArg(options::OPT_G,
1278 options::OPT_msmall_data_threshold_EQ)) {
1279 std::string SmallDataThreshold="-small-data-threshold=";
Richard Smithbd55daf2012-11-01 04:30:05 +00001280 SmallDataThreshold += A->getValue();
Tony Linthicum76329bf2011-12-12 21:14:55 +00001281 CmdArgs.push_back ("-mllvm");
1282 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1283 A->claim();
1284 }
1285
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001286 if (!Args.hasArg(options::OPT_fno_short_enums))
1287 CmdArgs.push_back("-fshort-enums");
1288 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1289 CmdArgs.push_back ("-mllvm");
1290 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1291 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001292 CmdArgs.push_back ("-mllvm");
1293 CmdArgs.push_back ("-machine-sink-split=0");
1294}
1295
Eric Christopher84fbdb42011-08-19 00:30:14 +00001296static bool
John McCall5fb5df92012-06-20 06:18:46 +00001297shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001298 const llvm::Triple &Triple) {
1299 // We use the zero-cost exception tables for Objective-C if the non-fragile
1300 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1301 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001302 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001303 return true;
1304
Bob Wilson6524dd32011-10-14 05:03:44 +00001305 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001306 return false;
1307
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001308 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001309 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001310 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001311}
1312
Anders Carlssone96ab552011-02-28 02:27:16 +00001313/// addExceptionArgs - Adds exception related arguments to the driver command
1314/// arguments. There's a master flag, -fexceptions and also language specific
1315/// flags to enable/disable C++ and Objective-C exceptions.
1316/// This makes it possible to for example disable C++ exceptions but enable
1317/// Objective-C exceptions.
1318static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1319 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001320 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001321 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001322 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001323 if (KernelOrKext) {
1324 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1325 // arguments now to avoid warnings about unused arguments.
1326 Args.ClaimAllArgs(options::OPT_fexceptions);
1327 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1328 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1329 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1330 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1331 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001332 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001333 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001334
1335 // Exceptions are enabled by default.
1336 bool ExceptionsEnabled = true;
1337
1338 // This keeps track of whether exceptions were explicitly turned on or off.
1339 bool DidHaveExplicitExceptionFlag = false;
1340
Rafael Espindola00a66572009-10-01 13:33:33 +00001341 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1342 options::OPT_fno_exceptions)) {
1343 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001344 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001345 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001346 ExceptionsEnabled = false;
1347
1348 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001349 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001350
Anders Carlssone96ab552011-02-28 02:27:16 +00001351 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001352
Anders Carlssone96ab552011-02-28 02:27:16 +00001353 // Exception tables and cleanups can be enabled with -fexceptions even if the
1354 // language itself doesn't support exceptions.
1355 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1356 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001357
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001358 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1359 // is not necessarily sensible, but follows GCC.
1360 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001361 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001362 options::OPT_fno_objc_exceptions,
1363 true)) {
1364 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001365
Eric Christopher84fbdb42011-08-19 00:30:14 +00001366 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001367 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001368 }
1369
1370 if (types::isCXX(InputType)) {
1371 bool CXXExceptionsEnabled = ExceptionsEnabled;
1372
Eric Christopher84fbdb42011-08-19 00:30:14 +00001373 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1374 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001375 options::OPT_fexceptions,
1376 options::OPT_fno_exceptions)) {
1377 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1378 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001379 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001380 CXXExceptionsEnabled = false;
1381 }
1382
1383 if (CXXExceptionsEnabled) {
1384 CmdArgs.push_back("-fcxx-exceptions");
1385
1386 ShouldUseExceptionTables = true;
1387 }
1388 }
1389
1390 if (ShouldUseExceptionTables)
1391 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001392}
1393
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001394static bool ShouldDisableCFI(const ArgList &Args,
1395 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001396 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001397 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001398 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001399 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001400 Default = Args.hasFlag(options::OPT_integrated_as,
1401 options::OPT_no_integrated_as,
1402 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001403 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001404 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1405 options::OPT_fno_dwarf2_cfi_asm,
1406 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001407}
1408
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001409static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1410 const ToolChain &TC) {
1411 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1412 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1413 options::OPT_no_integrated_as,
1414 IsIADefault);
1415 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1416 options::OPT_fno_dwarf_directory_asm,
1417 UseIntegratedAs);
1418 return !UseDwarfDirectory;
1419}
1420
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001421/// \brief Check whether the given input tree contains any compilation actions.
1422static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001423 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001424 return true;
1425
1426 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1427 if (ContainsCompileAction(*it))
1428 return true;
1429
1430 return false;
1431}
1432
1433/// \brief Check if -relax-all should be passed to the internal assembler.
1434/// This is done by default when compiling non-assembler source with -O0.
1435static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1436 bool RelaxDefault = true;
1437
1438 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1439 RelaxDefault = A->getOption().matches(options::OPT_O0);
1440
1441 if (RelaxDefault) {
1442 RelaxDefault = false;
1443 for (ActionList::const_iterator it = C.getActions().begin(),
1444 ie = C.getActions().end(); it != ie; ++it) {
1445 if (ContainsCompileAction(*it)) {
1446 RelaxDefault = true;
1447 break;
1448 }
1449 }
1450 }
1451
1452 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1453 RelaxDefault);
1454}
1455
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001456SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) {
1457 Kind = 0;
Richard Smith52be6192012-11-05 22:04:41 +00001458
Richard Smith52be6192012-11-05 22:04:41 +00001459 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001460 unsigned Add, Remove;
1461 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001462 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001463 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001464 Kind |= Add;
1465 Kind &= ~Remove;
Richard Smith52be6192012-11-05 22:04:41 +00001466 }
1467
1468 // Only one runtime library can be used at once.
1469 // FIXME: Allow Ubsan to be combined with the other two.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001470 bool NeedsAsan = needsAsanRt();
1471 bool NeedsTsan = needsTsanRt();
1472 bool NeedsUbsan = needsUbsanRt();
Richard Smith52be6192012-11-05 22:04:41 +00001473 if (NeedsAsan + NeedsTsan + NeedsUbsan > 1)
1474 D.Diag(diag::err_drv_argument_not_allowed_with)
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001475 << lastArgumentForKind(D, Args, NeedsAsan ? NeedsAsanRt : NeedsTsanRt)
1476 << lastArgumentForKind(D, Args, NeedsUbsan ? NeedsUbsanRt : NeedsTsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001477
1478 // If -fsanitize contains extra features of ASan, it should also
1479 // explicitly contain -fsanitize=address.
1480 if (NeedsAsan && ((Kind & Address) == 0))
1481 D.Diag(diag::err_drv_argument_only_allowed_with)
1482 << lastArgumentForKind(D, Args, NeedsAsanRt)
1483 << "-fsanitize=address";
Richard Smith52be6192012-11-05 22:04:41 +00001484}
1485
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001486/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1487/// This needs to be called before we add the C run-time (malloc, etc).
1488static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001489 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001490 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001491 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001492 if (!Args.hasArg(options::OPT_pie))
1493 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001494 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001495
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001496 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1497 llvm::sys::path::append(LibAsan, "lib", "linux",
1498 (Twine("libclang_rt.asan-") +
1499 TC.getArchName() + "-android.so"));
1500 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001501 } else {
1502 if (!Args.hasArg(options::OPT_shared)) {
1503 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1504 // resource directory.
1505 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1506 llvm::sys::path::append(LibAsan, "lib", "linux",
1507 (Twine("libclang_rt.asan-") +
1508 TC.getArchName() + ".a"));
1509 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1510 CmdArgs.push_back("-lpthread");
1511 CmdArgs.push_back("-ldl");
1512 CmdArgs.push_back("-export-dynamic");
1513 }
1514 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001515}
1516
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001517/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1518/// This needs to be called before we add the C run-time (malloc, etc).
1519static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1520 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001521 if (!Args.hasArg(options::OPT_shared)) {
1522 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1523 // resource directory.
1524 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1525 llvm::sys::path::append(LibTsan, "lib", "linux",
1526 (Twine("libclang_rt.tsan-") +
1527 TC.getArchName() + ".a"));
1528 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1529 CmdArgs.push_back("-lpthread");
1530 CmdArgs.push_back("-ldl");
1531 CmdArgs.push_back("-export-dynamic");
1532 }
1533}
1534
Richard Smithe30752c2012-10-09 19:52:38 +00001535/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1536/// (Linux).
1537static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1538 ArgStringList &CmdArgs) {
Richard Smithe30752c2012-10-09 19:52:38 +00001539 if (!Args.hasArg(options::OPT_shared)) {
1540 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1541 // resource directory.
1542 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1543 llvm::sys::path::append(LibUbsan, "lib", "linux",
1544 (Twine("libclang_rt.ubsan-") +
1545 TC.getArchName() + ".a"));
1546 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
Richard Smith437abed2012-11-02 20:32:19 +00001547 CmdArgs.push_back("-lpthread");
Richard Smithe30752c2012-10-09 19:52:38 +00001548 }
1549}
1550
Rafael Espindola224dd632011-12-14 21:02:23 +00001551static bool shouldUseFramePointer(const ArgList &Args,
1552 const llvm::Triple &Triple) {
1553 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1554 options::OPT_fomit_frame_pointer))
1555 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1556
Rafael Espindola00b29182011-12-14 21:50:24 +00001557 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001558 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1559 Triple.getArch() == llvm::Triple::x86) &&
1560 Triple.getOS() == llvm::Triple::Linux) {
1561 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1562 if (!A->getOption().matches(options::OPT_O0))
1563 return false;
1564 }
1565
1566 return true;
1567}
1568
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001569void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001570 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001571 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001572 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001573 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001574 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1575 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001576 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001577 ArgStringList CmdArgs;
1578
Daniel Dunbare521a892009-03-31 20:53:55 +00001579 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1580
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001581 // Invoke ourselves in -cc1 mode.
1582 //
1583 // FIXME: Implement custom jobs for internal actions.
1584 CmdArgs.push_back("-cc1");
1585
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001586 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001587 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001588 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001589 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001590
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001591 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001592 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001594 if (isa<AnalyzeJobAction>(JA)) {
1595 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1596 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001597 } else if (isa<MigrateJobAction>(JA)) {
1598 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001599 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001600 if (Output.getType() == types::TY_Dependencies)
1601 CmdArgs.push_back("-Eonly");
1602 else
1603 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001604 } else if (isa<AssembleJobAction>(JA)) {
1605 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001606
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001607 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001608 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001609
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001610 // When using an integrated assembler, translate -Wa, and -Xassembler
1611 // options.
1612 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1613 options::OPT_Xassembler),
1614 ie = Args.filtered_end(); it != ie; ++it) {
1615 const Arg *A = *it;
1616 A->claim();
1617
1618 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001619 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001620
1621 if (Value == "-force_cpusubtype_ALL") {
1622 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001623 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001624 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001625 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001626 CmdArgs.push_back("-mllvm");
1627 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001628 } else if (Value == "--noexecstack") {
1629 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001630 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001631 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001632 << A->getOption().getName() << Value;
1633 }
1634 }
1635 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001636
1637 // Also ignore explicit -force_cpusubtype_ALL option.
1638 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001639 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001640 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001641 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001642
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001643 if (JA.getType() == types::TY_Nothing)
1644 CmdArgs.push_back("-fsyntax-only");
1645 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001646 CmdArgs.push_back("-emit-pch");
1647 else
1648 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001649 } else {
1650 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001651
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001652 if (JA.getType() == types::TY_Nothing) {
1653 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001654 } else if (JA.getType() == types::TY_LLVM_IR ||
1655 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001656 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001657 } else if (JA.getType() == types::TY_LLVM_BC ||
1658 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001659 CmdArgs.push_back("-emit-llvm-bc");
1660 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001661 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001662 } else if (JA.getType() == types::TY_AST) {
1663 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001664 } else if (JA.getType() == types::TY_RewrittenObjC) {
1665 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001666 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001667 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1668 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001669 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001670 } else {
1671 assert(JA.getType() == types::TY_PP_Asm &&
1672 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001673 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001674 }
1675
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001676 // The make clang go fast button.
1677 CmdArgs.push_back("-disable-free");
1678
John McCallbb79b5f2010-02-13 03:50:24 +00001679 // Disable the verification pass in -asserts builds.
1680#ifdef NDEBUG
1681 CmdArgs.push_back("-disable-llvm-verifier");
1682#endif
1683
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001684 // Set the main file name, so that debug info works even with
1685 // -save-temps.
1686 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001687 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001688
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001689 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001690 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001691 if (Args.hasArg(options::OPT_static))
1692 CmdArgs.push_back("-static-define");
1693
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001694 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001695 // Enable region store model by default.
1696 CmdArgs.push_back("-analyzer-store=region");
1697
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001698 // Treat blocks as analysis entry points.
1699 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1700
Ted Kremenek49c79792011-03-24 00:28:47 +00001701 CmdArgs.push_back("-analyzer-eagerly-assume");
1702
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001703 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001704 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001705 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001706
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001707 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1708 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001709
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001710 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001711 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001712
1713 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001714
1715 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001716 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1717 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1718 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1719 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1720 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1721 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001722 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001723
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001724 // Set the output format. The default is plist, for (lame) historical
1725 // reasons.
1726 CmdArgs.push_back("-analyzer-output");
1727 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001728 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001729 else
1730 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001731
Ted Kremenekfe449a22010-03-22 22:32:05 +00001732 // Disable the presentation of standard compiler warnings when
1733 // using --analyze. We only want to show static analyzer diagnostics
1734 // or frontend errors.
1735 CmdArgs.push_back("-w");
1736
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001737 // Add -Xanalyzer arguments when running as analyzer.
1738 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001739 }
1740
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001741 CheckCodeGenerationOptions(D, Args);
1742
Chandler Carruth76a943b2012-11-19 03:52:03 +00001743 // For the PIC and PIE flag options, this logic is different from the legacy
1744 // logic in very old versions of GCC, as that logic was just a bug no one had
1745 // ever fixed. This logic is both more rational and consistent with GCC's new
1746 // logic now that the bugs are fixed. The last argument relating to either
1747 // PIC or PIE wins, and no other argument is used. If the last argument is
1748 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1749 // PIE option implicitly enables PIC at the same level.
1750 bool PIE = false;
1751 bool PIC = getToolChain().isPICDefault();
1752 bool IsPICLevelTwo = PIC;
1753 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1754 options::OPT_fpic, options::OPT_fno_pic,
1755 options::OPT_fPIE, options::OPT_fno_PIE,
1756 options::OPT_fpie, options::OPT_fno_pie)) {
1757 Option O = A->getOption();
1758 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1759 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1760 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1761 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1762 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1763 O.matches(options::OPT_fPIC);
1764 } else {
1765 PIE = PIC = false;
1766 }
Benjamin Kramer76db2902012-11-13 15:32:35 +00001767 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001768 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1769 // is forced, then neither PIC nor PIE flags will have no effect.
1770 if (getToolChain().isPICDefaultForced()) {
1771 PIE = false;
1772 PIC = getToolChain().isPICDefault();
1773 IsPICLevelTwo = PIC;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001774 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001775
1776 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1777 // specified while enabling PIC enabled level 1 PIC, just force it back to
1778 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1779 // informal testing).
1780 if (PIC && getToolChain().getTriple().isOSDarwin())
1781 IsPICLevelTwo |= getToolChain().isPICDefault();
1782
Chandler Carruthc0c04552012-04-08 16:40:35 +00001783 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1784 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001785 llvm::Triple Triple(TripleStr);
1786 if ((Args.hasArg(options::OPT_mkernel) ||
1787 Args.hasArg(options::OPT_fapple_kext)) &&
1788 (Triple.getOS() != llvm::Triple::IOS ||
1789 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001790 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001791 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001792 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001793
Chandler Carruth76a943b2012-11-19 03:52:03 +00001794 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1795 // This is a very special mode. It trumps the other modes, almost no one
1796 // uses it, and it isn't even valid on any OS but Darwin.
1797 if (!getToolChain().getTriple().isOSDarwin())
1798 D.Diag(diag::err_drv_unsupported_opt_for_target)
1799 << A->getSpelling() << getToolChain().getTriple().str();
1800
1801 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
1802
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001803 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00001804 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001805
Chandler Carruth76a943b2012-11-19 03:52:03 +00001806 // Only a forced PIC mode can cause the actual compile to have PIC defines
1807 // etc., no flags are sufficient. This behavior was selected to closely
1808 // match that of llvm-gcc and Apple GCC before that.
1809 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
1810 CmdArgs.push_back("-pic-level");
1811 CmdArgs.push_back("2");
1812 }
1813 } else {
1814 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
1815 // handled in Clang's IRGen by the -pie-level flag.
1816 CmdArgs.push_back("-mrelocation-model");
1817 CmdArgs.push_back(PIC ? "pic" : "static");
1818
1819 if (PIC) {
1820 CmdArgs.push_back("-pic-level");
1821 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1822 if (PIE) {
1823 CmdArgs.push_back("-pie-level");
1824 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1825 }
1826 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001827 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001828
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001829 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1830 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001831 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001832
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001833 // LLVM Code Generator Options.
1834
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001835 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1836 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00001837 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001838 }
1839
Roman Divacky65b88cd2011-03-01 17:40:53 +00001840 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1841 CmdArgs.push_back("-mrtd");
1842
Rafael Espindola224dd632011-12-14 21:02:23 +00001843 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001844 CmdArgs.push_back("-mdisable-fp-elim");
1845 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1846 options::OPT_fno_zero_initialized_in_bss))
1847 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001848 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1849 options::OPT_fno_strict_aliasing,
1850 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001851 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001852 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1853 false))
1854 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001855 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1856 options::OPT_fno_optimize_sibling_calls))
1857 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001858
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001859 // Handle various floating point optimization flags, mapping them to the
1860 // appropriate LLVM code generation flags. The pattern for all of these is to
1861 // default off the codegen optimizations, and if any flag enables them and no
1862 // flag disables them after the flag enabling them, enable the codegen
1863 // optimization. This is complicated by several "umbrella" flags.
1864 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001865 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001866 options::OPT_ffinite_math_only,
1867 options::OPT_fno_finite_math_only,
1868 options::OPT_fhonor_infinities,
1869 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001870 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1871 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001872 A->getOption().getID() != options::OPT_fhonor_infinities)
1873 CmdArgs.push_back("-menable-no-infs");
1874 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001875 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001876 options::OPT_ffinite_math_only,
1877 options::OPT_fno_finite_math_only,
1878 options::OPT_fhonor_nans,
1879 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001880 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1881 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001882 A->getOption().getID() != options::OPT_fhonor_nans)
1883 CmdArgs.push_back("-menable-no-nans");
1884
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001885 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1886 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001887 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001888 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001889 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001890 options::OPT_fno_math_errno))
1891 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1892 if (MathErrno)
1893 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001894
1895 // There are several flags which require disabling very specific
1896 // optimizations. Any of these being disabled forces us to turn off the
1897 // entire set of LLVM optimizations, so collect them through all the flag
1898 // madness.
1899 bool AssociativeMath = false;
1900 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001901 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001902 options::OPT_funsafe_math_optimizations,
1903 options::OPT_fno_unsafe_math_optimizations,
1904 options::OPT_fassociative_math,
1905 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001906 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1907 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001908 A->getOption().getID() != options::OPT_fno_associative_math)
1909 AssociativeMath = true;
1910 bool ReciprocalMath = false;
1911 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001912 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001913 options::OPT_funsafe_math_optimizations,
1914 options::OPT_fno_unsafe_math_optimizations,
1915 options::OPT_freciprocal_math,
1916 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001917 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1918 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001919 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1920 ReciprocalMath = true;
1921 bool SignedZeros = true;
1922 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001923 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001924 options::OPT_funsafe_math_optimizations,
1925 options::OPT_fno_unsafe_math_optimizations,
1926 options::OPT_fsigned_zeros,
1927 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001928 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1929 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001930 A->getOption().getID() != options::OPT_fsigned_zeros)
1931 SignedZeros = false;
1932 bool TrappingMath = true;
1933 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001934 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001935 options::OPT_funsafe_math_optimizations,
1936 options::OPT_fno_unsafe_math_optimizations,
1937 options::OPT_ftrapping_math,
1938 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001939 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1940 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001941 A->getOption().getID() != options::OPT_ftrapping_math)
1942 TrappingMath = false;
1943 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1944 !TrappingMath)
1945 CmdArgs.push_back("-menable-unsafe-fp-math");
1946
Lang Hamesaa53b932012-07-06 00:59:19 +00001947
1948 // Validate and pass through -fp-contract option.
1949 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001950 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001951 options::OPT_ffp_contract)) {
1952 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001953 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00001954 if (Val == "fast" || Val == "on" || Val == "off") {
1955 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1956 } else {
1957 D.Diag(diag::err_drv_unsupported_option_argument)
1958 << A->getOption().getName() << Val;
1959 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001960 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001961 // If fast-math is set then set the fp-contract mode to fast.
1962 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1963 }
1964 }
1965
Bob Wilson6a039162012-07-19 03:52:53 +00001966 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1967 // and if we find them, tell the frontend to provide the appropriate
1968 // preprocessor macros. This is distinct from enabling any optimizations as
1969 // these options induce language changes which must survive serialization
1970 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001971 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1972 if (A->getOption().matches(options::OPT_ffast_math))
1973 CmdArgs.push_back("-ffast-math");
1974 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1975 if (A->getOption().matches(options::OPT_ffinite_math_only))
1976 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001977
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001978 // Decide whether to use verbose asm. Verbose assembly is the default on
1979 // toolchains which have the integrated assembler on by default.
1980 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1981 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001982 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001983 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001984 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001985
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001986 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1987 CmdArgs.push_back("-mdebug-pass");
1988 CmdArgs.push_back("Structure");
1989 }
1990 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1991 CmdArgs.push_back("-mdebug-pass");
1992 CmdArgs.push_back("Arguments");
1993 }
1994
John McCall8517abc2010-02-19 02:45:38 +00001995 // Enable -mconstructor-aliases except on darwin, where we have to
1996 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001997 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001998 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001999
John McCall7ef5cb32011-03-18 02:56:14 +00002000 // Darwin's kernel doesn't support guard variables; just die if we
2001 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002002 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002003 CmdArgs.push_back("-fforbid-guard-variables");
2004
Douglas Gregordbe39272011-02-01 15:15:22 +00002005 if (Args.hasArg(options::OPT_mms_bitfields)) {
2006 CmdArgs.push_back("-mms-bitfields");
2007 }
John McCall8517abc2010-02-19 02:45:38 +00002008
Daniel Dunbar306945d2009-09-16 06:17:29 +00002009 // This is a coarse approximation of what llvm-gcc actually does, both
2010 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2011 // complicated ways.
2012 bool AsynchronousUnwindTables =
2013 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2014 options::OPT_fno_asynchronous_unwind_tables,
2015 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002016 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002017 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2018 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002019 CmdArgs.push_back("-munwind-tables");
2020
Chandler Carruth05fb5852012-11-21 23:40:23 +00002021 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002022
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002023 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2024 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002025 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002026 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002027
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002028 // FIXME: Handle -mtune=.
2029 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002030
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002031 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002032 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002033 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002034 }
2035
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002036 // Add target specific cpu and features flags.
2037 switch(getToolChain().getTriple().getArch()) {
2038 default:
2039 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002040
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002041 case llvm::Triple::arm:
2042 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002043 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002044 break;
2045
Eric Christopher0b26a612010-03-02 02:41:08 +00002046 case llvm::Triple::mips:
2047 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002048 case llvm::Triple::mips64:
2049 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002050 AddMIPSTargetArgs(Args, CmdArgs);
2051 break;
2052
Hal Finkel8eb59282012-06-11 22:35:19 +00002053 case llvm::Triple::ppc:
2054 case llvm::Triple::ppc64:
2055 AddPPCTargetArgs(Args, CmdArgs);
2056 break;
2057
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002058 case llvm::Triple::sparc:
2059 AddSparcTargetArgs(Args, CmdArgs);
2060 break;
2061
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002062 case llvm::Triple::x86:
2063 case llvm::Triple::x86_64:
2064 AddX86TargetArgs(Args, CmdArgs);
2065 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002066
2067 case llvm::Triple::hexagon:
2068 AddHexagonTargetArgs(Args, CmdArgs);
2069 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002070 }
2071
Tony Linthicum76329bf2011-12-12 21:14:55 +00002072
2073
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002074 // Pass the linker version in use.
2075 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2076 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002077 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002078 }
2079
Nick Lewycky75033772011-02-02 06:43:03 +00002080 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002081 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002082 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002083 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002084 CmdArgs.push_back("-momit-leaf-frame-pointer");
2085
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002086 // Explicitly error on some things we know we don't support and can't just
2087 // ignore.
2088 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002089 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2090 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002091 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002092 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002093 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002094 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2095 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002096 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002097 << Unsupported->getOption().getName();
2098 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002099 }
2100
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002101 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002102 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002103 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002104 CmdArgs.push_back("-header-include-file");
2105 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2106 D.CCPrintHeadersFilename : "-");
2107 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002108 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002109 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110
Chad Rosierbe10f982011-08-02 17:58:04 +00002111 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002112 CmdArgs.push_back("-diagnostic-log-file");
2113 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2114 D.CCLogDiagnosticsFilename : "-");
2115 }
2116
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002117 // Use the last option from "-g" group. "-gline-tables-only" is
2118 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002119 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002120 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2121 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2122 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002123 } else if (!A->getOption().matches(options::OPT_g0) &&
2124 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002125 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002126 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002127 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002128
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002129 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2130 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002131 if (Args.hasArg(options::OPT_gcolumn_info))
2132 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002133
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002134 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2135 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2136
Chris Lattner3c77a352010-06-22 00:03:40 +00002137 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2138
Nick Lewycky207bce32011-04-21 23:44:07 +00002139 if (Args.hasArg(options::OPT_ftest_coverage) ||
2140 Args.hasArg(options::OPT_coverage))
2141 CmdArgs.push_back("-femit-coverage-notes");
2142 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2143 Args.hasArg(options::OPT_coverage))
2144 CmdArgs.push_back("-femit-coverage-data");
2145
Nick Lewycky480cb992011-05-04 20:46:58 +00002146 if (C.getArgs().hasArg(options::OPT_c) ||
2147 C.getArgs().hasArg(options::OPT_S)) {
2148 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002149 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002150 SmallString<128> absFilename(Output.getFilename());
2151 llvm::sys::fs::make_absolute(absFilename);
2152 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002153 }
2154 }
2155
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002156 // Pass options for controlling the default header search paths.
2157 if (Args.hasArg(options::OPT_nostdinc)) {
2158 CmdArgs.push_back("-nostdsysteminc");
2159 CmdArgs.push_back("-nobuiltininc");
2160 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002161 if (Args.hasArg(options::OPT_nostdlibinc))
2162 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002163 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2164 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2165 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002166
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002167 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002168 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002169 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002170
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002171 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2172
Ted Kremenekf7639e12012-03-06 20:06:33 +00002173 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002174 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002175 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002176 options::OPT_ccc_arcmt_modify,
2177 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002178 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002179 switch (A->getOption().getID()) {
2180 default:
2181 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002182 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002183 CmdArgs.push_back("-arcmt-check");
2184 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002185 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002186 CmdArgs.push_back("-arcmt-modify");
2187 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002188 case options::OPT_ccc_arcmt_migrate:
2189 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002190 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002191 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002192
2193 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2194 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002195 break;
John McCalld70fb982011-06-15 23:25:17 +00002196 }
2197 }
2198 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002199
Ted Kremenekf7639e12012-03-06 20:06:33 +00002200 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2201 if (ARCMTEnabled) {
2202 D.Diag(diag::err_drv_argument_not_allowed_with)
2203 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2204 }
2205 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002206 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002207
2208 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2209 options::OPT_objcmt_migrate_subscripting)) {
2210 // None specified, means enable them all.
2211 CmdArgs.push_back("-objcmt-migrate-literals");
2212 CmdArgs.push_back("-objcmt-migrate-subscripting");
2213 } else {
2214 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2215 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2216 }
2217 }
2218
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002219 // Add preprocessing options like -I, -D, etc. if we are using the
2220 // preprocessor.
2221 //
2222 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002223 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002224 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002225
Rafael Espindolaa7431922011-07-21 23:40:37 +00002226 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2227 // that "The compiler can only warn and ignore the option if not recognized".
2228 // When building with ccache, it will pass -D options to clang even on
2229 // preprocessed inputs and configure concludes that -fPIC is not supported.
2230 Args.ClaimAllArgs(options::OPT_D);
2231
Daniel Dunbar58f78332009-09-17 06:53:36 +00002232 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002233 // others.
2234 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002235 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002236 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002237 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002238 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002239 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002240 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002241 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002242 }
2243
Daniel Dunbar945577c2009-10-29 02:24:45 +00002244 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002245 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2246 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002247 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002248 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002249
2250 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2251 // (-ansi is equivalent to -std=c89).
2252 //
2253 // If a std is supplied, only add -trigraphs if it follows the
2254 // option.
2255 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2256 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002257 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002258 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002259 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002260 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002261 else
2262 Std->render(Args, CmdArgs);
2263
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002264 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2265 options::OPT_trigraphs))
2266 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002267 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002268 } else {
2269 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002270 //
2271 // FIXME: Clang doesn't correctly handle -std= when the input language
2272 // doesn't match. For the time being just ignore this for C++ inputs;
2273 // eventually we want to do all the standard defaulting here instead of
2274 // splitting it between the driver and clang -cc1.
2275 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002276 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2277 "-std=", /*Joined=*/true);
2278 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2279 CmdArgs.push_back("-std=c++11");
2280
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002281 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002282 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002283
Chandler Carruthb009b142011-04-23 06:30:43 +00002284 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2285 // '-fconst-strings'; this better indicates its actual behavior.
2286 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2287 false)) {
2288 // For perfect compatibility with GCC, we do this even in the presence of
2289 // '-w'. This flag names something other than a warning for GCC.
2290 CmdArgs.push_back("-fconst-strings");
2291 }
2292
Chandler Carruth61fbf622011-04-23 09:27:53 +00002293 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002294 // during C++ compilation, which it is by default. GCC keeps this define even
2295 // in the presence of '-w', match this behavior bug-for-bug.
2296 if (types::isCXX(InputType) &&
2297 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2298 true)) {
2299 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002300 }
2301
Chandler Carruthe0391482010-05-22 02:21:53 +00002302 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2303 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2304 if (Asm->getOption().matches(options::OPT_fasm))
2305 CmdArgs.push_back("-fgnu-keywords");
2306 else
2307 CmdArgs.push_back("-fno-gnu-keywords");
2308 }
2309
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002310 if (ShouldDisableCFI(Args, getToolChain()))
2311 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002312
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002313 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2314 CmdArgs.push_back("-fno-dwarf-directory-asm");
2315
Nick Lewyckyba743b72011-10-21 02:32:14 +00002316 if (const char *pwd = ::getenv("PWD")) {
2317 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2318 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002319 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002320 std::string CompDir = pwd;
2321 CmdArgs.push_back("-fdebug-compilation-dir");
2322 CmdArgs.push_back(Args.MakeArgString(CompDir));
2323 }
2324 }
2325
Richard Smith9a568822011-11-21 19:36:32 +00002326 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2327 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002328 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002329 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002330 }
2331
Richard Smith9a568822011-11-21 19:36:32 +00002332 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2333 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002334 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002335 }
2336
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002337 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2338 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002339 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002340 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002341 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2342 } else
2343 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002344 }
2345
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002346
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002347 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002348 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002349
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002350 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2351 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002352 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002353 }
David Chisnall5778fce2009-08-31 16:41:57 +00002354
Chris Lattnere23003d2010-01-09 21:54:33 +00002355 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2356 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002357 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002358 }
2359
Chris Lattnerb35583d2010-04-07 20:49:23 +00002360 CmdArgs.push_back("-ferror-limit");
2361 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002362 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002363 else
2364 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002365
Chandler Carrutha77a7272010-05-06 04:55:18 +00002366 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2367 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002368 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002369 }
2370
2371 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2372 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002373 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002374 }
2375
Richard Smithf6f003a2011-12-16 19:06:07 +00002376 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2377 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002378 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002379 }
2380
Daniel Dunbar2c978472009-11-04 06:24:47 +00002381 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002382 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002383 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002384 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002385 } else {
2386 // If -fmessage-length=N was not specified, determine whether this is a
2387 // terminal and, if so, implicitly define -fmessage-length appropriately.
2388 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002389 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002390 }
2391
Daniel Dunbare357d562009-12-03 18:42:11 +00002392 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2393 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002394 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002395 }
2396
Douglas Gregor08329632010-06-15 17:05:35 +00002397 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002398
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002399 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2400
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002401 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002402 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2403 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002404 CmdArgs.push_back("-ffreestanding");
2405
Daniel Dunbare357d562009-12-03 18:42:11 +00002406 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002407 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002408 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002409 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002410 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002411 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002412 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002413 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2414 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002415
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002416 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002417 Sanitize.addArgs(Args, CmdArgs);
2418
Chad Rosier864dfe12012-03-13 23:45:51 +00002419 // Report and error for -faltivec on anything other then PowerPC.
2420 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2421 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2422 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2423 D.Diag(diag::err_drv_argument_only_allowed_with)
2424 << A->getAsString(Args) << "ppc/ppc64";
2425
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002426 if (getToolChain().SupportsProfiling())
2427 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002428
2429 // -flax-vector-conversions is default.
2430 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2431 options::OPT_fno_lax_vector_conversions))
2432 CmdArgs.push_back("-fno-lax-vector-conversions");
2433
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002434 if (Args.getLastArg(options::OPT_fapple_kext))
2435 CmdArgs.push_back("-fapple-kext");
2436
David Blaikie690f21e2012-06-14 18:55:27 +00002437 if (Args.hasFlag(options::OPT_frewrite_includes,
2438 options::OPT_fno_rewrite_includes, false))
2439 CmdArgs.push_back("-frewrite-includes");
2440
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002441 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002442 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002443 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002444 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2445 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002446
2447 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2448 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002449 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002450 }
2451
Bob Wilson14adb362012-02-03 06:27:22 +00002452 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002453
Chandler Carruth6e501032011-03-27 00:04:55 +00002454 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2455 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2456 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2457 options::OPT_fno_wrapv)) {
2458 if (A->getOption().matches(options::OPT_fwrapv))
2459 CmdArgs.push_back("-fwrapv");
2460 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2461 options::OPT_fno_strict_overflow)) {
2462 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2463 CmdArgs.push_back("-fwrapv");
2464 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002465 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002466 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002467
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002468 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2469
Mahesha S6a682be42012-10-27 07:47:56 +00002470
Daniel Dunbar4930e332009-11-17 08:07:36 +00002471 // -stack-protector=0 is default.
2472 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002473 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2474 options::OPT_fstack_protector_all,
2475 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002476 if (A->getOption().matches(options::OPT_fstack_protector))
2477 StackProtectorLevel = 1;
2478 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2479 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002480 } else {
2481 StackProtectorLevel =
2482 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2483 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002484 if (StackProtectorLevel) {
2485 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002486 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002487 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002488
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002489 // --param ssp-buffer-size=
2490 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2491 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002492 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002493 if (Str.startswith("ssp-buffer-size=")) {
2494 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002495 CmdArgs.push_back("-stack-protector-buffer-size");
2496 // FIXME: Verify the argument is a valid integer.
2497 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002498 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002499 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002500 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002501 }
2502
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002503 // Translate -mstackrealign
2504 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2505 false)) {
2506 CmdArgs.push_back("-backend-option");
2507 CmdArgs.push_back("-force-align-stack");
2508 }
2509 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2510 false)) {
2511 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2512 }
2513
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002514 if (Args.hasArg(options::OPT_mstack_alignment)) {
2515 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2516 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002517 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002518 // -mkernel implies -mstrict-align; don't add the redundant option.
2519 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002520 CmdArgs.push_back("-backend-option");
2521 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002522 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002523
Daniel Dunbard18049a2009-04-07 21:16:11 +00002524 // Forward -f options with positive and negative forms; we translate
2525 // these by hand.
2526
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002527 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002528 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002529 CmdArgs.push_back("-fapple-kext");
2530 if (!Args.hasArg(options::OPT_fbuiltin))
2531 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002532 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002533 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002534 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002535 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002536 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002537
Nuno Lopes13c88c72009-12-16 16:59:22 +00002538 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2539 options::OPT_fno_assume_sane_operator_new))
2540 CmdArgs.push_back("-fno-assume-sane-operator-new");
2541
Daniel Dunbar4930e332009-11-17 08:07:36 +00002542 // -fblocks=0 is default.
2543 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002544 getToolChain().IsBlocksDefault()) ||
2545 (Args.hasArg(options::OPT_fgnu_runtime) &&
2546 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2547 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002548 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002549
2550 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2551 !getToolChain().hasBlocksRuntime())
2552 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002553 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002554
Douglas Gregor226173a2012-01-18 15:19:58 +00002555 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2556 // users must also pass -fcxx-modules. The latter flag will disappear once the
2557 // modules implementation is solid for C++/Objective-C++ programs as well.
2558 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2559 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2560 options::OPT_fno_cxx_modules,
2561 false);
2562 if (AllowedInCXX || !types::isCXX(InputType))
2563 CmdArgs.push_back("-fmodules");
2564 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002565
John McCalldfea9982010-04-09 19:12:06 +00002566 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002567 if (Args.hasFlag(options::OPT_fno_access_control,
2568 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002569 false))
John McCall3155f572010-04-09 19:03:51 +00002570 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002571
Anders Carlssond470fef2010-11-21 00:09:52 +00002572 // -felide-constructors is the default.
2573 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2574 options::OPT_felide_constructors,
2575 false))
2576 CmdArgs.push_back("-fno-elide-constructors");
2577
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002578 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002579 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002580 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002581 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002582
Richard Smith52be6192012-11-05 22:04:41 +00002583 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002584 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002585 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002586 Args.getLastArg(options::OPT_mkernel,
2587 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002588 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002589 D.Diag(diag::err_drv_argument_not_allowed_with)
2590 << "-fsanitize=vptr" << NoRttiArg;
2591 }
2592 }
2593
Tony Linthicum76329bf2011-12-12 21:14:55 +00002594 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002595 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002596 options::OPT_fno_short_enums,
2597 getToolChain().getTriple().getArch() ==
2598 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002599 CmdArgs.push_back("-fshort-enums");
2600
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002601 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002602 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002603 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002604 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002605
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002606 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002607 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002608 options::OPT_fno_threadsafe_statics))
2609 CmdArgs.push_back("-fno-threadsafe-statics");
2610
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002611 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002612 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2613 options::OPT_fno_use_cxa_atexit,
2614 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002615 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002616 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2617 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002618 CmdArgs.push_back("-fno-use-cxa-atexit");
2619
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002620 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002621 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002622 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2623 CmdArgs.push_back("-fms-extensions");
2624
Chad Rosiered943242012-07-20 21:20:33 +00002625 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002626 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2627 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002628
Francois Pichet1b4f1632011-09-17 04:32:15 +00002629 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002630 if (Args.hasFlag(options::OPT_fms_compatibility,
2631 options::OPT_fno_ms_compatibility,
2632 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2633 Args.hasFlag(options::OPT_fms_extensions,
2634 options::OPT_fno_ms_extensions,
2635 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002636 CmdArgs.push_back("-fms-compatibility");
2637
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002638 // -fmsc-version=1300 is default.
2639 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2640 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2641 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002642 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002643 if (msc_ver.empty())
2644 CmdArgs.push_back("-fmsc-version=1300");
2645 else
2646 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2647 }
2648
2649
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002650 // -fborland-extensions=0 is default.
2651 if (Args.hasFlag(options::OPT_fborland_extensions,
2652 options::OPT_fno_borland_extensions, false))
2653 CmdArgs.push_back("-fborland-extensions");
2654
Francois Pichet02744872011-09-01 16:38:08 +00002655 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2656 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002657 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2658 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002659 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002660 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002661
Chandler Carruthe03aa552010-04-17 20:17:31 +00002662 // -fgnu-keywords default varies depending on language; only pass if
2663 // specified.
2664 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002665 options::OPT_fno_gnu_keywords))
2666 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002667
Rafael Espindola922a6242011-06-02 17:30:53 +00002668 if (Args.hasFlag(options::OPT_fgnu89_inline,
2669 options::OPT_fno_gnu89_inline,
2670 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002671 CmdArgs.push_back("-fgnu89-inline");
2672
Chad Rosier9c76d242012-03-15 22:31:42 +00002673 if (Args.hasArg(options::OPT_fno_inline))
2674 CmdArgs.push_back("-fno-inline");
2675
Chad Rosier64d6be92012-03-06 21:17:19 +00002676 if (Args.hasArg(options::OPT_fno_inline_functions))
2677 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002678
John McCall5fb5df92012-06-20 06:18:46 +00002679 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002680
John McCall5fb5df92012-06-20 06:18:46 +00002681 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2682 // legacy is the default.
2683 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002684 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2685 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002686 objcRuntime.isLegacyDispatchDefaultForArch(
2687 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002688 if (getToolChain().UseObjCMixedDispatch())
2689 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2690 else
2691 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2692 }
2693 }
2694
Nico Weber97bd94b2012-03-09 21:19:44 +00002695 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2696 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002697 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002698 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2699 }
2700
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002701 // -fencode-extended-block-signature=1 is default.
2702 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2703 CmdArgs.push_back("-fencode-extended-block-signature");
2704 }
2705
John McCall24fc0de2011-07-06 00:26:06 +00002706 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2707 // NOTE: This logic is duplicated in ToolChains.cpp.
2708 bool ARC = isObjCAutoRefCount(Args);
2709 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002710 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002711
John McCall24fc0de2011-07-06 00:26:06 +00002712 CmdArgs.push_back("-fobjc-arc");
2713
Chandler Carruth491db322011-11-04 07:34:47 +00002714 // FIXME: It seems like this entire block, and several around it should be
2715 // wrapped in isObjC, but for now we just use it here as this is where it
2716 // was being used previously.
2717 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2718 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2719 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2720 else
2721 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2722 }
2723
John McCall24fc0de2011-07-06 00:26:06 +00002724 // Allow the user to enable full exceptions code emission.
2725 // We define off for Objective-CC, on for Objective-C++.
2726 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2727 options::OPT_fno_objc_arc_exceptions,
2728 /*default*/ types::isCXX(InputType)))
2729 CmdArgs.push_back("-fobjc-arc-exceptions");
2730 }
2731
2732 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2733 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002734 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002735 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002736
John McCall24fc0de2011-07-06 00:26:06 +00002737 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2738 // takes precedence.
2739 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2740 if (!GCArg)
2741 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2742 if (GCArg) {
2743 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002744 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002745 << GCArg->getAsString(Args);
2746 } else if (getToolChain().SupportsObjCGC()) {
2747 GCArg->render(Args, CmdArgs);
2748 } else {
2749 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002750 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002751 << GCArg->getAsString(Args);
2752 }
2753 }
2754
John McCallb5f652e2011-06-22 00:53:57 +00002755 // Add exception args.
2756 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002757 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002758
2759 if (getToolChain().UseSjLjExceptions())
2760 CmdArgs.push_back("-fsjlj-exceptions");
2761
2762 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002763 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2764 options::OPT_fno_assume_sane_operator_new))
2765 CmdArgs.push_back("-fno-assume-sane-operator-new");
2766
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002767 // -fconstant-cfstrings is default, and may be subject to argument translation
2768 // on Darwin.
2769 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2770 options::OPT_fno_constant_cfstrings) ||
2771 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2772 options::OPT_mno_constant_cfstrings))
2773 CmdArgs.push_back("-fno-constant-cfstrings");
2774
John Thompsoned4e2952009-11-05 20:14:16 +00002775 // -fshort-wchar default varies depending on platform; only
2776 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002777 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2778 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002779
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002780 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2781 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002782 //
2783 // FIXME: This is gross; that translation should be pulled from the
2784 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002785 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002786 options::OPT_fno_pascal_strings,
2787 false) ||
2788 Args.hasFlag(options::OPT_mpascal_strings,
2789 options::OPT_mno_pascal_strings,
2790 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002791 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002792
Daniel Dunbar096ed292011-10-05 21:04:55 +00002793 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2794 // -fno-pack-struct doesn't apply to -fpack-struct=.
2795 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002796 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002797 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002798 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002799 } else if (Args.hasFlag(options::OPT_fpack_struct,
2800 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002801 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002802 }
2803
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002804 if (Args.hasArg(options::OPT_mkernel) ||
2805 Args.hasArg(options::OPT_fapple_kext)) {
2806 if (!Args.hasArg(options::OPT_fcommon))
2807 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002808 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002809 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002810
Daniel Dunbard18049a2009-04-07 21:16:11 +00002811 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002812 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002813 CmdArgs.push_back("-fno-common");
2814
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002815 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002816 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002817 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002818 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002819 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002820 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2821
Daniel Dunbar6358d682010-10-15 22:30:42 +00002822 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2823 if (!Args.hasFlag(options::OPT_ffor_scope,
2824 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002825 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002826 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2827
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002828 // -fcaret-diagnostics is default.
2829 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2830 options::OPT_fno_caret_diagnostics, true))
2831 CmdArgs.push_back("-fno-caret-diagnostics");
2832
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002833 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002834 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002835 options::OPT_fno_diagnostics_fixit_info))
2836 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002837
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002838 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002839 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002840 options::OPT_fno_diagnostics_show_option))
2841 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002842
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002843 if (const Arg *A =
2844 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2845 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00002846 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002847 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002848
Douglas Gregor643c9222011-05-21 17:07:29 +00002849 if (const Arg *A =
2850 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2851 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00002852 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00002853 }
2854
Chandler Carruthb6766f02011-03-27 01:50:55 +00002855 if (Arg *A = Args.getLastArg(
2856 options::OPT_fdiagnostics_show_note_include_stack,
2857 options::OPT_fno_diagnostics_show_note_include_stack)) {
2858 if (A->getOption().matches(
2859 options::OPT_fdiagnostics_show_note_include_stack))
2860 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2861 else
2862 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2863 }
2864
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002865 // Color diagnostics are the default, unless the terminal doesn't support
2866 // them.
2867 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002868 options::OPT_fno_color_diagnostics,
2869 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002870 CmdArgs.push_back("-fcolor-diagnostics");
2871
Daniel Dunbardb097022009-06-08 21:13:54 +00002872 if (!Args.hasFlag(options::OPT_fshow_source_location,
2873 options::OPT_fno_show_source_location))
2874 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002875
Douglas Gregor643c9222011-05-21 17:07:29 +00002876 if (!Args.hasFlag(options::OPT_fshow_column,
2877 options::OPT_fno_show_column,
2878 true))
2879 CmdArgs.push_back("-fno-show-column");
2880
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002881 if (!Args.hasFlag(options::OPT_fspell_checking,
2882 options::OPT_fno_spell_checking))
2883 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002884
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002885
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002886 // Silently ignore -fasm-blocks for now.
2887 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2888 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002889
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002890 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2891 A->render(Args, CmdArgs);
2892
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002893 // -fdollars-in-identifiers default varies depending on platform and
2894 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002895 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002896 options::OPT_fno_dollars_in_identifiers)) {
2897 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002898 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002899 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002900 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002901 }
2902
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002903 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2904 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002905 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002906 options::OPT_fno_unit_at_a_time)) {
2907 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002908 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002909 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002910
Eli Friedman055c9702011-11-02 01:53:16 +00002911 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2912 options::OPT_fno_apple_pragma_pack, false))
2913 CmdArgs.push_back("-fapple-pragma-pack");
2914
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002915 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002916 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002917 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002918#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002919 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002920 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2921 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2922 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2923 CmdArgs.push_back("-fno-builtin-strcat");
2924 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2925 CmdArgs.push_back("-fno-builtin-strcpy");
2926 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002927#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002928
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002929 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002930 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002931 options::OPT_traditional_cpp)) {
2932 if (isa<PreprocessJobAction>(JA))
2933 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002934 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002935 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002936 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002937
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002938 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002939 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002940
2941 // Handle serialized diagnostics.
2942 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2943 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00002944 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002945 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002946
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002947 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2948 CmdArgs.push_back("-fretain-comments-from-system-headers");
2949
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002950 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2951 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002952 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002953 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2954 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002955 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002956
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002957 // We translate this by hand to the -cc1 argument, since nightly test uses
2958 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00002959 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002960 CmdArgs.push_back("-disable-llvm-optzns");
2961 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002962 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002963 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002964
Daniel Dunbard67a3222009-03-30 06:36:42 +00002965 if (Output.getType() == types::TY_Dependencies) {
2966 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002967 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002968 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002969 CmdArgs.push_back(Output.getFilename());
2970 } else {
2971 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002972 }
2973
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002974 for (InputInfoList::const_iterator
2975 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2976 const InputInfo &II = *it;
2977 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00002978 if (Args.hasArg(options::OPT_rewrite_objc))
2979 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2980 else
2981 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002982 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002983 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002984 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002985 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002986 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002987
Chris Lattnere9d7d782009-11-03 19:50:27 +00002988 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2989
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002990 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002991
2992 // Optionally embed the -cc1 level arguments into the debug info, for build
2993 // analysis.
2994 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002995 ArgStringList OriginalArgs;
2996 for (ArgList::const_iterator it = Args.begin(),
2997 ie = Args.end(); it != ie; ++it)
2998 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002999
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003000 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003001 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003002 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003003 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003004 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003005 }
3006 CmdArgs.push_back("-dwarf-debug-flags");
3007 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3008 }
3009
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003010 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003011
Roman Divacky178e01602011-02-10 16:52:03 +00003012 if (Arg *A = Args.getLastArg(options::OPT_pg))
3013 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003014 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003015 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003016
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003017 // Claim some arguments which clang supports automatically.
3018
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003019 // -fpch-preprocess is used with gcc to add a special marker in the output to
3020 // include the PCH file. Clang's PTH solution is completely transparent, so we
3021 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003022 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003023
Daniel Dunbar17731772009-03-23 19:03:36 +00003024 // Claim some arguments which clang doesn't support, but we don't
3025 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003026 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3027 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003028
Rafael Espindolad95a8122011-03-01 05:25:27 +00003029 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003030 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003031 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003032}
3033
Jim Grosbach576452b2012-02-10 20:37:10 +00003034void ClangAs::AddARMTargetArgs(const ArgList &Args,
3035 ArgStringList &CmdArgs) const {
3036 const Driver &D = getToolChain().getDriver();
3037 llvm::Triple Triple = getToolChain().getTriple();
3038
3039 // Set the CPU based on -march= and -mcpu=.
3040 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003041 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003042
3043 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003044 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003045 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003046
3047 // Honor -mfpmath=.
3048 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003049 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003050}
3051
John McCall5fb5df92012-06-20 06:18:46 +00003052/// Add options related to the Objective-C runtime/ABI.
3053///
3054/// Returns true if the runtime is non-fragile.
3055ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3056 ArgStringList &cmdArgs,
3057 RewriteKind rewriteKind) const {
3058 // Look for the controlling runtime option.
3059 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3060 options::OPT_fgnu_runtime,
3061 options::OPT_fobjc_runtime_EQ);
3062
3063 // Just forward -fobjc-runtime= to the frontend. This supercedes
3064 // options about fragility.
3065 if (runtimeArg &&
3066 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3067 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003068 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003069 if (runtime.tryParse(value)) {
3070 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3071 << value;
3072 }
3073
3074 runtimeArg->render(args, cmdArgs);
3075 return runtime;
3076 }
3077
3078 // Otherwise, we'll need the ABI "version". Version numbers are
3079 // slightly confusing for historical reasons:
3080 // 1 - Traditional "fragile" ABI
3081 // 2 - Non-fragile ABI, version 1
3082 // 3 - Non-fragile ABI, version 2
3083 unsigned objcABIVersion = 1;
3084 // If -fobjc-abi-version= is present, use that to set the version.
3085 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003086 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003087 if (value == "1")
3088 objcABIVersion = 1;
3089 else if (value == "2")
3090 objcABIVersion = 2;
3091 else if (value == "3")
3092 objcABIVersion = 3;
3093 else
3094 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3095 << value;
3096 } else {
3097 // Otherwise, determine if we are using the non-fragile ABI.
3098 bool nonFragileABIIsDefault =
3099 (rewriteKind == RK_NonFragile ||
3100 (rewriteKind == RK_None &&
3101 getToolChain().IsObjCNonFragileABIDefault()));
3102 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3103 options::OPT_fno_objc_nonfragile_abi,
3104 nonFragileABIIsDefault)) {
3105 // Determine the non-fragile ABI version to use.
3106#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3107 unsigned nonFragileABIVersion = 1;
3108#else
3109 unsigned nonFragileABIVersion = 2;
3110#endif
3111
3112 if (Arg *abiArg = args.getLastArg(
3113 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003114 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003115 if (value == "1")
3116 nonFragileABIVersion = 1;
3117 else if (value == "2")
3118 nonFragileABIVersion = 2;
3119 else
3120 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3121 << value;
3122 }
3123
3124 objcABIVersion = 1 + nonFragileABIVersion;
3125 } else {
3126 objcABIVersion = 1;
3127 }
3128 }
3129
3130 // We don't actually care about the ABI version other than whether
3131 // it's non-fragile.
3132 bool isNonFragile = objcABIVersion != 1;
3133
3134 // If we have no runtime argument, ask the toolchain for its default runtime.
3135 // However, the rewriter only really supports the Mac runtime, so assume that.
3136 ObjCRuntime runtime;
3137 if (!runtimeArg) {
3138 switch (rewriteKind) {
3139 case RK_None:
3140 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3141 break;
3142 case RK_Fragile:
3143 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3144 break;
3145 case RK_NonFragile:
3146 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3147 break;
3148 }
3149
3150 // -fnext-runtime
3151 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3152 // On Darwin, make this use the default behavior for the toolchain.
3153 if (getToolChain().getTriple().isOSDarwin()) {
3154 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3155
3156 // Otherwise, build for a generic macosx port.
3157 } else {
3158 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3159 }
3160
3161 // -fgnu-runtime
3162 } else {
3163 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003164 // Legacy behaviour is to target the gnustep runtime if we are i
3165 // non-fragile mode or the GCC runtime in fragile mode.
3166 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003167 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003168 else
3169 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003170 }
3171
3172 cmdArgs.push_back(args.MakeArgString(
3173 "-fobjc-runtime=" + runtime.getAsString()));
3174 return runtime;
3175}
3176
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003177void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003178 const InputInfo &Output,
3179 const InputInfoList &Inputs,
3180 const ArgList &Args,
3181 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003182 ArgStringList CmdArgs;
3183
3184 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3185 const InputInfo &Input = Inputs[0];
3186
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003187 // Don't warn about "clang -w -c foo.s"
3188 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003189 // and "clang -emit-llvm -c foo.s"
3190 Args.ClaimAllArgs(options::OPT_emit_llvm);
3191 // and "clang -use-gold-plugin -c foo.s"
3192 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003193
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003194 // Invoke ourselves in -cc1as mode.
3195 //
3196 // FIXME: Implement custom jobs for internal actions.
3197 CmdArgs.push_back("-cc1as");
3198
3199 // Add the "effective" target triple.
3200 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003201 std::string TripleStr =
3202 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003203 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3204
3205 // Set the output mode, we currently only expect to be used as a real
3206 // assembler.
3207 CmdArgs.push_back("-filetype");
3208 CmdArgs.push_back("obj");
3209
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003210 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003211 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003212
Jim Grosbach576452b2012-02-10 20:37:10 +00003213 // Add target specific cpu and features flags.
3214 switch(getToolChain().getTriple().getArch()) {
3215 default:
3216 break;
3217
3218 case llvm::Triple::arm:
3219 case llvm::Triple::thumb:
3220 AddARMTargetArgs(Args, CmdArgs);
3221 break;
3222 }
3223
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003224 // Ignore explicit -force_cpusubtype_ALL option.
3225 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003226
Eric Christopherfc3ee562012-01-10 00:38:01 +00003227 // Determine the original source input.
3228 const Action *SourceAction = &JA;
3229 while (SourceAction->getKind() != Action::InputClass) {
3230 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3231 SourceAction = SourceAction->getInputs()[0];
3232 }
3233
3234 // Forward -g, assuming we are dealing with an actual assembly file.
3235 if (SourceAction->getType() == types::TY_Asm ||
3236 SourceAction->getType() == types::TY_PP_Asm) {
3237 Args.ClaimAllArgs(options::OPT_g_Group);
3238 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3239 if (!A->getOption().matches(options::OPT_g0))
3240 CmdArgs.push_back("-g");
3241 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003242
3243 // Optionally embed the -cc1as level arguments into the debug info, for build
3244 // analysis.
3245 if (getToolChain().UseDwarfDebugFlags()) {
3246 ArgStringList OriginalArgs;
3247 for (ArgList::const_iterator it = Args.begin(),
3248 ie = Args.end(); it != ie; ++it)
3249 (*it)->render(Args, OriginalArgs);
3250
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003251 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003252 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3253 Flags += Exec;
3254 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3255 Flags += " ";
3256 Flags += OriginalArgs[i];
3257 }
3258 CmdArgs.push_back("-dwarf-debug-flags");
3259 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3260 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003261
3262 // FIXME: Add -static support, once we have it.
3263
3264 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3265 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003266 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003267
3268 assert(Output.isFilename() && "Unexpected lipo output.");
3269 CmdArgs.push_back("-o");
3270 CmdArgs.push_back(Output.getFilename());
3271
Daniel Dunbarb440f562010-08-02 02:38:21 +00003272 assert(Input.isFilename() && "Invalid input.");
3273 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003274
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003275 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003276 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003277}
3278
Daniel Dunbara3246a02009-03-18 08:07:30 +00003279void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003280 const InputInfo &Output,
3281 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003282 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003283 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003284 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003285 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003286
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003287 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003288 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003289 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003290 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003291 // Don't forward any -g arguments to assembly steps.
3292 if (isa<AssembleJobAction>(JA) &&
3293 A->getOption().matches(options::OPT_g_Group))
3294 continue;
3295
Daniel Dunbar2da02722009-03-19 07:55:12 +00003296 // It is unfortunate that we have to claim here, as this means
3297 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003298 // platforms using a generic gcc, even if we are just using gcc
3299 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003300 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003301 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003302 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003303 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003304
Daniel Dunbar4e295052010-01-25 22:35:08 +00003305 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003306
3307 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003308 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003309 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003310 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003311
3312 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003313 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003314 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003315 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003316 CmdArgs.push_back("ppc64");
3317 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003318 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003319 }
3320
Daniel Dunbar5716d872009-05-02 21:41:52 +00003321 // Try to force gcc to match the tool chain we want, if we recognize
3322 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003323 //
3324 // FIXME: The triple class should directly provide the information we want
3325 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003326 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003327 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003328 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003329 CmdArgs.push_back("-m64");
3330
Daniel Dunbarb440f562010-08-02 02:38:21 +00003331 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003332 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003333 CmdArgs.push_back(Output.getFilename());
3334 } else {
3335 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003336 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003337 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003338
Tony Linthicum76329bf2011-12-12 21:14:55 +00003339 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3340 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003341
3342 // Only pass -x if gcc will understand it; otherwise hope gcc
3343 // understands the suffix correctly. The main use case this would go
3344 // wrong in is for linker inputs if they happened to have an odd
3345 // suffix; really the only way to get this to happen is a command
3346 // like '-x foobar a.c' which will treat a.c like a linker input.
3347 //
3348 // FIXME: For the linker case specifically, can we safely convert
3349 // inputs into '-Wl,' options?
3350 for (InputInfoList::const_iterator
3351 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3352 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003353
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003354 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003355 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3356 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003357 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003358 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003359 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003360 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003361 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003362
Daniel Dunbara3246a02009-03-18 08:07:30 +00003363 if (types::canTypeBeUserSpecified(II.getType())) {
3364 CmdArgs.push_back("-x");
3365 CmdArgs.push_back(types::getTypeName(II.getType()));
3366 }
3367
Daniel Dunbarb440f562010-08-02 02:38:21 +00003368 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003369 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003370 else {
3371 const Arg &A = II.getInputArg();
3372
3373 // Reverse translate some rewritten options.
3374 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3375 CmdArgs.push_back("-lstdc++");
3376 continue;
3377 }
3378
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003379 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003380 A.render(Args, CmdArgs);
3381 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003382 }
3383
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003384 const std::string customGCCName = D.getCCCGenericGCCName();
3385 const char *GCCName;
3386 if (!customGCCName.empty())
3387 GCCName = customGCCName.c_str();
3388 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003389 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003390 } else
3391 GCCName = "gcc";
3392
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003393 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003394 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003395 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003396}
3397
Daniel Dunbar4e295052010-01-25 22:35:08 +00003398void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3399 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003400 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003401}
3402
Daniel Dunbar4e295052010-01-25 22:35:08 +00003403void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3404 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003405 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003406}
3407
Daniel Dunbar4e295052010-01-25 22:35:08 +00003408void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3409 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003410 const Driver &D = getToolChain().getDriver();
3411
Daniel Dunbar4e295052010-01-25 22:35:08 +00003412 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003413 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3414 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003415 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003416 else {
3417 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003418 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003419 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003420
Daniel Dunbar4e295052010-01-25 22:35:08 +00003421 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003422 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003423}
3424
Daniel Dunbar4e295052010-01-25 22:35:08 +00003425void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3426 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003427 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003428}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003429
Daniel Dunbar4e295052010-01-25 22:35:08 +00003430void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3431 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003432 // The types are (hopefully) good enough.
3433}
3434
Tony Linthicum76329bf2011-12-12 21:14:55 +00003435// Hexagon tools start.
3436void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3437 ArgStringList &CmdArgs) const {
3438
3439}
3440void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3441 const InputInfo &Output,
3442 const InputInfoList &Inputs,
3443 const ArgList &Args,
3444 const char *LinkingOutput) const {
3445
3446 const Driver &D = getToolChain().getDriver();
3447 ArgStringList CmdArgs;
3448
3449 std::string MarchString = "-march=";
3450 MarchString += getHexagonTargetCPU(Args);
3451 CmdArgs.push_back(Args.MakeArgString(MarchString));
3452
3453 RenderExtraToolArgs(JA, CmdArgs);
3454
3455 if (Output.isFilename()) {
3456 CmdArgs.push_back("-o");
3457 CmdArgs.push_back(Output.getFilename());
3458 } else {
3459 assert(Output.isNothing() && "Unexpected output");
3460 CmdArgs.push_back("-fsyntax-only");
3461 }
3462
3463
3464 // Only pass -x if gcc will understand it; otherwise hope gcc
3465 // understands the suffix correctly. The main use case this would go
3466 // wrong in is for linker inputs if they happened to have an odd
3467 // suffix; really the only way to get this to happen is a command
3468 // like '-x foobar a.c' which will treat a.c like a linker input.
3469 //
3470 // FIXME: For the linker case specifically, can we safely convert
3471 // inputs into '-Wl,' options?
3472 for (InputInfoList::const_iterator
3473 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3474 const InputInfo &II = *it;
3475
3476 // Don't try to pass LLVM or AST inputs to a generic gcc.
3477 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3478 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3479 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3480 << getToolChain().getTripleString();
3481 else if (II.getType() == types::TY_AST)
3482 D.Diag(clang::diag::err_drv_no_ast_support)
3483 << getToolChain().getTripleString();
3484
3485 if (II.isFilename())
3486 CmdArgs.push_back(II.getFilename());
3487 else
3488 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3489 II.getInputArg().render(Args, CmdArgs);
3490 }
3491
3492 const char *GCCName = "hexagon-as";
3493 const char *Exec =
3494 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3495 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3496
3497}
3498void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3499 ArgStringList &CmdArgs) const {
3500 // The types are (hopefully) good enough.
3501}
3502
3503void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3504 const InputInfo &Output,
3505 const InputInfoList &Inputs,
3506 const ArgList &Args,
3507 const char *LinkingOutput) const {
3508
3509 const Driver &D = getToolChain().getDriver();
3510 ArgStringList CmdArgs;
3511
3512 for (ArgList::const_iterator
3513 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3514 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003515 if (forwardToGCC(A->getOption())) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00003516 // Don't forward any -g arguments to assembly steps.
3517 if (isa<AssembleJobAction>(JA) &&
3518 A->getOption().matches(options::OPT_g_Group))
3519 continue;
3520
3521 // It is unfortunate that we have to claim here, as this means
3522 // we will basically never report anything interesting for
3523 // platforms using a generic gcc, even if we are just using gcc
3524 // to get to the assembler.
3525 A->claim();
3526 A->render(Args, CmdArgs);
3527 }
3528 }
3529
3530 RenderExtraToolArgs(JA, CmdArgs);
3531
3532 // Add Arch Information
3533 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003534 if ((A = getLastHexagonArchArg(Args))) {
3535 if (A->getOption().matches(options::OPT_m_Joined))
3536 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003537 else
Sebastian Pop86500282012-01-13 20:37:10 +00003538 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003539 }
Sebastian Pop86500282012-01-13 20:37:10 +00003540 else {
3541 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3542 }
3543
Tony Linthicum76329bf2011-12-12 21:14:55 +00003544 CmdArgs.push_back("-mqdsp6-compat");
3545
3546 const char *GCCName;
3547 if (C.getDriver().CCCIsCXX)
3548 GCCName = "hexagon-g++";
3549 else
3550 GCCName = "hexagon-gcc";
3551 const char *Exec =
3552 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3553
3554 if (Output.isFilename()) {
3555 CmdArgs.push_back("-o");
3556 CmdArgs.push_back(Output.getFilename());
3557 }
3558
3559 for (InputInfoList::const_iterator
3560 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3561 const InputInfo &II = *it;
3562
3563 // Don't try to pass LLVM or AST inputs to a generic gcc.
3564 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3565 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3566 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3567 << getToolChain().getTripleString();
3568 else if (II.getType() == types::TY_AST)
3569 D.Diag(clang::diag::err_drv_no_ast_support)
3570 << getToolChain().getTripleString();
3571
3572 if (II.isFilename())
3573 CmdArgs.push_back(II.getFilename());
3574 else
3575 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3576 II.getInputArg().render(Args, CmdArgs);
3577 }
3578 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3579
3580}
3581// Hexagon tools end.
3582
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003583llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3584 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3585 // archs which Darwin doesn't use.
3586
3587 // The matching this routine does is fairly pointless, since it is neither the
3588 // complete architecture list, nor a reasonable subset. The problem is that
3589 // historically the driver driver accepts this and also ties its -march=
3590 // handling to the architecture name, so we need to be careful before removing
3591 // support for it.
3592
3593 // This code must be kept in sync with Clang's Darwin specific argument
3594 // translation.
3595
3596 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3597 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3598 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3599 .Case("ppc64", llvm::Triple::ppc64)
3600 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3601 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3602 llvm::Triple::x86)
3603 .Case("x86_64", llvm::Triple::x86_64)
3604 // This is derived from the driver driver.
3605 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3606 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3607 .Case("r600", llvm::Triple::r600)
3608 .Case("nvptx", llvm::Triple::nvptx)
3609 .Case("nvptx64", llvm::Triple::nvptx64)
3610 .Case("amdil", llvm::Triple::amdil)
3611 .Case("spir", llvm::Triple::spir)
3612 .Default(llvm::Triple::UnknownArch);
3613}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003614
Bob Wilsondecc03e2012-11-23 06:14:39 +00003615const char *Clang::getBaseInputName(const ArgList &Args,
3616 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003617 return Args.MakeArgString(
3618 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003619}
3620
Bob Wilsondecc03e2012-11-23 06:14:39 +00003621const char *Clang::getBaseInputStem(const ArgList &Args,
3622 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003623 const char *Str = getBaseInputName(Args, Inputs);
3624
Chris Lattner906bb902011-01-16 08:14:11 +00003625 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003626 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003627
3628 return Str;
3629}
3630
Bob Wilsondecc03e2012-11-23 06:14:39 +00003631const char *Clang::getDependencyFileName(const ArgList &Args,
3632 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003633 // FIXME: Think about this more.
3634 std::string Res;
3635
3636 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003637 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003638 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003639 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00003640 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003641 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003642 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003643}
3644
Daniel Dunbarbe220842009-03-20 16:06:39 +00003645void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003646 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003647 const InputInfoList &Inputs,
3648 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00003649 const char *LinkingOutput) const {
3650 ArgStringList CmdArgs;
3651
3652 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3653 const InputInfo &Input = Inputs[0];
3654
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003655 // Determine the original source input.
3656 const Action *SourceAction = &JA;
3657 while (SourceAction->getKind() != Action::InputClass) {
3658 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3659 SourceAction = SourceAction->getInputs()[0];
3660 }
3661
3662 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00003663 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003664 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003665 if (Args.hasArg(options::OPT_gstabs))
3666 CmdArgs.push_back("--gstabs");
3667 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00003668 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003669 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003670
Daniel Dunbarbe220842009-03-20 16:06:39 +00003671 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003672 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00003673
Daniel Dunbar6d484762010-07-22 01:47:22 +00003674 // Use -force_cpusubtype_ALL on x86 by default.
3675 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3676 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003677 Args.hasArg(options::OPT_force__cpusubtype__ALL))
3678 CmdArgs.push_back("-force_cpusubtype_ALL");
3679
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00003680 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003681 (((Args.hasArg(options::OPT_mkernel) ||
3682 Args.hasArg(options::OPT_fapple_kext)) &&
3683 (!getDarwinToolChain().isTargetIPhoneOS() ||
3684 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
3685 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003686 CmdArgs.push_back("-static");
3687
Daniel Dunbarbe220842009-03-20 16:06:39 +00003688 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3689 options::OPT_Xassembler);
3690
3691 assert(Output.isFilename() && "Unexpected lipo output.");
3692 CmdArgs.push_back("-o");
3693 CmdArgs.push_back(Output.getFilename());
3694
Daniel Dunbarb440f562010-08-02 02:38:21 +00003695 assert(Input.isFilename() && "Invalid input.");
3696 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00003697
3698 // asm_final spec is empty.
3699
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003700 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003701 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003702 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00003703}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00003704
David Blaikie68e081d2011-12-20 02:48:34 +00003705void darwin::DarwinTool::anchor() {}
3706
Daniel Dunbare9ded432009-09-09 18:36:20 +00003707void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3708 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003709 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003710
Daniel Dunbarc1964212009-03-26 16:23:12 +00003711 // Derived from darwin_arch spec.
3712 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003713 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003714
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003715 // FIXME: Is this needed anymore?
3716 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003717 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00003718}
3719
Bill Wendling3b2000f2012-10-02 18:02:50 +00003720bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
3721 // We only need to generate a temp path for LTO if we aren't compiling object
3722 // files. When compiling source files, we run 'dsymutil' after linking. We
3723 // don't run 'dsymutil' when compiling object files.
3724 for (InputInfoList::const_iterator
3725 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
3726 if (it->getType() != types::TY_Object)
3727 return true;
3728
3729 return false;
3730}
3731
Daniel Dunbarccbc4522010-09-09 21:51:05 +00003732void darwin::Link::AddLinkArgs(Compilation &C,
3733 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00003734 ArgStringList &CmdArgs,
3735 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003736 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003737 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00003738
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003739 unsigned Version[3] = { 0, 0, 0 };
3740 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3741 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00003742 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003743 Version[1], Version[2], HadExtra) ||
3744 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003745 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003746 << A->getAsString(Args);
3747 }
3748
3749 // Newer linkers support -demangle, pass it if supported and not disabled by
3750 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00003751 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00003752 // Don't pass -demangle to ld_classic.
3753 //
3754 // FIXME: This is a temporary workaround, ld should be handling this.
3755 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
3756 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00003757 if (getToolChain().getArch() == llvm::Triple::x86) {
3758 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
3759 options::OPT_Wl_COMMA),
3760 ie = Args.filtered_end(); it != ie; ++it) {
3761 const Arg *A = *it;
3762 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00003763 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00003764 UsesLdClassic = true;
3765 }
3766 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00003767 if (!UsesLdClassic)
3768 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003769 }
3770
Bill Wendling313b6bf2012-11-16 23:03:00 +00003771 // If we are using LTO, then automatically create a temporary file path for
3772 // the linker to use, so that it's lifetime will extend past a possible
3773 // dsymutil step.
3774 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
3775 const char *TmpPath = C.getArgs().MakeArgString(
3776 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
3777 C.addTempFile(TmpPath);
3778 CmdArgs.push_back("-object_path_lto");
3779 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00003780 }
3781
Daniel Dunbarc1964212009-03-26 16:23:12 +00003782 // Derived from the "link" spec.
3783 Args.AddAllArgs(CmdArgs, options::OPT_static);
3784 if (!Args.hasArg(options::OPT_static))
3785 CmdArgs.push_back("-dynamic");
3786 if (Args.hasArg(options::OPT_fgnu_runtime)) {
3787 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
3788 // here. How do we wish to handle such things?
3789 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003790
Daniel Dunbarc1964212009-03-26 16:23:12 +00003791 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00003792 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00003793 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00003794 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003795
3796 Args.AddLastArg(CmdArgs, options::OPT_bundle);
3797 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
3798 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
3799
3800 Arg *A;
3801 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
3802 (A = Args.getLastArg(options::OPT_current__version)) ||
3803 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003804 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00003805 << A->getAsString(Args) << "-dynamiclib";
3806
3807 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
3808 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
3809 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
3810 } else {
3811 CmdArgs.push_back("-dylib");
3812
3813 Arg *A;
3814 if ((A = Args.getLastArg(options::OPT_bundle)) ||
3815 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
3816 (A = Args.getLastArg(options::OPT_client__name)) ||
3817 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
3818 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
3819 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003820 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00003821 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003822
Daniel Dunbarc1964212009-03-26 16:23:12 +00003823 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
3824 "-dylib_compatibility_version");
3825 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
3826 "-dylib_current_version");
3827
Daniel Dunbara48823f2010-01-22 02:04:52 +00003828 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003829
3830 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
3831 "-dylib_install_name");
3832 }
3833
3834 Args.AddLastArg(CmdArgs, options::OPT_all__load);
3835 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
3836 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003837 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003838 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003839 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
3840 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
3841 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
3842 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
3843 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
3844 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00003845 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003846 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
3847 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
3848 Args.AddAllArgs(CmdArgs, options::OPT_init);
3849
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003850 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00003851 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00003852
3853 // If we had an explicit -mios-simulator-version-min argument, honor that,
3854 // otherwise use the traditional deployment targets. We can't just check the
3855 // is-sim attribute because existing code follows this path, and the linker
3856 // may not handle the argument.
3857 //
3858 // FIXME: We may be able to remove this, once we can verify no one depends on
3859 // it.
3860 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
3861 CmdArgs.push_back("-ios_simulator_version_min");
3862 else if (DarwinTC.isTargetIPhoneOS())
3863 CmdArgs.push_back("-iphoneos_version_min");
3864 else
3865 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00003866 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003867
Daniel Dunbarc1964212009-03-26 16:23:12 +00003868 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
3869 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
3870 Args.AddLastArg(CmdArgs, options::OPT_single__module);
3871 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
3872 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003873
Daniel Dunbaraf68a882010-07-13 23:31:40 +00003874 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
3875 options::OPT_fno_pie,
3876 options::OPT_fno_PIE)) {
3877 if (A->getOption().matches(options::OPT_fpie) ||
3878 A->getOption().matches(options::OPT_fPIE))
3879 CmdArgs.push_back("-pie");
3880 else
3881 CmdArgs.push_back("-no_pie");
3882 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00003883
3884 Args.AddLastArg(CmdArgs, options::OPT_prebind);
3885 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
3886 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
3887 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
3888 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
3889 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
3890 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
3891 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
3892 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
3893 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
3894 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
3895 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
3896 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
3897 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
3898 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
3899 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003900
Daniel Dunbar84384642011-05-02 21:03:47 +00003901 // Give --sysroot= preference, over the Apple specific behavior to also use
3902 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00003903 StringRef sysroot = C.getSysRoot();
3904 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00003905 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00003906 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00003907 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3908 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00003909 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003910 }
3911
Daniel Dunbarc1964212009-03-26 16:23:12 +00003912 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
3913 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
3914 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
3915 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
3916 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003917 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003918 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
3919 Args.AddAllArgs(CmdArgs, options::OPT_y);
3920 Args.AddLastArg(CmdArgs, options::OPT_w);
3921 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
3922 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
3923 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
3924 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
3925 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
3926 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
3927 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
3928 Args.AddLastArg(CmdArgs, options::OPT_whyload);
3929 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
3930 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
3931 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
3932 Args.AddLastArg(CmdArgs, options::OPT_Mach);
3933}
3934
3935void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003936 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003937 const InputInfoList &Inputs,
3938 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00003939 const char *LinkingOutput) const {
3940 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00003941
Daniel Dunbarc1964212009-03-26 16:23:12 +00003942 // The logic here is derived from gcc's behavior; most of which
3943 // comes from specs (starting with link_command). Consult gcc for
3944 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00003945 ArgStringList CmdArgs;
3946
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00003947 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
3948 if (Args.hasArg(options::OPT_ccc_arcmt_check,
3949 options::OPT_ccc_arcmt_migrate)) {
3950 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
3951 (*I)->claim();
3952 const char *Exec =
3953 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
3954 CmdArgs.push_back(Output.getFilename());
3955 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3956 return;
3957 }
3958
Daniel Dunbarc1964212009-03-26 16:23:12 +00003959 // I'm not sure why this particular decomposition exists in gcc, but
3960 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00003961 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003962
Daniel Dunbarc1964212009-03-26 16:23:12 +00003963 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
3964 Args.AddAllArgs(CmdArgs, options::OPT_s);
3965 Args.AddAllArgs(CmdArgs, options::OPT_t);
3966 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
3967 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003968 Args.AddLastArg(CmdArgs, options::OPT_e);
3969 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
3970 Args.AddAllArgs(CmdArgs, options::OPT_r);
3971
Daniel Dunbar767bbab2010-10-18 22:08:36 +00003972 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
3973 // members of static archive libraries which implement Objective-C classes or
3974 // categories.
3975 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
3976 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003977
Daniel Dunbarc1964212009-03-26 16:23:12 +00003978 CmdArgs.push_back("-o");
3979 CmdArgs.push_back(Output.getFilename());
3980
Chad Rosier06fd3c62012-05-16 23:45:12 +00003981 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00003982 !Args.hasArg(options::OPT_nostartfiles)) {
3983 // Derived from startfile spec.
3984 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003985 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00003986 if (getDarwinToolChain().isTargetIOSSimulator()) {
3987 // The simulator doesn't have a versioned crt1 file.
3988 CmdArgs.push_back("-ldylib1.o");
3989 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00003990 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
3991 CmdArgs.push_back("-ldylib1.o");
3992 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00003993 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00003994 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00003995 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00003996 CmdArgs.push_back("-ldylib1.10.5.o");
3997 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00003998 } else {
3999 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004000 if (!Args.hasArg(options::OPT_static)) {
4001 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004002 if (getDarwinToolChain().isTargetIOSSimulator()) {
4003 // The simulator doesn't have a versioned crt1 file.
4004 CmdArgs.push_back("-lbundle1.o");
4005 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004006 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4007 CmdArgs.push_back("-lbundle1.o");
4008 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004009 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004010 CmdArgs.push_back("-lbundle1.o");
4011 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004012 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004013 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004014 if (Args.hasArg(options::OPT_pg) &&
4015 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004016 if (Args.hasArg(options::OPT_static) ||
4017 Args.hasArg(options::OPT_object) ||
4018 Args.hasArg(options::OPT_preload)) {
4019 CmdArgs.push_back("-lgcrt0.o");
4020 } else {
4021 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004022
Daniel Dunbarc1964212009-03-26 16:23:12 +00004023 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004024 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004025 // By default on OS X 10.8 and later, we don't link with a crt1.o
4026 // file and the linker knows to use _main as the entry point. But,
4027 // when compiling with -pg, we need to link with the gcrt1.o file,
4028 // so pass the -no_new_main option to tell the linker to use the
4029 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004030 if (getDarwinToolChain().isTargetMacOS() &&
4031 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4032 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004033 } else {
4034 if (Args.hasArg(options::OPT_static) ||
4035 Args.hasArg(options::OPT_object) ||
4036 Args.hasArg(options::OPT_preload)) {
4037 CmdArgs.push_back("-lcrt0.o");
4038 } else {
4039 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004040 if (getDarwinToolChain().isTargetIOSSimulator()) {
4041 // The simulator doesn't have a versioned crt1 file.
4042 CmdArgs.push_back("-lcrt1.o");
4043 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004044 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4045 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004046 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004047 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004048 } else {
4049 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4050 CmdArgs.push_back("-lcrt1.o");
4051 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4052 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004053 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004054 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004055
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004056 // darwin_crt2 spec is empty.
4057 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004058 }
4059 }
4060 }
4061 }
4062
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004063 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4064 Args.hasArg(options::OPT_shared_libgcc) &&
4065 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004066 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004067 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004068 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004069 }
4070 }
4071
4072 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004073
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004074 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonovcc429802012-11-16 12:53:14 +00004075 // If we're building a dynamic lib with -fsanitize=address, or
4076 // -fsanitize=undefined, unresolved symbols may appear. Mark all
4077 // of them as dynamic_lookup. Linking executables is handled in
4078 // lib/Driver/ToolChains.cpp.
4079 if (Sanitize.needsAsanRt() || Sanitize.needsUbsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004080 if (Args.hasArg(options::OPT_dynamiclib) ||
4081 Args.hasArg(options::OPT_bundle)) {
4082 CmdArgs.push_back("-undefined");
4083 CmdArgs.push_back("dynamic_lookup");
4084 }
4085 }
4086
Daniel Dunbarc1964212009-03-26 16:23:12 +00004087 if (Args.hasArg(options::OPT_fopenmp))
4088 // This is more complicated in gcc...
4089 CmdArgs.push_back("-lgomp");
4090
Douglas Gregor9295df02012-05-15 21:00:27 +00004091 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4092
Bob Wilson16d93952012-05-15 18:57:39 +00004093 if (isObjCRuntimeLinked(Args) &&
4094 !Args.hasArg(options::OPT_nostdlib) &&
4095 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004096 // Avoid linking compatibility stubs on i386 mac.
4097 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004098 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004099 // If we don't have ARC or subscripting runtime support, link in the
4100 // runtime stubs. We have to do this *before* adding any of the normal
4101 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004102 ObjCRuntime runtime =
4103 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004104 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004105 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004106 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004107 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004108 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004109 CmdArgs.push_back("-framework");
4110 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004111 // Link libobj.
4112 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004113 }
John McCall31168b02011-06-15 23:02:42 +00004114
Daniel Dunbarc1964212009-03-26 16:23:12 +00004115 if (LinkingOutput) {
4116 CmdArgs.push_back("-arch_multiple");
4117 CmdArgs.push_back("-final_output");
4118 CmdArgs.push_back(LinkingOutput);
4119 }
4120
Daniel Dunbarc1964212009-03-26 16:23:12 +00004121 if (Args.hasArg(options::OPT_fnested_functions))
4122 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004123
Daniel Dunbarc1964212009-03-26 16:23:12 +00004124 if (!Args.hasArg(options::OPT_nostdlib) &&
4125 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004126 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004127 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004128
Daniel Dunbarc1964212009-03-26 16:23:12 +00004129 // link_ssp spec is empty.
4130
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004131 // Let the tool chain choose which runtime library to link.
4132 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004133 }
4134
Chad Rosier06fd3c62012-05-16 23:45:12 +00004135 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004136 !Args.hasArg(options::OPT_nostartfiles)) {
4137 // endfile_spec is empty.
4138 }
4139
4140 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4141 Args.AddAllArgs(CmdArgs, options::OPT_F);
4142
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004143 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004144 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004145 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004146}
4147
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004148void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004149 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004150 const InputInfoList &Inputs,
4151 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004152 const char *LinkingOutput) const {
4153 ArgStringList CmdArgs;
4154
4155 CmdArgs.push_back("-create");
4156 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004157
4158 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004159 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004160
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004161 for (InputInfoList::const_iterator
4162 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4163 const InputInfo &II = *it;
4164 assert(II.isFilename() && "Unexpected lipo input.");
4165 CmdArgs.push_back(II.getFilename());
4166 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004167 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004168 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004169 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004170}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004171
Daniel Dunbar88299622010-06-04 18:28:36 +00004172void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004173 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004174 const InputInfoList &Inputs,
4175 const ArgList &Args,
4176 const char *LinkingOutput) const {
4177 ArgStringList CmdArgs;
4178
Daniel Dunbareb86b042011-05-09 17:23:16 +00004179 CmdArgs.push_back("-o");
4180 CmdArgs.push_back(Output.getFilename());
4181
Daniel Dunbar88299622010-06-04 18:28:36 +00004182 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4183 const InputInfo &Input = Inputs[0];
4184 assert(Input.isFilename() && "Unexpected dsymutil input.");
4185 CmdArgs.push_back(Input.getFilename());
4186
Daniel Dunbar88299622010-06-04 18:28:36 +00004187 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004188 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004189 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004190}
4191
Eric Christopher551ef452011-08-23 17:56:55 +00004192void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4193 const InputInfo &Output,
4194 const InputInfoList &Inputs,
4195 const ArgList &Args,
4196 const char *LinkingOutput) const {
4197 ArgStringList CmdArgs;
4198 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004199 CmdArgs.push_back("--debug-info");
4200 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004201 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004202
4203 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4204 const InputInfo &Input = Inputs[0];
4205 assert(Input.isFilename() && "Unexpected verify input");
4206
4207 // Grabbing the output of the earlier dsymutil run.
4208 CmdArgs.push_back(Input.getFilename());
4209
4210 const char *Exec =
4211 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4212 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4213}
4214
David Chisnallf571cde2012-02-15 13:39:01 +00004215void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4216 const InputInfo &Output,
4217 const InputInfoList &Inputs,
4218 const ArgList &Args,
4219 const char *LinkingOutput) const {
4220 ArgStringList CmdArgs;
4221
4222 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4223 options::OPT_Xassembler);
4224
4225 CmdArgs.push_back("-o");
4226 CmdArgs.push_back(Output.getFilename());
4227
4228 for (InputInfoList::const_iterator
4229 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4230 const InputInfo &II = *it;
4231 CmdArgs.push_back(II.getFilename());
4232 }
4233
4234 const char *Exec =
4235 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4236 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4237}
4238
4239
4240void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4241 const InputInfo &Output,
4242 const InputInfoList &Inputs,
4243 const ArgList &Args,
4244 const char *LinkingOutput) const {
4245 // FIXME: Find a real GCC, don't hard-code versions here
4246 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4247 const llvm::Triple &T = getToolChain().getTriple();
4248 std::string LibPath = "/usr/lib/";
4249 llvm::Triple::ArchType Arch = T.getArch();
4250 switch (Arch) {
4251 case llvm::Triple::x86:
4252 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4253 T.getOSName()).str() + "/4.5.2/";
4254 break;
4255 case llvm::Triple::x86_64:
4256 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4257 T.getOSName()).str();
4258 GCCLibPath += "/4.5.2/amd64/";
4259 LibPath += "amd64/";
4260 break;
4261 default:
4262 assert(0 && "Unsupported architecture");
4263 }
4264
4265 ArgStringList CmdArgs;
4266
David Chisnall272a0712012-02-29 15:06:12 +00004267 // Demangle C++ names in errors
4268 CmdArgs.push_back("-C");
4269
David Chisnallf571cde2012-02-15 13:39:01 +00004270 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4271 (!Args.hasArg(options::OPT_shared))) {
4272 CmdArgs.push_back("-e");
4273 CmdArgs.push_back("_start");
4274 }
4275
4276 if (Args.hasArg(options::OPT_static)) {
4277 CmdArgs.push_back("-Bstatic");
4278 CmdArgs.push_back("-dn");
4279 } else {
4280 CmdArgs.push_back("-Bdynamic");
4281 if (Args.hasArg(options::OPT_shared)) {
4282 CmdArgs.push_back("-shared");
4283 } else {
4284 CmdArgs.push_back("--dynamic-linker");
4285 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4286 }
4287 }
4288
4289 if (Output.isFilename()) {
4290 CmdArgs.push_back("-o");
4291 CmdArgs.push_back(Output.getFilename());
4292 } else {
4293 assert(Output.isNothing() && "Invalid output.");
4294 }
4295
4296 if (!Args.hasArg(options::OPT_nostdlib) &&
4297 !Args.hasArg(options::OPT_nostartfiles)) {
4298 if (!Args.hasArg(options::OPT_shared)) {
4299 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4300 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004301 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004302 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4303 } else {
4304 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004305 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4306 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004307 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004308 if (getToolChain().getDriver().CCCIsCXX)
4309 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004310 }
4311
4312 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4313
4314 Args.AddAllArgs(CmdArgs, options::OPT_L);
4315 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4316 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004317 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004318
4319 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4320
4321 if (!Args.hasArg(options::OPT_nostdlib) &&
4322 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004323 if (getToolChain().getDriver().CCCIsCXX)
4324 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004325 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004326 if (!Args.hasArg(options::OPT_shared)) {
4327 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004328 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004329 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004330 }
David Chisnallf571cde2012-02-15 13:39:01 +00004331 }
4332
4333 if (!Args.hasArg(options::OPT_nostdlib) &&
4334 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004335 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004336 }
David Chisnall96de9932012-02-16 16:00:47 +00004337 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004338
4339 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4340
4341 const char *Exec =
4342 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4343 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4344}
4345
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004346void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004347 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004348 const InputInfoList &Inputs,
4349 const ArgList &Args,
4350 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004351 ArgStringList CmdArgs;
4352
4353 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4354 options::OPT_Xassembler);
4355
4356 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004357 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004358
4359 for (InputInfoList::const_iterator
4360 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4361 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004362 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004363 }
4364
4365 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004366 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004367 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004368}
4369
4370void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004371 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004372 const InputInfoList &Inputs,
4373 const ArgList &Args,
4374 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004375 ArgStringList CmdArgs;
4376
4377 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004378 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004379 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004380 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004381 }
4382
4383 if (Args.hasArg(options::OPT_static)) {
4384 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004385 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004386 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004387// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004388 CmdArgs.push_back("-Bdynamic");
4389 if (Args.hasArg(options::OPT_shared)) {
4390 CmdArgs.push_back("-shared");
4391 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004392 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004393 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4394 }
4395 }
4396
Daniel Dunbarb440f562010-08-02 02:38:21 +00004397 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004398 CmdArgs.push_back("-o");
4399 CmdArgs.push_back(Output.getFilename());
4400 } else {
4401 assert(Output.isNothing() && "Invalid output.");
4402 }
4403
4404 if (!Args.hasArg(options::OPT_nostdlib) &&
4405 !Args.hasArg(options::OPT_nostartfiles)) {
4406 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004407 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004408 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004409 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004410 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004411 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004412 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004413 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004414 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004415 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004416 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004417 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004418 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004419 }
4420
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004421 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4422 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004423 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004424
4425 Args.AddAllArgs(CmdArgs, options::OPT_L);
4426 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4427 Args.AddAllArgs(CmdArgs, options::OPT_e);
4428
Daniel Dunbar54423b22010-09-17 00:24:54 +00004429 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004430
4431 if (!Args.hasArg(options::OPT_nostdlib) &&
4432 !Args.hasArg(options::OPT_nodefaultlibs)) {
4433 // FIXME: For some reason GCC passes -lgcc before adding
4434 // the default system libraries. Just mimic this for now.
4435 CmdArgs.push_back("-lgcc");
4436
4437 if (Args.hasArg(options::OPT_pthread))
4438 CmdArgs.push_back("-pthread");
4439 if (!Args.hasArg(options::OPT_shared))
4440 CmdArgs.push_back("-lc");
4441 CmdArgs.push_back("-lgcc");
4442 }
4443
4444 if (!Args.hasArg(options::OPT_nostdlib) &&
4445 !Args.hasArg(options::OPT_nostartfiles)) {
4446 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004447 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004448 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004449 }
4450
Bill Wendling08760582011-06-27 19:15:03 +00004451 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004452
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004453 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004454 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004455 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004456}
4457
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004458void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004459 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004460 const InputInfoList &Inputs,
4461 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004462 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004463 ArgStringList CmdArgs;
4464
4465 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4466 options::OPT_Xassembler);
4467
4468 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004469 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004470
4471 for (InputInfoList::const_iterator
4472 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4473 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004474 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004475 }
4476
4477 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004478 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004479 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004480}
4481
4482void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004483 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004484 const InputInfoList &Inputs,
4485 const ArgList &Args,
4486 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004487 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004488 ArgStringList CmdArgs;
4489
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004490 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004491 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004492 CmdArgs.push_back("-e");
4493 CmdArgs.push_back("__start");
4494 }
4495
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004496 if (Args.hasArg(options::OPT_static)) {
4497 CmdArgs.push_back("-Bstatic");
4498 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004499 if (Args.hasArg(options::OPT_rdynamic))
4500 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004501 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004502 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004503 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004504 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004505 } else {
4506 CmdArgs.push_back("-dynamic-linker");
4507 CmdArgs.push_back("/usr/libexec/ld.so");
4508 }
4509 }
4510
Daniel Dunbarb440f562010-08-02 02:38:21 +00004511 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004512 CmdArgs.push_back("-o");
4513 CmdArgs.push_back(Output.getFilename());
4514 } else {
4515 assert(Output.isNothing() && "Invalid output.");
4516 }
4517
4518 if (!Args.hasArg(options::OPT_nostdlib) &&
4519 !Args.hasArg(options::OPT_nostartfiles)) {
4520 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004521 if (Args.hasArg(options::OPT_pg))
4522 CmdArgs.push_back(Args.MakeArgString(
4523 getToolChain().GetFilePath("gcrt0.o")));
4524 else
4525 CmdArgs.push_back(Args.MakeArgString(
4526 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004527 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004528 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004529 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004530 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004531 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004532 }
4533 }
4534
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004535 std::string Triple = getToolChain().getTripleString();
4536 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004537 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004538 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004539 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004540
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004541 Args.AddAllArgs(CmdArgs, options::OPT_L);
4542 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4543 Args.AddAllArgs(CmdArgs, options::OPT_e);
4544
Daniel Dunbar54423b22010-09-17 00:24:54 +00004545 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004546
4547 if (!Args.hasArg(options::OPT_nostdlib) &&
4548 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004549 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004550 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004551 if (Args.hasArg(options::OPT_pg))
4552 CmdArgs.push_back("-lm_p");
4553 else
4554 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004555 }
4556
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004557 // FIXME: For some reason GCC passes -lgcc before adding
4558 // the default system libraries. Just mimic this for now.
4559 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004560
Eric Christopher17674ec2012-09-13 06:32:34 +00004561 if (Args.hasArg(options::OPT_pthread)) {
4562 if (!Args.hasArg(options::OPT_shared) &&
4563 Args.hasArg(options::OPT_pg))
4564 CmdArgs.push_back("-lpthread_p");
4565 else
4566 CmdArgs.push_back("-lpthread");
4567 }
4568
Chandler Carruth45661652011-12-17 22:32:42 +00004569 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004570 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004571 CmdArgs.push_back("-lc_p");
4572 else
4573 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004574 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004575
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004576 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004577 }
4578
4579 if (!Args.hasArg(options::OPT_nostdlib) &&
4580 !Args.hasArg(options::OPT_nostartfiles)) {
4581 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004582 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004583 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004584 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004585 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004586 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004587 }
4588
4589 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004590 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004591 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004592}
Ed Schoutene33194b2009-04-02 19:13:12 +00004593
Eli Friedman9fa28852012-08-08 23:57:20 +00004594void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4595 const InputInfo &Output,
4596 const InputInfoList &Inputs,
4597 const ArgList &Args,
4598 const char *LinkingOutput) const {
4599 ArgStringList CmdArgs;
4600
4601 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4602 options::OPT_Xassembler);
4603
4604 CmdArgs.push_back("-o");
4605 CmdArgs.push_back(Output.getFilename());
4606
4607 for (InputInfoList::const_iterator
4608 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4609 const InputInfo &II = *it;
4610 CmdArgs.push_back(II.getFilename());
4611 }
4612
4613 const char *Exec =
4614 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4615 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4616}
4617
4618void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4619 const InputInfo &Output,
4620 const InputInfoList &Inputs,
4621 const ArgList &Args,
4622 const char *LinkingOutput) const {
4623 const Driver &D = getToolChain().getDriver();
4624 ArgStringList CmdArgs;
4625
4626 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4627 (!Args.hasArg(options::OPT_shared))) {
4628 CmdArgs.push_back("-e");
4629 CmdArgs.push_back("__start");
4630 }
4631
4632 if (Args.hasArg(options::OPT_static)) {
4633 CmdArgs.push_back("-Bstatic");
4634 } else {
4635 if (Args.hasArg(options::OPT_rdynamic))
4636 CmdArgs.push_back("-export-dynamic");
4637 CmdArgs.push_back("--eh-frame-hdr");
4638 CmdArgs.push_back("-Bdynamic");
4639 if (Args.hasArg(options::OPT_shared)) {
4640 CmdArgs.push_back("-shared");
4641 } else {
4642 CmdArgs.push_back("-dynamic-linker");
4643 CmdArgs.push_back("/usr/libexec/ld.so");
4644 }
4645 }
4646
4647 if (Output.isFilename()) {
4648 CmdArgs.push_back("-o");
4649 CmdArgs.push_back(Output.getFilename());
4650 } else {
4651 assert(Output.isNothing() && "Invalid output.");
4652 }
4653
4654 if (!Args.hasArg(options::OPT_nostdlib) &&
4655 !Args.hasArg(options::OPT_nostartfiles)) {
4656 if (!Args.hasArg(options::OPT_shared)) {
4657 if (Args.hasArg(options::OPT_pg))
4658 CmdArgs.push_back(Args.MakeArgString(
4659 getToolChain().GetFilePath("gcrt0.o")));
4660 else
4661 CmdArgs.push_back(Args.MakeArgString(
4662 getToolChain().GetFilePath("crt0.o")));
4663 CmdArgs.push_back(Args.MakeArgString(
4664 getToolChain().GetFilePath("crtbegin.o")));
4665 } else {
4666 CmdArgs.push_back(Args.MakeArgString(
4667 getToolChain().GetFilePath("crtbeginS.o")));
4668 }
4669 }
4670
4671 Args.AddAllArgs(CmdArgs, options::OPT_L);
4672 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4673 Args.AddAllArgs(CmdArgs, options::OPT_e);
4674
4675 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4676
4677 if (!Args.hasArg(options::OPT_nostdlib) &&
4678 !Args.hasArg(options::OPT_nodefaultlibs)) {
4679 if (D.CCCIsCXX) {
4680 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4681 if (Args.hasArg(options::OPT_pg))
4682 CmdArgs.push_back("-lm_p");
4683 else
4684 CmdArgs.push_back("-lm");
4685 }
4686
Rafael Espindola1ad26f02012-10-23 17:07:31 +00004687 if (Args.hasArg(options::OPT_pthread)) {
4688 if (!Args.hasArg(options::OPT_shared) &&
4689 Args.hasArg(options::OPT_pg))
4690 CmdArgs.push_back("-lpthread_p");
4691 else
4692 CmdArgs.push_back("-lpthread");
4693 }
4694
Eli Friedman9fa28852012-08-08 23:57:20 +00004695 if (!Args.hasArg(options::OPT_shared)) {
4696 if (Args.hasArg(options::OPT_pg))
4697 CmdArgs.push_back("-lc_p");
4698 else
4699 CmdArgs.push_back("-lc");
4700 }
4701
4702 std::string myarch = "-lclang_rt.";
4703 const llvm::Triple &T = getToolChain().getTriple();
4704 llvm::Triple::ArchType Arch = T.getArch();
4705 switch (Arch) {
4706 case llvm::Triple::arm:
4707 myarch += ("arm");
4708 break;
4709 case llvm::Triple::x86:
4710 myarch += ("i386");
4711 break;
4712 case llvm::Triple::x86_64:
4713 myarch += ("amd64");
4714 break;
4715 default:
4716 assert(0 && "Unsupported architecture");
4717 }
4718 CmdArgs.push_back(Args.MakeArgString(myarch));
4719 }
4720
4721 if (!Args.hasArg(options::OPT_nostdlib) &&
4722 !Args.hasArg(options::OPT_nostartfiles)) {
4723 if (!Args.hasArg(options::OPT_shared))
4724 CmdArgs.push_back(Args.MakeArgString(
4725 getToolChain().GetFilePath("crtend.o")));
4726 else
4727 CmdArgs.push_back(Args.MakeArgString(
4728 getToolChain().GetFilePath("crtendS.o")));
4729 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00004730
4731 const char *Exec =
4732 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4733 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00004734}
4735
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004736void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004737 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004738 const InputInfoList &Inputs,
4739 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004740 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004741 ArgStringList CmdArgs;
4742
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004743 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4744 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004745 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004746 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004747 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00004748 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004749 else if (getToolChain().getArch() == llvm::Triple::mips ||
4750 getToolChain().getArch() == llvm::Triple::mipsel ||
4751 getToolChain().getArch() == llvm::Triple::mips64 ||
4752 getToolChain().getArch() == llvm::Triple::mips64el) {
4753 StringRef CPUName;
4754 StringRef ABIName;
4755 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004756
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004757 CmdArgs.push_back("-march");
4758 CmdArgs.push_back(CPUName.data());
4759
4760 // Convert ABI name to the GNU tools acceptable variant.
4761 if (ABIName == "o32")
4762 ABIName = "32";
4763 else if (ABIName == "n64")
4764 ABIName = "64";
4765
4766 CmdArgs.push_back("-mabi");
4767 CmdArgs.push_back(ABIName.data());
4768
4769 if (getToolChain().getArch() == llvm::Triple::mips ||
4770 getToolChain().getArch() == llvm::Triple::mips64)
4771 CmdArgs.push_back("-EB");
4772 else
4773 CmdArgs.push_back("-EL");
4774
4775 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
4776 options::OPT_fpic, options::OPT_fno_pic,
4777 options::OPT_fPIE, options::OPT_fno_PIE,
4778 options::OPT_fpie, options::OPT_fno_pie);
4779 if (LastPICArg &&
4780 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
4781 LastPICArg->getOption().matches(options::OPT_fpic) ||
4782 LastPICArg->getOption().matches(options::OPT_fPIE) ||
4783 LastPICArg->getOption().matches(options::OPT_fpie))) {
4784 CmdArgs.push_back("-KPIC");
4785 }
4786 }
Eric Christopher0b26a612010-03-02 02:41:08 +00004787
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004788 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4789 options::OPT_Xassembler);
4790
4791 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004792 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004793
4794 for (InputInfoList::const_iterator
4795 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4796 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004797 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004798 }
4799
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004800 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004801 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004802 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004803}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004804
4805void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004806 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004807 const InputInfoList &Inputs,
4808 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004809 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00004810 const toolchains::FreeBSD& ToolChain =
4811 static_cast<const toolchains::FreeBSD&>(getToolChain());
4812 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004813 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00004814
4815 // Silence warning for "clang -g foo.o -o foo"
4816 Args.ClaimAllArgs(options::OPT_g_Group);
4817 // and "clang -emit-llvm foo.o -o foo"
4818 Args.ClaimAllArgs(options::OPT_emit_llvm);
4819 // and for "clang -w foo.o -o foo". Other warning options are already
4820 // handled somewhere else.
4821 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004822
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00004823 if (!D.SysRoot.empty())
4824 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
4825
Roman Divackyafe2f232012-08-28 15:09:03 +00004826 if (Args.hasArg(options::OPT_pie))
4827 CmdArgs.push_back("-pie");
4828
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004829 if (Args.hasArg(options::OPT_static)) {
4830 CmdArgs.push_back("-Bstatic");
4831 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004832 if (Args.hasArg(options::OPT_rdynamic))
4833 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004834 CmdArgs.push_back("--eh-frame-hdr");
4835 if (Args.hasArg(options::OPT_shared)) {
4836 CmdArgs.push_back("-Bshareable");
4837 } else {
4838 CmdArgs.push_back("-dynamic-linker");
4839 CmdArgs.push_back("/libexec/ld-elf.so.1");
4840 }
Roman Divackyafe2f232012-08-28 15:09:03 +00004841 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
4842 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00004843 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
4844 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
4845 CmdArgs.push_back("--hash-style=both");
4846 }
4847 }
4848 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004849 }
4850
4851 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4852 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004853 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004854 CmdArgs.push_back("-m");
4855 CmdArgs.push_back("elf_i386_fbsd");
4856 }
4857
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004858 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00004859 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00004860 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00004861 }
4862
Daniel Dunbarb440f562010-08-02 02:38:21 +00004863 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004864 CmdArgs.push_back("-o");
4865 CmdArgs.push_back(Output.getFilename());
4866 } else {
4867 assert(Output.isNothing() && "Invalid output.");
4868 }
4869
4870 if (!Args.hasArg(options::OPT_nostdlib) &&
4871 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00004872 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004873 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00004874 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00004875 crt1 = "gcrt1.o";
4876 else if (Args.hasArg(options::OPT_pie))
4877 crt1 = "Scrt1.o";
4878 else
4879 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004880 }
Roman Divackyafe2f232012-08-28 15:09:03 +00004881 if (crt1)
4882 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
4883
4884 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
4885
4886 const char *crtbegin = NULL;
4887 if (Args.hasArg(options::OPT_static))
4888 crtbegin = "crtbeginT.o";
4889 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
4890 crtbegin = "crtbeginS.o";
4891 else
4892 crtbegin = "crtbegin.o";
4893
4894 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004895 }
4896
4897 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00004898 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00004899 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
4900 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004901 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004902 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4903 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00004904 Args.AddAllArgs(CmdArgs, options::OPT_s);
4905 Args.AddAllArgs(CmdArgs, options::OPT_t);
4906 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4907 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004908
Roman Divackyafe2f232012-08-28 15:09:03 +00004909 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004910
4911 if (!Args.hasArg(options::OPT_nostdlib) &&
4912 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00004913 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00004914 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00004915 if (Args.hasArg(options::OPT_pg))
4916 CmdArgs.push_back("-lm_p");
4917 else
4918 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00004919 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004920 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
4921 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00004922 if (Args.hasArg(options::OPT_pg))
4923 CmdArgs.push_back("-lgcc_p");
4924 else
4925 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004926 if (Args.hasArg(options::OPT_static)) {
4927 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00004928 } else if (Args.hasArg(options::OPT_pg)) {
4929 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004930 } else {
4931 CmdArgs.push_back("--as-needed");
4932 CmdArgs.push_back("-lgcc_s");
4933 CmdArgs.push_back("--no-as-needed");
4934 }
4935
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00004936 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00004937 if (Args.hasArg(options::OPT_pg))
4938 CmdArgs.push_back("-lpthread_p");
4939 else
4940 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00004941 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004942
Roman Divacky66f22762011-02-10 16:59:40 +00004943 if (Args.hasArg(options::OPT_pg)) {
4944 if (Args.hasArg(options::OPT_shared))
4945 CmdArgs.push_back("-lc");
4946 else
4947 CmdArgs.push_back("-lc_p");
4948 CmdArgs.push_back("-lgcc_p");
4949 } else {
4950 CmdArgs.push_back("-lc");
4951 CmdArgs.push_back("-lgcc");
4952 }
4953
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004954 if (Args.hasArg(options::OPT_static)) {
4955 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00004956 } else if (Args.hasArg(options::OPT_pg)) {
4957 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004958 } else {
4959 CmdArgs.push_back("--as-needed");
4960 CmdArgs.push_back("-lgcc_s");
4961 CmdArgs.push_back("--no-as-needed");
4962 }
4963 }
4964
4965 if (!Args.hasArg(options::OPT_nostdlib) &&
4966 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00004967 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00004968 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00004969 else
4970 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00004971 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004972 }
4973
Roman Divackyafe2f232012-08-28 15:09:03 +00004974 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004975
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004976 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00004977 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004978 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004979}
Daniel Dunbarcc912342009-05-02 18:28:39 +00004980
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00004981void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4982 const InputInfo &Output,
4983 const InputInfoList &Inputs,
4984 const ArgList &Args,
4985 const char *LinkingOutput) const {
4986 ArgStringList CmdArgs;
4987
4988 // When building 32-bit code on NetBSD/amd64, we have to explicitly
4989 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00004990 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00004991 CmdArgs.push_back("--32");
4992
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00004993 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004994 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00004995 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004996 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00004997 CmdArgs.push_back("-EL");
4998
4999 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5000 options::OPT_Xassembler);
5001
5002 CmdArgs.push_back("-o");
5003 CmdArgs.push_back(Output.getFilename());
5004
5005 for (InputInfoList::const_iterator
5006 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5007 const InputInfo &II = *it;
5008 CmdArgs.push_back(II.getFilename());
5009 }
5010
David Chisnallddbd68f2011-09-27 22:03:18 +00005011 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005012 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5013}
5014
5015void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5016 const InputInfo &Output,
5017 const InputInfoList &Inputs,
5018 const ArgList &Args,
5019 const char *LinkingOutput) const {
5020 const Driver &D = getToolChain().getDriver();
5021 ArgStringList CmdArgs;
5022
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005023 if (!D.SysRoot.empty())
5024 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5025
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005026 if (Args.hasArg(options::OPT_static)) {
5027 CmdArgs.push_back("-Bstatic");
5028 } else {
5029 if (Args.hasArg(options::OPT_rdynamic))
5030 CmdArgs.push_back("-export-dynamic");
5031 CmdArgs.push_back("--eh-frame-hdr");
5032 if (Args.hasArg(options::OPT_shared)) {
5033 CmdArgs.push_back("-Bshareable");
5034 } else {
5035 CmdArgs.push_back("-dynamic-linker");
5036 CmdArgs.push_back("/libexec/ld.elf_so");
5037 }
5038 }
5039
5040 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5041 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005042 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005043 CmdArgs.push_back("-m");
5044 CmdArgs.push_back("elf_i386");
5045 }
5046
5047 if (Output.isFilename()) {
5048 CmdArgs.push_back("-o");
5049 CmdArgs.push_back(Output.getFilename());
5050 } else {
5051 assert(Output.isNothing() && "Invalid output.");
5052 }
5053
5054 if (!Args.hasArg(options::OPT_nostdlib) &&
5055 !Args.hasArg(options::OPT_nostartfiles)) {
5056 if (!Args.hasArg(options::OPT_shared)) {
5057 CmdArgs.push_back(Args.MakeArgString(
5058 getToolChain().GetFilePath("crt0.o")));
5059 CmdArgs.push_back(Args.MakeArgString(
5060 getToolChain().GetFilePath("crti.o")));
5061 CmdArgs.push_back(Args.MakeArgString(
5062 getToolChain().GetFilePath("crtbegin.o")));
5063 } else {
5064 CmdArgs.push_back(Args.MakeArgString(
5065 getToolChain().GetFilePath("crti.o")));
5066 CmdArgs.push_back(Args.MakeArgString(
5067 getToolChain().GetFilePath("crtbeginS.o")));
5068 }
5069 }
5070
5071 Args.AddAllArgs(CmdArgs, options::OPT_L);
5072 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5073 Args.AddAllArgs(CmdArgs, options::OPT_e);
5074 Args.AddAllArgs(CmdArgs, options::OPT_s);
5075 Args.AddAllArgs(CmdArgs, options::OPT_t);
5076 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5077 Args.AddAllArgs(CmdArgs, options::OPT_r);
5078
5079 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5080
5081 if (!Args.hasArg(options::OPT_nostdlib) &&
5082 !Args.hasArg(options::OPT_nodefaultlibs)) {
5083 if (D.CCCIsCXX) {
5084 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5085 CmdArgs.push_back("-lm");
5086 }
5087 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5088 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005089 if (Args.hasArg(options::OPT_static)) {
5090 CmdArgs.push_back("-lgcc_eh");
5091 } else {
5092 CmdArgs.push_back("--as-needed");
5093 CmdArgs.push_back("-lgcc_s");
5094 CmdArgs.push_back("--no-as-needed");
5095 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005096 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005097
5098 if (Args.hasArg(options::OPT_pthread))
5099 CmdArgs.push_back("-lpthread");
5100 CmdArgs.push_back("-lc");
5101
5102 CmdArgs.push_back("-lgcc");
5103 if (Args.hasArg(options::OPT_static)) {
5104 CmdArgs.push_back("-lgcc_eh");
5105 } else {
5106 CmdArgs.push_back("--as-needed");
5107 CmdArgs.push_back("-lgcc_s");
5108 CmdArgs.push_back("--no-as-needed");
5109 }
5110 }
5111
5112 if (!Args.hasArg(options::OPT_nostdlib) &&
5113 !Args.hasArg(options::OPT_nostartfiles)) {
5114 if (!Args.hasArg(options::OPT_shared))
5115 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5116 "crtend.o")));
5117 else
5118 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5119 "crtendS.o")));
5120 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5121 "crtn.o")));
5122 }
5123
Bill Wendling08760582011-06-27 19:15:03 +00005124 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005125
David Chisnallddbd68f2011-09-27 22:03:18 +00005126 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005127 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5128}
5129
Rafael Espindola92b00932010-08-10 00:25:48 +00005130void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5131 const InputInfo &Output,
5132 const InputInfoList &Inputs,
5133 const ArgList &Args,
5134 const char *LinkingOutput) const {
5135 ArgStringList CmdArgs;
5136
5137 // Add --32/--64 to make sure we get the format we want.
5138 // This is incomplete
5139 if (getToolChain().getArch() == llvm::Triple::x86) {
5140 CmdArgs.push_back("--32");
5141 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5142 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005143 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5144 CmdArgs.push_back("-a32");
5145 CmdArgs.push_back("-mppc");
5146 CmdArgs.push_back("-many");
5147 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5148 CmdArgs.push_back("-a64");
5149 CmdArgs.push_back("-mppc64");
5150 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005151 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005152 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005153 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5154 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005155
5156 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5157 getToolChain().getTriple());
5158 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005159
5160 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5161 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5162 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005163 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5164 getToolChain().getArch() == llvm::Triple::mipsel ||
5165 getToolChain().getArch() == llvm::Triple::mips64 ||
5166 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005167 StringRef CPUName;
5168 StringRef ABIName;
5169 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005170
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005171 CmdArgs.push_back("-march");
5172 CmdArgs.push_back(CPUName.data());
5173
5174 // Convert ABI name to the GNU tools acceptable variant.
5175 if (ABIName == "o32")
5176 ABIName = "32";
5177 else if (ABIName == "n64")
5178 ABIName = "64";
5179
5180 CmdArgs.push_back("-mabi");
5181 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005182
5183 if (getToolChain().getArch() == llvm::Triple::mips ||
5184 getToolChain().getArch() == llvm::Triple::mips64)
5185 CmdArgs.push_back("-EB");
5186 else
5187 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005188
5189 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5190 options::OPT_fpic, options::OPT_fno_pic,
5191 options::OPT_fPIE, options::OPT_fno_PIE,
5192 options::OPT_fpie, options::OPT_fno_pie);
5193 if (LastPICArg &&
5194 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5195 LastPICArg->getOption().matches(options::OPT_fpic) ||
5196 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5197 LastPICArg->getOption().matches(options::OPT_fpie))) {
5198 CmdArgs.push_back("-KPIC");
5199 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005200 }
5201
5202 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5203 options::OPT_Xassembler);
5204
5205 CmdArgs.push_back("-o");
5206 CmdArgs.push_back(Output.getFilename());
5207
5208 for (InputInfoList::const_iterator
5209 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5210 const InputInfo &II = *it;
5211 CmdArgs.push_back(II.getFilename());
5212 }
5213
5214 const char *Exec =
5215 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5216 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5217}
5218
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005219static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5220 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005221 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien3d3373c2012-11-19 12:04:11 +00005222 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5223 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolacc354322011-10-17 21:39:04 +00005224 if (!D.CCCIsCXX)
5225 CmdArgs.push_back("-lgcc");
5226
Logan Chien3d3373c2012-11-19 12:04:11 +00005227 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005228 if (D.CCCIsCXX)
5229 CmdArgs.push_back("-lgcc");
5230 } else {
5231 if (!D.CCCIsCXX)
5232 CmdArgs.push_back("--as-needed");
5233 CmdArgs.push_back("-lgcc_s");
5234 if (!D.CCCIsCXX)
5235 CmdArgs.push_back("--no-as-needed");
5236 }
5237
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005238 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005239 CmdArgs.push_back("-lgcc_eh");
5240 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5241 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005242
5243 // According to Android ABI, we have to link with libdl if we are
5244 // linking with non-static libgcc.
5245 //
5246 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5247 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5248 if (isAndroid && !StaticLibgcc)
5249 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005250}
5251
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005252static bool hasMipsN32ABIArg(const ArgList &Args) {
5253 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005254 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005255}
5256
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005257void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5258 const InputInfo &Output,
5259 const InputInfoList &Inputs,
5260 const ArgList &Args,
5261 const char *LinkingOutput) const {
5262 const toolchains::Linux& ToolChain =
5263 static_cast<const toolchains::Linux&>(getToolChain());
5264 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005265 const bool isAndroid =
5266 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005267
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005268 ArgStringList CmdArgs;
5269
Rafael Espindolad1002f62010-11-15 18:28:16 +00005270 // Silence warning for "clang -g foo.o -o foo"
5271 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005272 // and "clang -emit-llvm foo.o -o foo"
5273 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005274 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005275 // handled somewhere else.
5276 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005277
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005278 if (!D.SysRoot.empty())
5279 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005280
Rafael Espindolad47ac232010-11-17 22:26:15 +00005281 if (Args.hasArg(options::OPT_pie))
5282 CmdArgs.push_back("-pie");
5283
Rafael Espindola1c76c592010-11-07 22:57:16 +00005284 if (Args.hasArg(options::OPT_rdynamic))
5285 CmdArgs.push_back("-export-dynamic");
5286
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005287 if (Args.hasArg(options::OPT_s))
5288 CmdArgs.push_back("-s");
5289
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005290 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5291 e = ToolChain.ExtraOpts.end();
5292 i != e; ++i)
5293 CmdArgs.push_back(i->c_str());
5294
5295 if (!Args.hasArg(options::OPT_static)) {
5296 CmdArgs.push_back("--eh-frame-hdr");
5297 }
5298
5299 CmdArgs.push_back("-m");
5300 if (ToolChain.getArch() == llvm::Triple::x86)
5301 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005302 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005303 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005304 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005305 else if (ToolChain.getArch() == llvm::Triple::ppc)
5306 CmdArgs.push_back("elf32ppclinux");
5307 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5308 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005309 else if (ToolChain.getArch() == llvm::Triple::mips)
5310 CmdArgs.push_back("elf32btsmip");
5311 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5312 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005313 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5314 if (hasMipsN32ABIArg(Args))
5315 CmdArgs.push_back("elf32btsmipn32");
5316 else
5317 CmdArgs.push_back("elf64btsmip");
5318 }
5319 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5320 if (hasMipsN32ABIArg(Args))
5321 CmdArgs.push_back("elf32ltsmipn32");
5322 else
5323 CmdArgs.push_back("elf64ltsmip");
5324 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005325 else
5326 CmdArgs.push_back("elf_x86_64");
5327
5328 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005329 if (ToolChain.getArch() == llvm::Triple::arm
5330 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005331 CmdArgs.push_back("-Bstatic");
5332 else
5333 CmdArgs.push_back("-static");
5334 } else if (Args.hasArg(options::OPT_shared)) {
5335 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005336 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005337 CmdArgs.push_back("-Bsymbolic");
5338 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005339 }
5340
5341 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005342 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005343 (!Args.hasArg(options::OPT_static) &&
5344 !Args.hasArg(options::OPT_shared))) {
5345 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005346 if (isAndroid)
5347 CmdArgs.push_back("/system/bin/linker");
5348 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005349 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005350 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005351 ToolChain.getArch() == llvm::Triple::thumb) {
5352 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5353 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5354 else
5355 CmdArgs.push_back("/lib/ld-linux.so.3");
5356 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005357 else if (ToolChain.getArch() == llvm::Triple::mips ||
5358 ToolChain.getArch() == llvm::Triple::mipsel)
5359 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005360 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005361 ToolChain.getArch() == llvm::Triple::mips64el) {
5362 if (hasMipsN32ABIArg(Args))
5363 CmdArgs.push_back("/lib32/ld.so.1");
5364 else
5365 CmdArgs.push_back("/lib64/ld.so.1");
5366 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005367 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005368 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005369 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005370 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005371 else
5372 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5373 }
5374
5375 CmdArgs.push_back("-o");
5376 CmdArgs.push_back(Output.getFilename());
5377
Rafael Espindola81937ec2010-12-01 01:52:43 +00005378 if (!Args.hasArg(options::OPT_nostdlib) &&
5379 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005380 if (!isAndroid) {
5381 const char *crt1 = NULL;
5382 if (!Args.hasArg(options::OPT_shared)){
5383 if (Args.hasArg(options::OPT_pie))
5384 crt1 = "Scrt1.o";
5385 else
5386 crt1 = "crt1.o";
5387 }
5388 if (crt1)
5389 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005390
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005391 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5392 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005393
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005394 const char *crtbegin;
5395 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005396 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005397 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005398 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005399 else if (Args.hasArg(options::OPT_pie))
5400 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005401 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005402 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005404
5405 // Add crtfastmath.o if available and fast math is enabled.
5406 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005407 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005408
5409 Args.AddAllArgs(CmdArgs, options::OPT_L);
5410
5411 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5412
Roman Divackyee8188a2011-03-01 17:53:14 +00005413 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5414 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005415 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005416
Rafael Espindola9446d762012-04-09 23:53:34 +00005417 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5418 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5419 // forward.
5420 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5421 CmdArgs.push_back("-plugin");
5422 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5423 CmdArgs.push_back(Args.MakeArgString(Plugin));
5424 }
5425
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005426 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5427 CmdArgs.push_back("--no-demangle");
5428
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005429 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5430
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005431 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005432
Eric Christopher04997782012-11-29 18:51:05 +00005433 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005434 if (Sanitize.needsUbsanRt())
5435 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Eric Christopher04997782012-11-29 18:51:05 +00005436 if (Sanitize.needsAsanRt())
5437 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5438 if (Sanitize.needsTsanRt())
5439 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005440
Chandler Carruth94a32012012-05-14 18:31:18 +00005441 if (D.CCCIsCXX &&
5442 !Args.hasArg(options::OPT_nostdlib) &&
5443 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005444 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5445 !Args.hasArg(options::OPT_static);
5446 if (OnlyLibstdcxxStatic)
5447 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005448 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005449 if (OnlyLibstdcxxStatic)
5450 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005451 CmdArgs.push_back("-lm");
5452 }
5453
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005454 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005455 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5456 if (Args.hasArg(options::OPT_static))
5457 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005458
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005459 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005460
Chandler Carruth94a32012012-05-14 18:31:18 +00005461 if (Args.hasArg(options::OPT_pthread) ||
5462 Args.hasArg(options::OPT_pthreads))
5463 CmdArgs.push_back("-lpthread");
5464
5465 CmdArgs.push_back("-lc");
5466
5467 if (Args.hasArg(options::OPT_static))
5468 CmdArgs.push_back("--end-group");
5469 else
5470 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5471 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005472
Rafael Espindola81937ec2010-12-01 01:52:43 +00005473 if (!Args.hasArg(options::OPT_nostartfiles)) {
5474 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005475 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005476 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005477 else if (Args.hasArg(options::OPT_pie))
5478 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005479 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005480 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005481
Rafael Espindola81937ec2010-12-01 01:52:43 +00005482 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005483 if (!isAndroid)
5484 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005485 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005486 }
5487
Bill Wendling08760582011-06-27 19:15:03 +00005488 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005489
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005490 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5491}
Rafael Espindola92b00932010-08-10 00:25:48 +00005492
Chris Lattner3e2ee142010-07-07 16:01:42 +00005493void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005494 const InputInfo &Output,
5495 const InputInfoList &Inputs,
5496 const ArgList &Args,
5497 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005498 ArgStringList CmdArgs;
5499
5500 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5501 options::OPT_Xassembler);
5502
5503 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005504 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005505
5506 for (InputInfoList::const_iterator
5507 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5508 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005509 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005510 }
5511
5512 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005513 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005514 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005515}
5516
5517void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005518 const InputInfo &Output,
5519 const InputInfoList &Inputs,
5520 const ArgList &Args,
5521 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005522 const Driver &D = getToolChain().getDriver();
5523 ArgStringList CmdArgs;
5524
Daniel Dunbarb440f562010-08-02 02:38:21 +00005525 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005526 CmdArgs.push_back("-o");
5527 CmdArgs.push_back(Output.getFilename());
5528 } else {
5529 assert(Output.isNothing() && "Invalid output.");
5530 }
5531
5532 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005533 !Args.hasArg(options::OPT_nostartfiles)) {
5534 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5535 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5537 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5538 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005539
5540 Args.AddAllArgs(CmdArgs, options::OPT_L);
5541 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5542 Args.AddAllArgs(CmdArgs, options::OPT_e);
5543
Daniel Dunbar54423b22010-09-17 00:24:54 +00005544 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005545
Eli Friedman83de5132011-12-08 23:54:21 +00005546 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5547
Chris Lattner3e2ee142010-07-07 16:01:42 +00005548 if (!Args.hasArg(options::OPT_nostdlib) &&
5549 !Args.hasArg(options::OPT_nodefaultlibs)) {
5550 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005551 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005552 CmdArgs.push_back("-lm");
5553 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005554 }
5555
5556 if (!Args.hasArg(options::OPT_nostdlib) &&
5557 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005558 if (Args.hasArg(options::OPT_pthread))
5559 CmdArgs.push_back("-lpthread");
5560 CmdArgs.push_back("-lc");
5561 CmdArgs.push_back("-lCompilerRT-Generic");
5562 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5563 CmdArgs.push_back(
5564 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005565 }
5566
Eli Friedman83de5132011-12-08 23:54:21 +00005567 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005568 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005569}
5570
Daniel Dunbarcc912342009-05-02 18:28:39 +00005571/// DragonFly Tools
5572
5573// For now, DragonFly Assemble does just about the same as for
5574// FreeBSD, but this may change soon.
5575void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005576 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005577 const InputInfoList &Inputs,
5578 const ArgList &Args,
5579 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005580 ArgStringList CmdArgs;
5581
5582 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5583 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005584 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00005585 CmdArgs.push_back("--32");
5586
5587 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5588 options::OPT_Xassembler);
5589
5590 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005591 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005592
5593 for (InputInfoList::const_iterator
5594 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5595 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005596 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005597 }
5598
5599 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005600 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005601 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005602}
5603
5604void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005605 const InputInfo &Output,
5606 const InputInfoList &Inputs,
5607 const ArgList &Args,
5608 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005609 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005610 ArgStringList CmdArgs;
5611
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005612 if (!D.SysRoot.empty())
5613 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5614
Daniel Dunbarcc912342009-05-02 18:28:39 +00005615 if (Args.hasArg(options::OPT_static)) {
5616 CmdArgs.push_back("-Bstatic");
5617 } else {
5618 if (Args.hasArg(options::OPT_shared))
5619 CmdArgs.push_back("-Bshareable");
5620 else {
5621 CmdArgs.push_back("-dynamic-linker");
5622 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5623 }
5624 }
5625
5626 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5627 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005628 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005629 CmdArgs.push_back("-m");
5630 CmdArgs.push_back("elf_i386");
5631 }
5632
Daniel Dunbarb440f562010-08-02 02:38:21 +00005633 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005634 CmdArgs.push_back("-o");
5635 CmdArgs.push_back(Output.getFilename());
5636 } else {
5637 assert(Output.isNothing() && "Invalid output.");
5638 }
5639
5640 if (!Args.hasArg(options::OPT_nostdlib) &&
5641 !Args.hasArg(options::OPT_nostartfiles)) {
5642 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005643 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005644 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005645 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005646 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005647 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005648 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005649 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005650 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005651 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005652 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005653 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005654 }
5655 }
5656
5657 Args.AddAllArgs(CmdArgs, options::OPT_L);
5658 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5659 Args.AddAllArgs(CmdArgs, options::OPT_e);
5660
Daniel Dunbar54423b22010-09-17 00:24:54 +00005661 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00005662
5663 if (!Args.hasArg(options::OPT_nostdlib) &&
5664 !Args.hasArg(options::OPT_nodefaultlibs)) {
5665 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5666 // rpaths
5667 CmdArgs.push_back("-L/usr/lib/gcc41");
5668
5669 if (!Args.hasArg(options::OPT_static)) {
5670 CmdArgs.push_back("-rpath");
5671 CmdArgs.push_back("/usr/lib/gcc41");
5672
5673 CmdArgs.push_back("-rpath-link");
5674 CmdArgs.push_back("/usr/lib/gcc41");
5675
5676 CmdArgs.push_back("-rpath");
5677 CmdArgs.push_back("/usr/lib");
5678
5679 CmdArgs.push_back("-rpath-link");
5680 CmdArgs.push_back("/usr/lib");
5681 }
5682
Rafael Espindola38360b32010-07-20 12:59:03 +00005683 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005684 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00005685 CmdArgs.push_back("-lm");
5686 }
5687
Daniel Dunbarcc912342009-05-02 18:28:39 +00005688 if (Args.hasArg(options::OPT_shared)) {
5689 CmdArgs.push_back("-lgcc_pic");
5690 } else {
5691 CmdArgs.push_back("-lgcc");
5692 }
5693
5694
5695 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00005696 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00005697
5698 if (!Args.hasArg(options::OPT_nolibc)) {
5699 CmdArgs.push_back("-lc");
5700 }
5701
5702 if (Args.hasArg(options::OPT_shared)) {
5703 CmdArgs.push_back("-lgcc_pic");
5704 } else {
5705 CmdArgs.push_back("-lgcc");
5706 }
5707 }
5708
5709 if (!Args.hasArg(options::OPT_nostdlib) &&
5710 !Args.hasArg(options::OPT_nostartfiles)) {
5711 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005712 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005713 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005714 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005715 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005716 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005717 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005718 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005719 }
5720
Bill Wendling08760582011-06-27 19:15:03 +00005721 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005722
Daniel Dunbarcc912342009-05-02 18:28:39 +00005723 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005724 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005725 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005726}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005727
5728void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
5729 const InputInfo &Output,
5730 const InputInfoList &Inputs,
5731 const ArgList &Args,
5732 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005733 ArgStringList CmdArgs;
5734
5735 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00005736 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
5737 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005738 } else {
5739 assert(Output.isNothing() && "Invalid output.");
5740 }
5741
5742 if (!Args.hasArg(options::OPT_nostdlib) &&
5743 !Args.hasArg(options::OPT_nostartfiles)) {
5744 CmdArgs.push_back("-defaultlib:libcmt");
5745 }
5746
5747 CmdArgs.push_back("-nologo");
5748
Michael J. Spencere2f49362012-06-18 16:56:04 +00005749 Args.AddAllArgValues(CmdArgs, options::OPT_l);
5750
5751 // Add filenames immediately.
5752 for (InputInfoList::const_iterator
5753 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5754 if (it->isFilename())
5755 CmdArgs.push_back(it->getFilename());
5756 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005757
5758 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00005759 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005760 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5761}