blob: eb79c2fb88ba0d7c4b329928f5b0ceeef5a1cacf [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")
Silviu Baranga157f7c62012-09-13 15:06:00 +0000474 .Cases("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" &&
613 CPU != "cortex-a15")
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
1459 const Arg *AsanArg, *TsanArg, *UbsanArg;
Richard Smith52be6192012-11-05 22:04:41 +00001460 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
1461 unsigned Add = 0, Remove = 0;
Richard Smithaa716572012-11-06 01:12:02 +00001462 const char *DeprecatedReplacement = 0;
1463 if ((*I)->getOption().matches(options::OPT_faddress_sanitizer)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001464 Add = Address;
Richard Smithaa716572012-11-06 01:12:02 +00001465 DeprecatedReplacement = "-fsanitize=address";
1466 } else if ((*I)->getOption().matches(options::OPT_fno_address_sanitizer)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001467 Remove = Address;
Richard Smithaa716572012-11-06 01:12:02 +00001468 DeprecatedReplacement = "-fno-sanitize=address";
1469 } else if ((*I)->getOption().matches(options::OPT_fthread_sanitizer)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001470 Add = Thread;
Richard Smithaa716572012-11-06 01:12:02 +00001471 DeprecatedReplacement = "-fsanitize=thread";
1472 } else if ((*I)->getOption().matches(options::OPT_fno_thread_sanitizer)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001473 Remove = Thread;
Richard Smithaa716572012-11-06 01:12:02 +00001474 DeprecatedReplacement = "-fno-sanitize=thread";
1475 } else if ((*I)->getOption().matches(options::OPT_fcatch_undefined_behavior)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001476 Add = Undefined;
Richard Smithaa716572012-11-06 01:12:02 +00001477 DeprecatedReplacement = "-fsanitize=undefined";
1478 } else if ((*I)->getOption().matches(options::OPT_fsanitize_EQ)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001479 Add = parse(D, *I);
Richard Smithaa716572012-11-06 01:12:02 +00001480 } else if ((*I)->getOption().matches(options::OPT_fno_sanitize_EQ)) {
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001481 Remove = parse(D, *I);
Joey Goulyebc59d52012-11-23 10:39:49 +00001482 } else if ((*I)->getOption().matches(options::OPT_fbounds_checking) ||
1483 (*I)->getOption().matches(options::OPT_fbounds_checking_EQ)) {
1484 Add = Bounds;
1485 DeprecatedReplacement = "-fsanitize=bounds";
Richard Smithaa716572012-11-06 01:12:02 +00001486 } else {
Richard Smith52be6192012-11-05 22:04:41 +00001487 continue;
Richard Smithaa716572012-11-06 01:12:02 +00001488 }
Richard Smith52be6192012-11-05 22:04:41 +00001489
1490 (*I)->claim();
1491
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001492 Kind |= Add;
1493 Kind &= ~Remove;
Richard Smith52be6192012-11-05 22:04:41 +00001494
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001495 if (Add & NeedsAsanRt) AsanArg = *I;
1496 if (Add & NeedsTsanRt) TsanArg = *I;
1497 if (Add & NeedsUbsanRt) UbsanArg = *I;
Richard Smithaa716572012-11-06 01:12:02 +00001498
1499 // If this is a deprecated synonym, produce a warning directing users
1500 // towards the new spelling.
1501 if (DeprecatedReplacement)
1502 D.Diag(diag::warn_drv_deprecated_arg)
1503 << (*I)->getAsString(Args) << DeprecatedReplacement;
Richard Smith52be6192012-11-05 22:04:41 +00001504 }
1505
1506 // Only one runtime library can be used at once.
1507 // FIXME: Allow Ubsan to be combined with the other two.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001508 bool NeedsAsan = needsAsanRt();
1509 bool NeedsTsan = needsTsanRt();
1510 bool NeedsUbsan = needsUbsanRt();
Richard Smith52be6192012-11-05 22:04:41 +00001511 if (NeedsAsan + NeedsTsan + NeedsUbsan > 1)
1512 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smithaa716572012-11-06 01:12:02 +00001513 << describeSanitizeArg(Args, NeedsAsan ? AsanArg : TsanArg,
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001514 NeedsAsan ? NeedsAsanRt : NeedsTsanRt)
Richard Smithaa716572012-11-06 01:12:02 +00001515 << describeSanitizeArg(Args, NeedsUbsan ? UbsanArg : TsanArg,
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001516 NeedsUbsan ? NeedsUbsanRt : NeedsTsanRt);
Richard Smith52be6192012-11-05 22:04:41 +00001517}
1518
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001519/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1520/// This needs to be called before we add the C run-time (malloc, etc).
1521static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001522 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001523 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001524 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001525 if (!Args.hasArg(options::OPT_pie))
1526 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001527 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001528
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001529 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1530 llvm::sys::path::append(LibAsan, "lib", "linux",
1531 (Twine("libclang_rt.asan-") +
1532 TC.getArchName() + "-android.so"));
1533 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001534 } else {
1535 if (!Args.hasArg(options::OPT_shared)) {
1536 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1537 // resource directory.
1538 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1539 llvm::sys::path::append(LibAsan, "lib", "linux",
1540 (Twine("libclang_rt.asan-") +
1541 TC.getArchName() + ".a"));
1542 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1543 CmdArgs.push_back("-lpthread");
1544 CmdArgs.push_back("-ldl");
1545 CmdArgs.push_back("-export-dynamic");
1546 }
1547 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001548}
1549
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001550/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1551/// This needs to be called before we add the C run-time (malloc, etc).
1552static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1553 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001554 if (!Args.hasArg(options::OPT_shared)) {
1555 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1556 // resource directory.
1557 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1558 llvm::sys::path::append(LibTsan, "lib", "linux",
1559 (Twine("libclang_rt.tsan-") +
1560 TC.getArchName() + ".a"));
1561 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1562 CmdArgs.push_back("-lpthread");
1563 CmdArgs.push_back("-ldl");
1564 CmdArgs.push_back("-export-dynamic");
1565 }
1566}
1567
Richard Smithe30752c2012-10-09 19:52:38 +00001568/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1569/// (Linux).
1570static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1571 ArgStringList &CmdArgs) {
Richard Smithe30752c2012-10-09 19:52:38 +00001572 if (!Args.hasArg(options::OPT_shared)) {
1573 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1574 // resource directory.
1575 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1576 llvm::sys::path::append(LibUbsan, "lib", "linux",
1577 (Twine("libclang_rt.ubsan-") +
1578 TC.getArchName() + ".a"));
1579 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
Richard Smith437abed2012-11-02 20:32:19 +00001580 CmdArgs.push_back("-lpthread");
Richard Smithe30752c2012-10-09 19:52:38 +00001581 }
1582}
1583
Rafael Espindola224dd632011-12-14 21:02:23 +00001584static bool shouldUseFramePointer(const ArgList &Args,
1585 const llvm::Triple &Triple) {
1586 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1587 options::OPT_fomit_frame_pointer))
1588 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1589
Rafael Espindola00b29182011-12-14 21:50:24 +00001590 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001591 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1592 Triple.getArch() == llvm::Triple::x86) &&
1593 Triple.getOS() == llvm::Triple::Linux) {
1594 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1595 if (!A->getOption().matches(options::OPT_O0))
1596 return false;
1597 }
1598
1599 return true;
1600}
1601
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001602void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001603 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001604 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001605 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001606 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001607 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1608 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001609 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001610 ArgStringList CmdArgs;
1611
Daniel Dunbare521a892009-03-31 20:53:55 +00001612 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1613
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001614 // Invoke ourselves in -cc1 mode.
1615 //
1616 // FIXME: Implement custom jobs for internal actions.
1617 CmdArgs.push_back("-cc1");
1618
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001619 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001620 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001621 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001622 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001623
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001624 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001625 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001626
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001627 if (isa<AnalyzeJobAction>(JA)) {
1628 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1629 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001630 } else if (isa<MigrateJobAction>(JA)) {
1631 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001632 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001633 if (Output.getType() == types::TY_Dependencies)
1634 CmdArgs.push_back("-Eonly");
1635 else
1636 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001637 } else if (isa<AssembleJobAction>(JA)) {
1638 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001639
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001640 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001641 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001642
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001643 // When using an integrated assembler, translate -Wa, and -Xassembler
1644 // options.
1645 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1646 options::OPT_Xassembler),
1647 ie = Args.filtered_end(); it != ie; ++it) {
1648 const Arg *A = *it;
1649 A->claim();
1650
1651 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001652 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001653
1654 if (Value == "-force_cpusubtype_ALL") {
1655 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001656 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001657 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001658 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001659 CmdArgs.push_back("-mllvm");
1660 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001661 } else if (Value == "--noexecstack") {
1662 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001663 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001664 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001665 << A->getOption().getName() << Value;
1666 }
1667 }
1668 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001669
1670 // Also ignore explicit -force_cpusubtype_ALL option.
1671 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001672 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001673 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001674 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001675
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001676 if (JA.getType() == types::TY_Nothing)
1677 CmdArgs.push_back("-fsyntax-only");
1678 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001679 CmdArgs.push_back("-emit-pch");
1680 else
1681 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001682 } else {
1683 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001684
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001685 if (JA.getType() == types::TY_Nothing) {
1686 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001687 } else if (JA.getType() == types::TY_LLVM_IR ||
1688 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001689 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001690 } else if (JA.getType() == types::TY_LLVM_BC ||
1691 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001692 CmdArgs.push_back("-emit-llvm-bc");
1693 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001694 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001695 } else if (JA.getType() == types::TY_AST) {
1696 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001697 } else if (JA.getType() == types::TY_RewrittenObjC) {
1698 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001699 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001700 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1701 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001702 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001703 } else {
1704 assert(JA.getType() == types::TY_PP_Asm &&
1705 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001706 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001707 }
1708
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001709 // The make clang go fast button.
1710 CmdArgs.push_back("-disable-free");
1711
John McCallbb79b5f2010-02-13 03:50:24 +00001712 // Disable the verification pass in -asserts builds.
1713#ifdef NDEBUG
1714 CmdArgs.push_back("-disable-llvm-verifier");
1715#endif
1716
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001717 // Set the main file name, so that debug info works even with
1718 // -save-temps.
1719 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001720 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001721
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001722 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001723 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001724 if (Args.hasArg(options::OPT_static))
1725 CmdArgs.push_back("-static-define");
1726
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001727 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001728 // Enable region store model by default.
1729 CmdArgs.push_back("-analyzer-store=region");
1730
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001731 // Treat blocks as analysis entry points.
1732 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1733
Ted Kremenek49c79792011-03-24 00:28:47 +00001734 CmdArgs.push_back("-analyzer-eagerly-assume");
1735
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001736 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001737 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001738 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001739
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001740 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1741 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001742
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001743 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001744 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001745
1746 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001747
1748 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001749 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1750 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1751 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1752 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1753 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1754 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001755 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001756
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001757 // Set the output format. The default is plist, for (lame) historical
1758 // reasons.
1759 CmdArgs.push_back("-analyzer-output");
1760 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001761 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001762 else
1763 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001764
Ted Kremenekfe449a22010-03-22 22:32:05 +00001765 // Disable the presentation of standard compiler warnings when
1766 // using --analyze. We only want to show static analyzer diagnostics
1767 // or frontend errors.
1768 CmdArgs.push_back("-w");
1769
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001770 // Add -Xanalyzer arguments when running as analyzer.
1771 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001772 }
1773
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001774 CheckCodeGenerationOptions(D, Args);
1775
Chandler Carruth76a943b2012-11-19 03:52:03 +00001776 // For the PIC and PIE flag options, this logic is different from the legacy
1777 // logic in very old versions of GCC, as that logic was just a bug no one had
1778 // ever fixed. This logic is both more rational and consistent with GCC's new
1779 // logic now that the bugs are fixed. The last argument relating to either
1780 // PIC or PIE wins, and no other argument is used. If the last argument is
1781 // any flavor of the '-fno-...' arguments, both PIC and PIE are disabled. Any
1782 // PIE option implicitly enables PIC at the same level.
1783 bool PIE = false;
1784 bool PIC = getToolChain().isPICDefault();
1785 bool IsPICLevelTwo = PIC;
1786 if (Arg *A = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1787 options::OPT_fpic, options::OPT_fno_pic,
1788 options::OPT_fPIE, options::OPT_fno_PIE,
1789 options::OPT_fpie, options::OPT_fno_pie)) {
1790 Option O = A->getOption();
1791 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1792 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1793 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1794 PIC = PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1795 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
1796 O.matches(options::OPT_fPIC);
1797 } else {
1798 PIE = PIC = false;
1799 }
Benjamin Kramer76db2902012-11-13 15:32:35 +00001800 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001801 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
1802 // is forced, then neither PIC nor PIE flags will have no effect.
1803 if (getToolChain().isPICDefaultForced()) {
1804 PIE = false;
1805 PIC = getToolChain().isPICDefault();
1806 IsPICLevelTwo = PIC;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001807 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00001808
1809 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
1810 // specified while enabling PIC enabled level 1 PIC, just force it back to
1811 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
1812 // informal testing).
1813 if (PIC && getToolChain().getTriple().isOSDarwin())
1814 IsPICLevelTwo |= getToolChain().isPICDefault();
1815
Chandler Carruthc0c04552012-04-08 16:40:35 +00001816 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1817 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001818 llvm::Triple Triple(TripleStr);
1819 if ((Args.hasArg(options::OPT_mkernel) ||
1820 Args.hasArg(options::OPT_fapple_kext)) &&
1821 (Triple.getOS() != llvm::Triple::IOS ||
1822 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001823 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001824 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00001825 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00001826
Chandler Carruth76a943b2012-11-19 03:52:03 +00001827 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1828 // This is a very special mode. It trumps the other modes, almost no one
1829 // uses it, and it isn't even valid on any OS but Darwin.
1830 if (!getToolChain().getTriple().isOSDarwin())
1831 D.Diag(diag::err_drv_unsupported_opt_for_target)
1832 << A->getSpelling() << getToolChain().getTriple().str();
1833
1834 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
1835
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001836 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00001837 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001838
Chandler Carruth76a943b2012-11-19 03:52:03 +00001839 // Only a forced PIC mode can cause the actual compile to have PIC defines
1840 // etc., no flags are sufficient. This behavior was selected to closely
1841 // match that of llvm-gcc and Apple GCC before that.
1842 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
1843 CmdArgs.push_back("-pic-level");
1844 CmdArgs.push_back("2");
1845 }
1846 } else {
1847 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
1848 // handled in Clang's IRGen by the -pie-level flag.
1849 CmdArgs.push_back("-mrelocation-model");
1850 CmdArgs.push_back(PIC ? "pic" : "static");
1851
1852 if (PIC) {
1853 CmdArgs.push_back("-pic-level");
1854 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1855 if (PIE) {
1856 CmdArgs.push_back("-pie-level");
1857 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
1858 }
1859 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001860 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001861
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001862 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1863 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001864 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001865
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001866 // LLVM Code Generator Options.
1867
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001868 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1869 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00001870 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001871 }
1872
Roman Divacky65b88cd2011-03-01 17:40:53 +00001873 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1874 CmdArgs.push_back("-mrtd");
1875
Rafael Espindola224dd632011-12-14 21:02:23 +00001876 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001877 CmdArgs.push_back("-mdisable-fp-elim");
1878 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1879 options::OPT_fno_zero_initialized_in_bss))
1880 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001881 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1882 options::OPT_fno_strict_aliasing,
1883 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001884 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001885 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1886 false))
1887 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001888 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1889 options::OPT_fno_optimize_sibling_calls))
1890 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001891
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001892 // Handle various floating point optimization flags, mapping them to the
1893 // appropriate LLVM code generation flags. The pattern for all of these is to
1894 // default off the codegen optimizations, and if any flag enables them and no
1895 // flag disables them after the flag enabling them, enable the codegen
1896 // optimization. This is complicated by several "umbrella" flags.
1897 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001898 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001899 options::OPT_ffinite_math_only,
1900 options::OPT_fno_finite_math_only,
1901 options::OPT_fhonor_infinities,
1902 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001903 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1904 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001905 A->getOption().getID() != options::OPT_fhonor_infinities)
1906 CmdArgs.push_back("-menable-no-infs");
1907 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001908 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001909 options::OPT_ffinite_math_only,
1910 options::OPT_fno_finite_math_only,
1911 options::OPT_fhonor_nans,
1912 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001913 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1914 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001915 A->getOption().getID() != options::OPT_fhonor_nans)
1916 CmdArgs.push_back("-menable-no-nans");
1917
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001918 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1919 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001920 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001921 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001922 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001923 options::OPT_fno_math_errno))
1924 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1925 if (MathErrno)
1926 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001927
1928 // There are several flags which require disabling very specific
1929 // optimizations. Any of these being disabled forces us to turn off the
1930 // entire set of LLVM optimizations, so collect them through all the flag
1931 // madness.
1932 bool AssociativeMath = false;
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_fassociative_math,
1938 options::OPT_fno_associative_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_fno_associative_math)
1942 AssociativeMath = true;
1943 bool ReciprocalMath = false;
1944 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001945 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001946 options::OPT_funsafe_math_optimizations,
1947 options::OPT_fno_unsafe_math_optimizations,
1948 options::OPT_freciprocal_math,
1949 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001950 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1951 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001952 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1953 ReciprocalMath = true;
1954 bool SignedZeros = true;
1955 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001956 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001957 options::OPT_funsafe_math_optimizations,
1958 options::OPT_fno_unsafe_math_optimizations,
1959 options::OPT_fsigned_zeros,
1960 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001961 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1962 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001963 A->getOption().getID() != options::OPT_fsigned_zeros)
1964 SignedZeros = false;
1965 bool TrappingMath = true;
1966 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001967 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001968 options::OPT_funsafe_math_optimizations,
1969 options::OPT_fno_unsafe_math_optimizations,
1970 options::OPT_ftrapping_math,
1971 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001972 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1973 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001974 A->getOption().getID() != options::OPT_ftrapping_math)
1975 TrappingMath = false;
1976 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1977 !TrappingMath)
1978 CmdArgs.push_back("-menable-unsafe-fp-math");
1979
Lang Hamesaa53b932012-07-06 00:59:19 +00001980
1981 // Validate and pass through -fp-contract option.
1982 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001983 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001984 options::OPT_ffp_contract)) {
1985 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001986 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00001987 if (Val == "fast" || Val == "on" || Val == "off") {
1988 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1989 } else {
1990 D.Diag(diag::err_drv_unsupported_option_argument)
1991 << A->getOption().getName() << Val;
1992 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001993 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001994 // If fast-math is set then set the fp-contract mode to fast.
1995 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1996 }
1997 }
1998
Bob Wilson6a039162012-07-19 03:52:53 +00001999 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2000 // and if we find them, tell the frontend to provide the appropriate
2001 // preprocessor macros. This is distinct from enabling any optimizations as
2002 // these options induce language changes which must survive serialization
2003 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002004 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2005 if (A->getOption().matches(options::OPT_ffast_math))
2006 CmdArgs.push_back("-ffast-math");
2007 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2008 if (A->getOption().matches(options::OPT_ffinite_math_only))
2009 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002010
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002011 // Decide whether to use verbose asm. Verbose assembly is the default on
2012 // toolchains which have the integrated assembler on by default.
2013 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2014 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002015 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002016 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002017 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002018
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002019 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2020 CmdArgs.push_back("-mdebug-pass");
2021 CmdArgs.push_back("Structure");
2022 }
2023 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2024 CmdArgs.push_back("-mdebug-pass");
2025 CmdArgs.push_back("Arguments");
2026 }
2027
John McCall8517abc2010-02-19 02:45:38 +00002028 // Enable -mconstructor-aliases except on darwin, where we have to
2029 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002030 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002031 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002032
John McCall7ef5cb32011-03-18 02:56:14 +00002033 // Darwin's kernel doesn't support guard variables; just die if we
2034 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002035 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002036 CmdArgs.push_back("-fforbid-guard-variables");
2037
Douglas Gregordbe39272011-02-01 15:15:22 +00002038 if (Args.hasArg(options::OPT_mms_bitfields)) {
2039 CmdArgs.push_back("-mms-bitfields");
2040 }
John McCall8517abc2010-02-19 02:45:38 +00002041
Daniel Dunbar306945d2009-09-16 06:17:29 +00002042 // This is a coarse approximation of what llvm-gcc actually does, both
2043 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2044 // complicated ways.
2045 bool AsynchronousUnwindTables =
2046 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2047 options::OPT_fno_asynchronous_unwind_tables,
2048 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002049 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002050 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2051 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002052 CmdArgs.push_back("-munwind-tables");
2053
Chandler Carruth05fb5852012-11-21 23:40:23 +00002054 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002055
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002056 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2057 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002058 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002059 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002060
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002061 // FIXME: Handle -mtune=.
2062 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002063
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002064 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002065 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002066 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002067 }
2068
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002069 // Add target specific cpu and features flags.
2070 switch(getToolChain().getTriple().getArch()) {
2071 default:
2072 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002073
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002074 case llvm::Triple::arm:
2075 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002076 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002077 break;
2078
Eric Christopher0b26a612010-03-02 02:41:08 +00002079 case llvm::Triple::mips:
2080 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002081 case llvm::Triple::mips64:
2082 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002083 AddMIPSTargetArgs(Args, CmdArgs);
2084 break;
2085
Hal Finkel8eb59282012-06-11 22:35:19 +00002086 case llvm::Triple::ppc:
2087 case llvm::Triple::ppc64:
2088 AddPPCTargetArgs(Args, CmdArgs);
2089 break;
2090
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002091 case llvm::Triple::sparc:
2092 AddSparcTargetArgs(Args, CmdArgs);
2093 break;
2094
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002095 case llvm::Triple::x86:
2096 case llvm::Triple::x86_64:
2097 AddX86TargetArgs(Args, CmdArgs);
2098 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002099
2100 case llvm::Triple::hexagon:
2101 AddHexagonTargetArgs(Args, CmdArgs);
2102 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002103 }
2104
Tony Linthicum76329bf2011-12-12 21:14:55 +00002105
2106
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002107 // Pass the linker version in use.
2108 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2109 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002110 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002111 }
2112
Nick Lewycky75033772011-02-02 06:43:03 +00002113 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002114 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002115 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002116 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002117 CmdArgs.push_back("-momit-leaf-frame-pointer");
2118
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002119 // Explicitly error on some things we know we don't support and can't just
2120 // ignore.
2121 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002122 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2123 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002124 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002125 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002126 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002127 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2128 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002129 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002130 << Unsupported->getOption().getName();
2131 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002132 }
2133
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002134 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002135 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002136 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002137 CmdArgs.push_back("-header-include-file");
2138 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2139 D.CCPrintHeadersFilename : "-");
2140 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002141 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002142 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002143
Chad Rosierbe10f982011-08-02 17:58:04 +00002144 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002145 CmdArgs.push_back("-diagnostic-log-file");
2146 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2147 D.CCLogDiagnosticsFilename : "-");
2148 }
2149
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002150 // Use the last option from "-g" group. "-gline-tables-only" is
2151 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002152 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002153 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2154 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2155 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002156 } else if (!A->getOption().matches(options::OPT_g0) &&
2157 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002158 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002159 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002160 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002161
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002162 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2163 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002164 if (Args.hasArg(options::OPT_gcolumn_info))
2165 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002166
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002167 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2168 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2169
Chris Lattner3c77a352010-06-22 00:03:40 +00002170 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2171
Nick Lewycky207bce32011-04-21 23:44:07 +00002172 if (Args.hasArg(options::OPT_ftest_coverage) ||
2173 Args.hasArg(options::OPT_coverage))
2174 CmdArgs.push_back("-femit-coverage-notes");
2175 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2176 Args.hasArg(options::OPT_coverage))
2177 CmdArgs.push_back("-femit-coverage-data");
2178
Nick Lewycky480cb992011-05-04 20:46:58 +00002179 if (C.getArgs().hasArg(options::OPT_c) ||
2180 C.getArgs().hasArg(options::OPT_S)) {
2181 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002182 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002183 SmallString<128> absFilename(Output.getFilename());
2184 llvm::sys::fs::make_absolute(absFilename);
2185 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002186 }
2187 }
2188
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002189 // Pass options for controlling the default header search paths.
2190 if (Args.hasArg(options::OPT_nostdinc)) {
2191 CmdArgs.push_back("-nostdsysteminc");
2192 CmdArgs.push_back("-nobuiltininc");
2193 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002194 if (Args.hasArg(options::OPT_nostdlibinc))
2195 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002196 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2197 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2198 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002199
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002200 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002201 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002202 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002203
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002204 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2205
Ted Kremenekf7639e12012-03-06 20:06:33 +00002206 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002207 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002208 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002209 options::OPT_ccc_arcmt_modify,
2210 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002211 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002212 switch (A->getOption().getID()) {
2213 default:
2214 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002215 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002216 CmdArgs.push_back("-arcmt-check");
2217 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002218 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002219 CmdArgs.push_back("-arcmt-modify");
2220 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002221 case options::OPT_ccc_arcmt_migrate:
2222 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002223 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002224 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002225
2226 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2227 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002228 break;
John McCalld70fb982011-06-15 23:25:17 +00002229 }
2230 }
2231 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002232
Ted Kremenekf7639e12012-03-06 20:06:33 +00002233 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2234 if (ARCMTEnabled) {
2235 D.Diag(diag::err_drv_argument_not_allowed_with)
2236 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2237 }
2238 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002239 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002240
2241 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2242 options::OPT_objcmt_migrate_subscripting)) {
2243 // None specified, means enable them all.
2244 CmdArgs.push_back("-objcmt-migrate-literals");
2245 CmdArgs.push_back("-objcmt-migrate-subscripting");
2246 } else {
2247 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2248 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2249 }
2250 }
2251
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002252 // Add preprocessing options like -I, -D, etc. if we are using the
2253 // preprocessor.
2254 //
2255 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002256 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002257 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002258
Rafael Espindolaa7431922011-07-21 23:40:37 +00002259 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2260 // that "The compiler can only warn and ignore the option if not recognized".
2261 // When building with ccache, it will pass -D options to clang even on
2262 // preprocessed inputs and configure concludes that -fPIC is not supported.
2263 Args.ClaimAllArgs(options::OPT_D);
2264
Daniel Dunbar58f78332009-09-17 06:53:36 +00002265 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002266 // others.
2267 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002268 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002269 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002270 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002271 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002272 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002273 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002274 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002275 }
2276
Daniel Dunbar945577c2009-10-29 02:24:45 +00002277 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002278 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2279 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002280 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002281 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002282
2283 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2284 // (-ansi is equivalent to -std=c89).
2285 //
2286 // If a std is supplied, only add -trigraphs if it follows the
2287 // option.
2288 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2289 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002290 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002291 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002292 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002293 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002294 else
2295 Std->render(Args, CmdArgs);
2296
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002297 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2298 options::OPT_trigraphs))
2299 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002300 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002301 } else {
2302 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002303 //
2304 // FIXME: Clang doesn't correctly handle -std= when the input language
2305 // doesn't match. For the time being just ignore this for C++ inputs;
2306 // eventually we want to do all the standard defaulting here instead of
2307 // splitting it between the driver and clang -cc1.
2308 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002309 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2310 "-std=", /*Joined=*/true);
2311 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2312 CmdArgs.push_back("-std=c++11");
2313
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002314 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002315 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002316
Chandler Carruthb009b142011-04-23 06:30:43 +00002317 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2318 // '-fconst-strings'; this better indicates its actual behavior.
2319 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2320 false)) {
2321 // For perfect compatibility with GCC, we do this even in the presence of
2322 // '-w'. This flag names something other than a warning for GCC.
2323 CmdArgs.push_back("-fconst-strings");
2324 }
2325
Chandler Carruth61fbf622011-04-23 09:27:53 +00002326 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002327 // during C++ compilation, which it is by default. GCC keeps this define even
2328 // in the presence of '-w', match this behavior bug-for-bug.
2329 if (types::isCXX(InputType) &&
2330 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2331 true)) {
2332 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002333 }
2334
Chandler Carruthe0391482010-05-22 02:21:53 +00002335 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2336 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2337 if (Asm->getOption().matches(options::OPT_fasm))
2338 CmdArgs.push_back("-fgnu-keywords");
2339 else
2340 CmdArgs.push_back("-fno-gnu-keywords");
2341 }
2342
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002343 if (ShouldDisableCFI(Args, getToolChain()))
2344 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002345
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002346 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2347 CmdArgs.push_back("-fno-dwarf-directory-asm");
2348
Nick Lewyckyba743b72011-10-21 02:32:14 +00002349 if (const char *pwd = ::getenv("PWD")) {
2350 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2351 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002352 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002353 std::string CompDir = pwd;
2354 CmdArgs.push_back("-fdebug-compilation-dir");
2355 CmdArgs.push_back(Args.MakeArgString(CompDir));
2356 }
2357 }
2358
Richard Smith9a568822011-11-21 19:36:32 +00002359 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2360 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002361 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002362 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002363 }
2364
Richard Smith9a568822011-11-21 19:36:32 +00002365 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2366 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002367 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002368 }
2369
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002370 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2371 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002372 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002373 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002374 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2375 } else
2376 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002377 }
2378
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002379
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002380 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002381 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002382
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002383 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2384 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002385 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002386 }
David Chisnall5778fce2009-08-31 16:41:57 +00002387
Chris Lattnere23003d2010-01-09 21:54:33 +00002388 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2389 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002390 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002391 }
2392
Chris Lattnerb35583d2010-04-07 20:49:23 +00002393 CmdArgs.push_back("-ferror-limit");
2394 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002395 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002396 else
2397 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002398
Chandler Carrutha77a7272010-05-06 04:55:18 +00002399 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2400 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002401 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002402 }
2403
2404 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2405 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002406 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002407 }
2408
Richard Smithf6f003a2011-12-16 19:06:07 +00002409 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2410 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002411 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002412 }
2413
Daniel Dunbar2c978472009-11-04 06:24:47 +00002414 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002415 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002416 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002417 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002418 } else {
2419 // If -fmessage-length=N was not specified, determine whether this is a
2420 // terminal and, if so, implicitly define -fmessage-length appropriately.
2421 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002422 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002423 }
2424
Daniel Dunbare357d562009-12-03 18:42:11 +00002425 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2426 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002427 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002428 }
2429
Douglas Gregor08329632010-06-15 17:05:35 +00002430 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002431
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002432 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2433
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002434 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002435 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2436 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002437 CmdArgs.push_back("-ffreestanding");
2438
Daniel Dunbare357d562009-12-03 18:42:11 +00002439 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002440 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002441 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002442 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002443 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002444 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002445 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002446 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2447 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002448
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002449 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00002450 Sanitize.addArgs(Args, CmdArgs);
2451
Chad Rosier864dfe12012-03-13 23:45:51 +00002452 // Report and error for -faltivec on anything other then PowerPC.
2453 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2454 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2455 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2456 D.Diag(diag::err_drv_argument_only_allowed_with)
2457 << A->getAsString(Args) << "ppc/ppc64";
2458
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002459 if (getToolChain().SupportsProfiling())
2460 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002461
2462 // -flax-vector-conversions is default.
2463 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2464 options::OPT_fno_lax_vector_conversions))
2465 CmdArgs.push_back("-fno-lax-vector-conversions");
2466
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002467 if (Args.getLastArg(options::OPT_fapple_kext))
2468 CmdArgs.push_back("-fapple-kext");
2469
David Blaikie690f21e2012-06-14 18:55:27 +00002470 if (Args.hasFlag(options::OPT_frewrite_includes,
2471 options::OPT_fno_rewrite_includes, false))
2472 CmdArgs.push_back("-frewrite-includes");
2473
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002474 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002475 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002476 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002477 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2478 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002479
2480 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2481 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002482 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002483 }
2484
Bob Wilson14adb362012-02-03 06:27:22 +00002485 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002486
Chandler Carruth6e501032011-03-27 00:04:55 +00002487 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2488 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2489 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2490 options::OPT_fno_wrapv)) {
2491 if (A->getOption().matches(options::OPT_fwrapv))
2492 CmdArgs.push_back("-fwrapv");
2493 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2494 options::OPT_fno_strict_overflow)) {
2495 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2496 CmdArgs.push_back("-fwrapv");
2497 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002498 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002499 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002500
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002501 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2502
Mahesha S6a682be42012-10-27 07:47:56 +00002503
Daniel Dunbar4930e332009-11-17 08:07:36 +00002504 // -stack-protector=0 is default.
2505 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002506 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2507 options::OPT_fstack_protector_all,
2508 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002509 if (A->getOption().matches(options::OPT_fstack_protector))
2510 StackProtectorLevel = 1;
2511 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2512 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002513 } else {
2514 StackProtectorLevel =
2515 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2516 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002517 if (StackProtectorLevel) {
2518 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002519 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002520 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002521
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002522 // --param ssp-buffer-size=
2523 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2524 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002525 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002526 if (Str.startswith("ssp-buffer-size=")) {
2527 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002528 CmdArgs.push_back("-stack-protector-buffer-size");
2529 // FIXME: Verify the argument is a valid integer.
2530 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002531 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002532 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002533 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002534 }
2535
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002536 // Translate -mstackrealign
2537 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2538 false)) {
2539 CmdArgs.push_back("-backend-option");
2540 CmdArgs.push_back("-force-align-stack");
2541 }
2542 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2543 false)) {
2544 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2545 }
2546
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002547 if (Args.hasArg(options::OPT_mstack_alignment)) {
2548 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2549 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002550 }
Chad Rosier60027022012-11-09 17:29:19 +00002551 if (Args.hasArg(options::OPT_mstrict_align)) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002552 CmdArgs.push_back("-backend-option");
2553 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002554 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002555
Daniel Dunbard18049a2009-04-07 21:16:11 +00002556 // Forward -f options with positive and negative forms; we translate
2557 // these by hand.
2558
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002559 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002560 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002561 CmdArgs.push_back("-fapple-kext");
2562 if (!Args.hasArg(options::OPT_fbuiltin))
2563 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002564 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002565 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002566 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002567 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002568 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002569
Nuno Lopes13c88c72009-12-16 16:59:22 +00002570 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2571 options::OPT_fno_assume_sane_operator_new))
2572 CmdArgs.push_back("-fno-assume-sane-operator-new");
2573
Daniel Dunbar4930e332009-11-17 08:07:36 +00002574 // -fblocks=0 is default.
2575 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002576 getToolChain().IsBlocksDefault()) ||
2577 (Args.hasArg(options::OPT_fgnu_runtime) &&
2578 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2579 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002580 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002581
2582 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2583 !getToolChain().hasBlocksRuntime())
2584 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002585 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002586
Douglas Gregor226173a2012-01-18 15:19:58 +00002587 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2588 // users must also pass -fcxx-modules. The latter flag will disappear once the
2589 // modules implementation is solid for C++/Objective-C++ programs as well.
2590 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2591 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2592 options::OPT_fno_cxx_modules,
2593 false);
2594 if (AllowedInCXX || !types::isCXX(InputType))
2595 CmdArgs.push_back("-fmodules");
2596 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002597
John McCalldfea9982010-04-09 19:12:06 +00002598 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002599 if (Args.hasFlag(options::OPT_fno_access_control,
2600 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002601 false))
John McCall3155f572010-04-09 19:03:51 +00002602 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002603
Anders Carlssond470fef2010-11-21 00:09:52 +00002604 // -felide-constructors is the default.
2605 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2606 options::OPT_felide_constructors,
2607 false))
2608 CmdArgs.push_back("-fno-elide-constructors");
2609
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002610 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002611 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002612 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002613 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002614
Richard Smith52be6192012-11-05 22:04:41 +00002615 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002616 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002617 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002618 Args.getLastArg(options::OPT_mkernel,
2619 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002620 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002621 D.Diag(diag::err_drv_argument_not_allowed_with)
2622 << "-fsanitize=vptr" << NoRttiArg;
2623 }
2624 }
2625
Tony Linthicum76329bf2011-12-12 21:14:55 +00002626 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002627 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002628 options::OPT_fno_short_enums,
2629 getToolChain().getTriple().getArch() ==
2630 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002631 CmdArgs.push_back("-fshort-enums");
2632
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002633 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002634 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002635 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002636 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002637
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002638 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002639 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002640 options::OPT_fno_threadsafe_statics))
2641 CmdArgs.push_back("-fno-threadsafe-statics");
2642
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002643 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002644 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2645 options::OPT_fno_use_cxa_atexit,
2646 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002647 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002648 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2649 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002650 CmdArgs.push_back("-fno-use-cxa-atexit");
2651
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002652 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002653 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002654 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2655 CmdArgs.push_back("-fms-extensions");
2656
Chad Rosiered943242012-07-20 21:20:33 +00002657 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002658 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2659 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002660
Francois Pichet1b4f1632011-09-17 04:32:15 +00002661 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002662 if (Args.hasFlag(options::OPT_fms_compatibility,
2663 options::OPT_fno_ms_compatibility,
2664 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2665 Args.hasFlag(options::OPT_fms_extensions,
2666 options::OPT_fno_ms_extensions,
2667 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002668 CmdArgs.push_back("-fms-compatibility");
2669
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002670 // -fmsc-version=1300 is default.
2671 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2672 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2673 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002674 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002675 if (msc_ver.empty())
2676 CmdArgs.push_back("-fmsc-version=1300");
2677 else
2678 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2679 }
2680
2681
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002682 // -fborland-extensions=0 is default.
2683 if (Args.hasFlag(options::OPT_fborland_extensions,
2684 options::OPT_fno_borland_extensions, false))
2685 CmdArgs.push_back("-fborland-extensions");
2686
Francois Pichet02744872011-09-01 16:38:08 +00002687 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2688 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002689 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2690 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002691 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002692 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002693
Chandler Carruthe03aa552010-04-17 20:17:31 +00002694 // -fgnu-keywords default varies depending on language; only pass if
2695 // specified.
2696 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002697 options::OPT_fno_gnu_keywords))
2698 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002699
Rafael Espindola922a6242011-06-02 17:30:53 +00002700 if (Args.hasFlag(options::OPT_fgnu89_inline,
2701 options::OPT_fno_gnu89_inline,
2702 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002703 CmdArgs.push_back("-fgnu89-inline");
2704
Chad Rosier9c76d242012-03-15 22:31:42 +00002705 if (Args.hasArg(options::OPT_fno_inline))
2706 CmdArgs.push_back("-fno-inline");
2707
Chad Rosier64d6be92012-03-06 21:17:19 +00002708 if (Args.hasArg(options::OPT_fno_inline_functions))
2709 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002710
John McCall5fb5df92012-06-20 06:18:46 +00002711 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002712
John McCall5fb5df92012-06-20 06:18:46 +00002713 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2714 // legacy is the default.
2715 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002716 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2717 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002718 objcRuntime.isLegacyDispatchDefaultForArch(
2719 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002720 if (getToolChain().UseObjCMixedDispatch())
2721 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2722 else
2723 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2724 }
2725 }
2726
Nico Weber97bd94b2012-03-09 21:19:44 +00002727 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2728 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002729 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002730 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2731 }
2732
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00002733 // -fencode-extended-block-signature=1 is default.
2734 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
2735 CmdArgs.push_back("-fencode-extended-block-signature");
2736 }
2737
John McCall24fc0de2011-07-06 00:26:06 +00002738 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2739 // NOTE: This logic is duplicated in ToolChains.cpp.
2740 bool ARC = isObjCAutoRefCount(Args);
2741 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002742 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002743
John McCall24fc0de2011-07-06 00:26:06 +00002744 CmdArgs.push_back("-fobjc-arc");
2745
Chandler Carruth491db322011-11-04 07:34:47 +00002746 // FIXME: It seems like this entire block, and several around it should be
2747 // wrapped in isObjC, but for now we just use it here as this is where it
2748 // was being used previously.
2749 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2750 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2751 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2752 else
2753 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2754 }
2755
John McCall24fc0de2011-07-06 00:26:06 +00002756 // Allow the user to enable full exceptions code emission.
2757 // We define off for Objective-CC, on for Objective-C++.
2758 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2759 options::OPT_fno_objc_arc_exceptions,
2760 /*default*/ types::isCXX(InputType)))
2761 CmdArgs.push_back("-fobjc-arc-exceptions");
2762 }
2763
2764 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2765 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002766 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002767 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002768
John McCall24fc0de2011-07-06 00:26:06 +00002769 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2770 // takes precedence.
2771 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2772 if (!GCArg)
2773 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2774 if (GCArg) {
2775 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002776 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002777 << GCArg->getAsString(Args);
2778 } else if (getToolChain().SupportsObjCGC()) {
2779 GCArg->render(Args, CmdArgs);
2780 } else {
2781 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002782 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002783 << GCArg->getAsString(Args);
2784 }
2785 }
2786
John McCallb5f652e2011-06-22 00:53:57 +00002787 // Add exception args.
2788 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002789 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002790
2791 if (getToolChain().UseSjLjExceptions())
2792 CmdArgs.push_back("-fsjlj-exceptions");
2793
2794 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002795 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2796 options::OPT_fno_assume_sane_operator_new))
2797 CmdArgs.push_back("-fno-assume-sane-operator-new");
2798
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002799 // -fconstant-cfstrings is default, and may be subject to argument translation
2800 // on Darwin.
2801 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2802 options::OPT_fno_constant_cfstrings) ||
2803 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2804 options::OPT_mno_constant_cfstrings))
2805 CmdArgs.push_back("-fno-constant-cfstrings");
2806
John Thompsoned4e2952009-11-05 20:14:16 +00002807 // -fshort-wchar default varies depending on platform; only
2808 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002809 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2810 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002811
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002812 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2813 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002814 //
2815 // FIXME: This is gross; that translation should be pulled from the
2816 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002817 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002818 options::OPT_fno_pascal_strings,
2819 false) ||
2820 Args.hasFlag(options::OPT_mpascal_strings,
2821 options::OPT_mno_pascal_strings,
2822 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002823 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002824
Daniel Dunbar096ed292011-10-05 21:04:55 +00002825 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2826 // -fno-pack-struct doesn't apply to -fpack-struct=.
2827 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002828 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002829 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002830 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002831 } else if (Args.hasFlag(options::OPT_fpack_struct,
2832 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002833 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002834 }
2835
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002836 if (Args.hasArg(options::OPT_mkernel) ||
2837 Args.hasArg(options::OPT_fapple_kext)) {
2838 if (!Args.hasArg(options::OPT_fcommon))
2839 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002840 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002841 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002842
Daniel Dunbard18049a2009-04-07 21:16:11 +00002843 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002844 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002845 CmdArgs.push_back("-fno-common");
2846
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002847 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002848 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002849 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002850 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002851 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002852 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2853
Daniel Dunbar6358d682010-10-15 22:30:42 +00002854 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2855 if (!Args.hasFlag(options::OPT_ffor_scope,
2856 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002857 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002858 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2859
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002860 // -fcaret-diagnostics is default.
2861 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2862 options::OPT_fno_caret_diagnostics, true))
2863 CmdArgs.push_back("-fno-caret-diagnostics");
2864
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002865 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002866 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002867 options::OPT_fno_diagnostics_fixit_info))
2868 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002869
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002870 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002871 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002872 options::OPT_fno_diagnostics_show_option))
2873 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002874
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002875 if (const Arg *A =
2876 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2877 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00002878 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002879 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002880
Douglas Gregor643c9222011-05-21 17:07:29 +00002881 if (const Arg *A =
2882 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2883 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00002884 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00002885 }
2886
Chandler Carruthb6766f02011-03-27 01:50:55 +00002887 if (Arg *A = Args.getLastArg(
2888 options::OPT_fdiagnostics_show_note_include_stack,
2889 options::OPT_fno_diagnostics_show_note_include_stack)) {
2890 if (A->getOption().matches(
2891 options::OPT_fdiagnostics_show_note_include_stack))
2892 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2893 else
2894 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2895 }
2896
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002897 // Color diagnostics are the default, unless the terminal doesn't support
2898 // them.
2899 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002900 options::OPT_fno_color_diagnostics,
2901 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002902 CmdArgs.push_back("-fcolor-diagnostics");
2903
Daniel Dunbardb097022009-06-08 21:13:54 +00002904 if (!Args.hasFlag(options::OPT_fshow_source_location,
2905 options::OPT_fno_show_source_location))
2906 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002907
Douglas Gregor643c9222011-05-21 17:07:29 +00002908 if (!Args.hasFlag(options::OPT_fshow_column,
2909 options::OPT_fno_show_column,
2910 true))
2911 CmdArgs.push_back("-fno-show-column");
2912
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002913 if (!Args.hasFlag(options::OPT_fspell_checking,
2914 options::OPT_fno_spell_checking))
2915 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002916
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002917
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002918 // Silently ignore -fasm-blocks for now.
2919 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2920 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002921
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002922 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2923 A->render(Args, CmdArgs);
2924
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002925 // -fdollars-in-identifiers default varies depending on platform and
2926 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002927 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002928 options::OPT_fno_dollars_in_identifiers)) {
2929 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002930 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002931 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002932 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002933 }
2934
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002935 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2936 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002937 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002938 options::OPT_fno_unit_at_a_time)) {
2939 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002940 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002941 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002942
Eli Friedman055c9702011-11-02 01:53:16 +00002943 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2944 options::OPT_fno_apple_pragma_pack, false))
2945 CmdArgs.push_back("-fapple-pragma-pack");
2946
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002947 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002948 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002949 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002950#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002951 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002952 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2953 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2954 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2955 CmdArgs.push_back("-fno-builtin-strcat");
2956 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2957 CmdArgs.push_back("-fno-builtin-strcpy");
2958 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002959#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002960
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002961 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002962 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002963 options::OPT_traditional_cpp)) {
2964 if (isa<PreprocessJobAction>(JA))
2965 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002966 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002967 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002968 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002969
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002970 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002971 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002972
2973 // Handle serialized diagnostics.
2974 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2975 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00002976 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002977 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002978
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002979 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2980 CmdArgs.push_back("-fretain-comments-from-system-headers");
2981
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002982 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2983 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002984 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002985 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2986 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002987 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002988
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002989 // We translate this by hand to the -cc1 argument, since nightly test uses
2990 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00002991 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002992 CmdArgs.push_back("-disable-llvm-optzns");
2993 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002994 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002995 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002996
Daniel Dunbard67a3222009-03-30 06:36:42 +00002997 if (Output.getType() == types::TY_Dependencies) {
2998 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002999 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003000 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003001 CmdArgs.push_back(Output.getFilename());
3002 } else {
3003 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003004 }
3005
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003006 for (InputInfoList::const_iterator
3007 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3008 const InputInfo &II = *it;
3009 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003010 if (Args.hasArg(options::OPT_rewrite_objc))
3011 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3012 else
3013 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003014 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003015 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003016 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003017 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003018 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003019
Chris Lattnere9d7d782009-11-03 19:50:27 +00003020 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3021
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003022 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003023
3024 // Optionally embed the -cc1 level arguments into the debug info, for build
3025 // analysis.
3026 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003027 ArgStringList OriginalArgs;
3028 for (ArgList::const_iterator it = Args.begin(),
3029 ie = Args.end(); it != ie; ++it)
3030 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003031
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003032 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003033 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003034 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003035 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003036 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003037 }
3038 CmdArgs.push_back("-dwarf-debug-flags");
3039 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3040 }
3041
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003043
Roman Divacky178e01602011-02-10 16:52:03 +00003044 if (Arg *A = Args.getLastArg(options::OPT_pg))
3045 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003046 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003047 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003048
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003049 // Claim some arguments which clang supports automatically.
3050
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003051 // -fpch-preprocess is used with gcc to add a special marker in the output to
3052 // include the PCH file. Clang's PTH solution is completely transparent, so we
3053 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003054 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003055
Daniel Dunbar17731772009-03-23 19:03:36 +00003056 // Claim some arguments which clang doesn't support, but we don't
3057 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003058 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3059 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003060
Rafael Espindolad95a8122011-03-01 05:25:27 +00003061 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003062 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003063 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003064}
3065
Jim Grosbach576452b2012-02-10 20:37:10 +00003066void ClangAs::AddARMTargetArgs(const ArgList &Args,
3067 ArgStringList &CmdArgs) const {
3068 const Driver &D = getToolChain().getDriver();
3069 llvm::Triple Triple = getToolChain().getTriple();
3070
3071 // Set the CPU based on -march= and -mcpu=.
3072 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003073 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003074
3075 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003076 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003077 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003078
3079 // Honor -mfpmath=.
3080 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003081 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003082}
3083
John McCall5fb5df92012-06-20 06:18:46 +00003084/// Add options related to the Objective-C runtime/ABI.
3085///
3086/// Returns true if the runtime is non-fragile.
3087ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3088 ArgStringList &cmdArgs,
3089 RewriteKind rewriteKind) const {
3090 // Look for the controlling runtime option.
3091 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3092 options::OPT_fgnu_runtime,
3093 options::OPT_fobjc_runtime_EQ);
3094
3095 // Just forward -fobjc-runtime= to the frontend. This supercedes
3096 // options about fragility.
3097 if (runtimeArg &&
3098 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3099 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003100 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003101 if (runtime.tryParse(value)) {
3102 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3103 << value;
3104 }
3105
3106 runtimeArg->render(args, cmdArgs);
3107 return runtime;
3108 }
3109
3110 // Otherwise, we'll need the ABI "version". Version numbers are
3111 // slightly confusing for historical reasons:
3112 // 1 - Traditional "fragile" ABI
3113 // 2 - Non-fragile ABI, version 1
3114 // 3 - Non-fragile ABI, version 2
3115 unsigned objcABIVersion = 1;
3116 // If -fobjc-abi-version= is present, use that to set the version.
3117 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003118 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003119 if (value == "1")
3120 objcABIVersion = 1;
3121 else if (value == "2")
3122 objcABIVersion = 2;
3123 else if (value == "3")
3124 objcABIVersion = 3;
3125 else
3126 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3127 << value;
3128 } else {
3129 // Otherwise, determine if we are using the non-fragile ABI.
3130 bool nonFragileABIIsDefault =
3131 (rewriteKind == RK_NonFragile ||
3132 (rewriteKind == RK_None &&
3133 getToolChain().IsObjCNonFragileABIDefault()));
3134 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3135 options::OPT_fno_objc_nonfragile_abi,
3136 nonFragileABIIsDefault)) {
3137 // Determine the non-fragile ABI version to use.
3138#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3139 unsigned nonFragileABIVersion = 1;
3140#else
3141 unsigned nonFragileABIVersion = 2;
3142#endif
3143
3144 if (Arg *abiArg = args.getLastArg(
3145 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003146 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003147 if (value == "1")
3148 nonFragileABIVersion = 1;
3149 else if (value == "2")
3150 nonFragileABIVersion = 2;
3151 else
3152 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3153 << value;
3154 }
3155
3156 objcABIVersion = 1 + nonFragileABIVersion;
3157 } else {
3158 objcABIVersion = 1;
3159 }
3160 }
3161
3162 // We don't actually care about the ABI version other than whether
3163 // it's non-fragile.
3164 bool isNonFragile = objcABIVersion != 1;
3165
3166 // If we have no runtime argument, ask the toolchain for its default runtime.
3167 // However, the rewriter only really supports the Mac runtime, so assume that.
3168 ObjCRuntime runtime;
3169 if (!runtimeArg) {
3170 switch (rewriteKind) {
3171 case RK_None:
3172 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3173 break;
3174 case RK_Fragile:
3175 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3176 break;
3177 case RK_NonFragile:
3178 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3179 break;
3180 }
3181
3182 // -fnext-runtime
3183 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3184 // On Darwin, make this use the default behavior for the toolchain.
3185 if (getToolChain().getTriple().isOSDarwin()) {
3186 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3187
3188 // Otherwise, build for a generic macosx port.
3189 } else {
3190 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3191 }
3192
3193 // -fgnu-runtime
3194 } else {
3195 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003196 // Legacy behaviour is to target the gnustep runtime if we are i
3197 // non-fragile mode or the GCC runtime in fragile mode.
3198 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003199 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003200 else
3201 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003202 }
3203
3204 cmdArgs.push_back(args.MakeArgString(
3205 "-fobjc-runtime=" + runtime.getAsString()));
3206 return runtime;
3207}
3208
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003209void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003210 const InputInfo &Output,
3211 const InputInfoList &Inputs,
3212 const ArgList &Args,
3213 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003214 ArgStringList CmdArgs;
3215
3216 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3217 const InputInfo &Input = Inputs[0];
3218
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003219 // Don't warn about "clang -w -c foo.s"
3220 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003221 // and "clang -emit-llvm -c foo.s"
3222 Args.ClaimAllArgs(options::OPT_emit_llvm);
3223 // and "clang -use-gold-plugin -c foo.s"
3224 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003225
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003226 // Invoke ourselves in -cc1as mode.
3227 //
3228 // FIXME: Implement custom jobs for internal actions.
3229 CmdArgs.push_back("-cc1as");
3230
3231 // Add the "effective" target triple.
3232 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003233 std::string TripleStr =
3234 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003235 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3236
3237 // Set the output mode, we currently only expect to be used as a real
3238 // assembler.
3239 CmdArgs.push_back("-filetype");
3240 CmdArgs.push_back("obj");
3241
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003242 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003243 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003244
Jim Grosbach576452b2012-02-10 20:37:10 +00003245 // Add target specific cpu and features flags.
3246 switch(getToolChain().getTriple().getArch()) {
3247 default:
3248 break;
3249
3250 case llvm::Triple::arm:
3251 case llvm::Triple::thumb:
3252 AddARMTargetArgs(Args, CmdArgs);
3253 break;
3254 }
3255
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003256 // Ignore explicit -force_cpusubtype_ALL option.
3257 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003258
Eric Christopherfc3ee562012-01-10 00:38:01 +00003259 // Determine the original source input.
3260 const Action *SourceAction = &JA;
3261 while (SourceAction->getKind() != Action::InputClass) {
3262 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3263 SourceAction = SourceAction->getInputs()[0];
3264 }
3265
3266 // Forward -g, assuming we are dealing with an actual assembly file.
3267 if (SourceAction->getType() == types::TY_Asm ||
3268 SourceAction->getType() == types::TY_PP_Asm) {
3269 Args.ClaimAllArgs(options::OPT_g_Group);
3270 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3271 if (!A->getOption().matches(options::OPT_g0))
3272 CmdArgs.push_back("-g");
3273 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003274
3275 // Optionally embed the -cc1as level arguments into the debug info, for build
3276 // analysis.
3277 if (getToolChain().UseDwarfDebugFlags()) {
3278 ArgStringList OriginalArgs;
3279 for (ArgList::const_iterator it = Args.begin(),
3280 ie = Args.end(); it != ie; ++it)
3281 (*it)->render(Args, OriginalArgs);
3282
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003283 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003284 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3285 Flags += Exec;
3286 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3287 Flags += " ";
3288 Flags += OriginalArgs[i];
3289 }
3290 CmdArgs.push_back("-dwarf-debug-flags");
3291 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3292 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003293
3294 // FIXME: Add -static support, once we have it.
3295
3296 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3297 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003298 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003299
3300 assert(Output.isFilename() && "Unexpected lipo output.");
3301 CmdArgs.push_back("-o");
3302 CmdArgs.push_back(Output.getFilename());
3303
Daniel Dunbarb440f562010-08-02 02:38:21 +00003304 assert(Input.isFilename() && "Invalid input.");
3305 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003306
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003307 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003308 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003309}
3310
Daniel Dunbara3246a02009-03-18 08:07:30 +00003311void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003312 const InputInfo &Output,
3313 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003314 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003315 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003316 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003317 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003318
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003319 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003320 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003321 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003322 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003323 // Don't forward any -g arguments to assembly steps.
3324 if (isa<AssembleJobAction>(JA) &&
3325 A->getOption().matches(options::OPT_g_Group))
3326 continue;
3327
Daniel Dunbar2da02722009-03-19 07:55:12 +00003328 // It is unfortunate that we have to claim here, as this means
3329 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003330 // platforms using a generic gcc, even if we are just using gcc
3331 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003332 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003333 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003334 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003335 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003336
Daniel Dunbar4e295052010-01-25 22:35:08 +00003337 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003338
3339 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003340 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003341 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003342 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003343
3344 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003345 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003346 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003347 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003348 CmdArgs.push_back("ppc64");
3349 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003350 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003351 }
3352
Daniel Dunbar5716d872009-05-02 21:41:52 +00003353 // Try to force gcc to match the tool chain we want, if we recognize
3354 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003355 //
3356 // FIXME: The triple class should directly provide the information we want
3357 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003358 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003359 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003360 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003361 CmdArgs.push_back("-m64");
3362
Daniel Dunbarb440f562010-08-02 02:38:21 +00003363 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003364 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003365 CmdArgs.push_back(Output.getFilename());
3366 } else {
3367 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003368 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003369 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003370
Tony Linthicum76329bf2011-12-12 21:14:55 +00003371 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3372 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003373
3374 // Only pass -x if gcc will understand it; otherwise hope gcc
3375 // understands the suffix correctly. The main use case this would go
3376 // wrong in is for linker inputs if they happened to have an odd
3377 // suffix; really the only way to get this to happen is a command
3378 // like '-x foobar a.c' which will treat a.c like a linker input.
3379 //
3380 // FIXME: For the linker case specifically, can we safely convert
3381 // inputs into '-Wl,' options?
3382 for (InputInfoList::const_iterator
3383 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3384 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003385
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003386 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003387 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3388 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003389 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003390 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003391 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003392 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003393 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003394
Daniel Dunbara3246a02009-03-18 08:07:30 +00003395 if (types::canTypeBeUserSpecified(II.getType())) {
3396 CmdArgs.push_back("-x");
3397 CmdArgs.push_back(types::getTypeName(II.getType()));
3398 }
3399
Daniel Dunbarb440f562010-08-02 02:38:21 +00003400 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003401 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003402 else {
3403 const Arg &A = II.getInputArg();
3404
3405 // Reverse translate some rewritten options.
3406 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3407 CmdArgs.push_back("-lstdc++");
3408 continue;
3409 }
3410
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003411 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003412 A.render(Args, CmdArgs);
3413 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003414 }
3415
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003416 const std::string customGCCName = D.getCCCGenericGCCName();
3417 const char *GCCName;
3418 if (!customGCCName.empty())
3419 GCCName = customGCCName.c_str();
3420 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003421 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003422 } else
3423 GCCName = "gcc";
3424
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003425 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003426 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003427 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003428}
3429
Daniel Dunbar4e295052010-01-25 22:35:08 +00003430void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3431 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003432 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003433}
3434
Daniel Dunbar4e295052010-01-25 22:35:08 +00003435void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3436 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003437 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003438}
3439
Daniel Dunbar4e295052010-01-25 22:35:08 +00003440void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3441 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003442 const Driver &D = getToolChain().getDriver();
3443
Daniel Dunbar4e295052010-01-25 22:35:08 +00003444 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003445 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3446 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003447 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003448 else {
3449 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003450 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003451 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003452
Daniel Dunbar4e295052010-01-25 22:35:08 +00003453 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003454 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003455}
3456
Daniel Dunbar4e295052010-01-25 22:35:08 +00003457void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3458 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003459 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003460}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003461
Daniel Dunbar4e295052010-01-25 22:35:08 +00003462void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3463 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003464 // The types are (hopefully) good enough.
3465}
3466
Tony Linthicum76329bf2011-12-12 21:14:55 +00003467// Hexagon tools start.
3468void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3469 ArgStringList &CmdArgs) const {
3470
3471}
3472void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3473 const InputInfo &Output,
3474 const InputInfoList &Inputs,
3475 const ArgList &Args,
3476 const char *LinkingOutput) const {
3477
3478 const Driver &D = getToolChain().getDriver();
3479 ArgStringList CmdArgs;
3480
3481 std::string MarchString = "-march=";
3482 MarchString += getHexagonTargetCPU(Args);
3483 CmdArgs.push_back(Args.MakeArgString(MarchString));
3484
3485 RenderExtraToolArgs(JA, CmdArgs);
3486
3487 if (Output.isFilename()) {
3488 CmdArgs.push_back("-o");
3489 CmdArgs.push_back(Output.getFilename());
3490 } else {
3491 assert(Output.isNothing() && "Unexpected output");
3492 CmdArgs.push_back("-fsyntax-only");
3493 }
3494
3495
3496 // Only pass -x if gcc will understand it; otherwise hope gcc
3497 // understands the suffix correctly. The main use case this would go
3498 // wrong in is for linker inputs if they happened to have an odd
3499 // suffix; really the only way to get this to happen is a command
3500 // like '-x foobar a.c' which will treat a.c like a linker input.
3501 //
3502 // FIXME: For the linker case specifically, can we safely convert
3503 // inputs into '-Wl,' options?
3504 for (InputInfoList::const_iterator
3505 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3506 const InputInfo &II = *it;
3507
3508 // Don't try to pass LLVM or AST inputs to a generic gcc.
3509 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3510 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3511 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3512 << getToolChain().getTripleString();
3513 else if (II.getType() == types::TY_AST)
3514 D.Diag(clang::diag::err_drv_no_ast_support)
3515 << getToolChain().getTripleString();
3516
3517 if (II.isFilename())
3518 CmdArgs.push_back(II.getFilename());
3519 else
3520 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3521 II.getInputArg().render(Args, CmdArgs);
3522 }
3523
3524 const char *GCCName = "hexagon-as";
3525 const char *Exec =
3526 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3527 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3528
3529}
3530void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3531 ArgStringList &CmdArgs) const {
3532 // The types are (hopefully) good enough.
3533}
3534
3535void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3536 const InputInfo &Output,
3537 const InputInfoList &Inputs,
3538 const ArgList &Args,
3539 const char *LinkingOutput) const {
3540
3541 const Driver &D = getToolChain().getDriver();
3542 ArgStringList CmdArgs;
3543
3544 for (ArgList::const_iterator
3545 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3546 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003547 if (forwardToGCC(A->getOption())) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00003548 // Don't forward any -g arguments to assembly steps.
3549 if (isa<AssembleJobAction>(JA) &&
3550 A->getOption().matches(options::OPT_g_Group))
3551 continue;
3552
3553 // It is unfortunate that we have to claim here, as this means
3554 // we will basically never report anything interesting for
3555 // platforms using a generic gcc, even if we are just using gcc
3556 // to get to the assembler.
3557 A->claim();
3558 A->render(Args, CmdArgs);
3559 }
3560 }
3561
3562 RenderExtraToolArgs(JA, CmdArgs);
3563
3564 // Add Arch Information
3565 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003566 if ((A = getLastHexagonArchArg(Args))) {
3567 if (A->getOption().matches(options::OPT_m_Joined))
3568 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003569 else
Sebastian Pop86500282012-01-13 20:37:10 +00003570 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003571 }
Sebastian Pop86500282012-01-13 20:37:10 +00003572 else {
3573 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3574 }
3575
Tony Linthicum76329bf2011-12-12 21:14:55 +00003576 CmdArgs.push_back("-mqdsp6-compat");
3577
3578 const char *GCCName;
3579 if (C.getDriver().CCCIsCXX)
3580 GCCName = "hexagon-g++";
3581 else
3582 GCCName = "hexagon-gcc";
3583 const char *Exec =
3584 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3585
3586 if (Output.isFilename()) {
3587 CmdArgs.push_back("-o");
3588 CmdArgs.push_back(Output.getFilename());
3589 }
3590
3591 for (InputInfoList::const_iterator
3592 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3593 const InputInfo &II = *it;
3594
3595 // Don't try to pass LLVM or AST inputs to a generic gcc.
3596 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3597 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3598 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3599 << getToolChain().getTripleString();
3600 else if (II.getType() == types::TY_AST)
3601 D.Diag(clang::diag::err_drv_no_ast_support)
3602 << getToolChain().getTripleString();
3603
3604 if (II.isFilename())
3605 CmdArgs.push_back(II.getFilename());
3606 else
3607 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3608 II.getInputArg().render(Args, CmdArgs);
3609 }
3610 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3611
3612}
3613// Hexagon tools end.
3614
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003615llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3616 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3617 // archs which Darwin doesn't use.
3618
3619 // The matching this routine does is fairly pointless, since it is neither the
3620 // complete architecture list, nor a reasonable subset. The problem is that
3621 // historically the driver driver accepts this and also ties its -march=
3622 // handling to the architecture name, so we need to be careful before removing
3623 // support for it.
3624
3625 // This code must be kept in sync with Clang's Darwin specific argument
3626 // translation.
3627
3628 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3629 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3630 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3631 .Case("ppc64", llvm::Triple::ppc64)
3632 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3633 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3634 llvm::Triple::x86)
3635 .Case("x86_64", llvm::Triple::x86_64)
3636 // This is derived from the driver driver.
3637 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3638 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3639 .Case("r600", llvm::Triple::r600)
3640 .Case("nvptx", llvm::Triple::nvptx)
3641 .Case("nvptx64", llvm::Triple::nvptx64)
3642 .Case("amdil", llvm::Triple::amdil)
3643 .Case("spir", llvm::Triple::spir)
3644 .Default(llvm::Triple::UnknownArch);
3645}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003646
Bob Wilsondecc03e2012-11-23 06:14:39 +00003647const char *Clang::getBaseInputName(const ArgList &Args,
3648 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003649 return Args.MakeArgString(
3650 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003651}
3652
Bob Wilsondecc03e2012-11-23 06:14:39 +00003653const char *Clang::getBaseInputStem(const ArgList &Args,
3654 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003655 const char *Str = getBaseInputName(Args, Inputs);
3656
Chris Lattner906bb902011-01-16 08:14:11 +00003657 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003658 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003659
3660 return Str;
3661}
3662
Bob Wilsondecc03e2012-11-23 06:14:39 +00003663const char *Clang::getDependencyFileName(const ArgList &Args,
3664 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003665 // FIXME: Think about this more.
3666 std::string Res;
3667
3668 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003669 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003670 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003671 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00003672 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003673 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003674 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003675}
3676
Daniel Dunbarbe220842009-03-20 16:06:39 +00003677void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003678 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003679 const InputInfoList &Inputs,
3680 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00003681 const char *LinkingOutput) const {
3682 ArgStringList CmdArgs;
3683
3684 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3685 const InputInfo &Input = Inputs[0];
3686
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003687 // Determine the original source input.
3688 const Action *SourceAction = &JA;
3689 while (SourceAction->getKind() != Action::InputClass) {
3690 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3691 SourceAction = SourceAction->getInputs()[0];
3692 }
3693
3694 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00003695 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00003696 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003697 if (Args.hasArg(options::OPT_gstabs))
3698 CmdArgs.push_back("--gstabs");
3699 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00003700 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00003701 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003702
Daniel Dunbarbe220842009-03-20 16:06:39 +00003703 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003704 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00003705
Daniel Dunbar6d484762010-07-22 01:47:22 +00003706 // Use -force_cpusubtype_ALL on x86 by default.
3707 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
3708 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00003709 Args.hasArg(options::OPT_force__cpusubtype__ALL))
3710 CmdArgs.push_back("-force_cpusubtype_ALL");
3711
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00003712 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003713 (((Args.hasArg(options::OPT_mkernel) ||
3714 Args.hasArg(options::OPT_fapple_kext)) &&
3715 (!getDarwinToolChain().isTargetIPhoneOS() ||
3716 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
3717 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003718 CmdArgs.push_back("-static");
3719
Daniel Dunbarbe220842009-03-20 16:06:39 +00003720 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3721 options::OPT_Xassembler);
3722
3723 assert(Output.isFilename() && "Unexpected lipo output.");
3724 CmdArgs.push_back("-o");
3725 CmdArgs.push_back(Output.getFilename());
3726
Daniel Dunbarb440f562010-08-02 02:38:21 +00003727 assert(Input.isFilename() && "Invalid input.");
3728 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00003729
3730 // asm_final spec is empty.
3731
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003732 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003733 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003734 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00003735}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00003736
David Blaikie68e081d2011-12-20 02:48:34 +00003737void darwin::DarwinTool::anchor() {}
3738
Daniel Dunbare9ded432009-09-09 18:36:20 +00003739void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
3740 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003741 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003742
Daniel Dunbarc1964212009-03-26 16:23:12 +00003743 // Derived from darwin_arch spec.
3744 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003745 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003746
Daniel Dunbardcc3b652010-01-22 02:04:58 +00003747 // FIXME: Is this needed anymore?
3748 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00003749 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00003750}
3751
Bill Wendling3b2000f2012-10-02 18:02:50 +00003752bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
3753 // We only need to generate a temp path for LTO if we aren't compiling object
3754 // files. When compiling source files, we run 'dsymutil' after linking. We
3755 // don't run 'dsymutil' when compiling object files.
3756 for (InputInfoList::const_iterator
3757 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
3758 if (it->getType() != types::TY_Object)
3759 return true;
3760
3761 return false;
3762}
3763
Daniel Dunbarccbc4522010-09-09 21:51:05 +00003764void darwin::Link::AddLinkArgs(Compilation &C,
3765 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00003766 ArgStringList &CmdArgs,
3767 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003768 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003769 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00003770
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003771 unsigned Version[3] = { 0, 0, 0 };
3772 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3773 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00003774 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003775 Version[1], Version[2], HadExtra) ||
3776 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003777 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003778 << A->getAsString(Args);
3779 }
3780
3781 // Newer linkers support -demangle, pass it if supported and not disabled by
3782 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00003783 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00003784 // Don't pass -demangle to ld_classic.
3785 //
3786 // FIXME: This is a temporary workaround, ld should be handling this.
3787 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
3788 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00003789 if (getToolChain().getArch() == llvm::Triple::x86) {
3790 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
3791 options::OPT_Wl_COMMA),
3792 ie = Args.filtered_end(); it != ie; ++it) {
3793 const Arg *A = *it;
3794 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00003795 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00003796 UsesLdClassic = true;
3797 }
3798 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00003799 if (!UsesLdClassic)
3800 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00003801 }
3802
Bill Wendling313b6bf2012-11-16 23:03:00 +00003803 // If we are using LTO, then automatically create a temporary file path for
3804 // the linker to use, so that it's lifetime will extend past a possible
3805 // dsymutil step.
3806 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
3807 const char *TmpPath = C.getArgs().MakeArgString(
3808 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
3809 C.addTempFile(TmpPath);
3810 CmdArgs.push_back("-object_path_lto");
3811 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00003812 }
3813
Daniel Dunbarc1964212009-03-26 16:23:12 +00003814 // Derived from the "link" spec.
3815 Args.AddAllArgs(CmdArgs, options::OPT_static);
3816 if (!Args.hasArg(options::OPT_static))
3817 CmdArgs.push_back("-dynamic");
3818 if (Args.hasArg(options::OPT_fgnu_runtime)) {
3819 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
3820 // here. How do we wish to handle such things?
3821 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003822
Daniel Dunbarc1964212009-03-26 16:23:12 +00003823 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00003824 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00003825 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00003826 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003827
3828 Args.AddLastArg(CmdArgs, options::OPT_bundle);
3829 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
3830 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
3831
3832 Arg *A;
3833 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
3834 (A = Args.getLastArg(options::OPT_current__version)) ||
3835 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003836 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00003837 << A->getAsString(Args) << "-dynamiclib";
3838
3839 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
3840 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
3841 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
3842 } else {
3843 CmdArgs.push_back("-dylib");
3844
3845 Arg *A;
3846 if ((A = Args.getLastArg(options::OPT_bundle)) ||
3847 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
3848 (A = Args.getLastArg(options::OPT_client__name)) ||
3849 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
3850 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
3851 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003852 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00003853 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003854
Daniel Dunbarc1964212009-03-26 16:23:12 +00003855 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
3856 "-dylib_compatibility_version");
3857 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
3858 "-dylib_current_version");
3859
Daniel Dunbara48823f2010-01-22 02:04:52 +00003860 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003861
3862 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
3863 "-dylib_install_name");
3864 }
3865
3866 Args.AddLastArg(CmdArgs, options::OPT_all__load);
3867 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
3868 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003869 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003870 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003871 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
3872 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
3873 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
3874 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
3875 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
3876 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00003877 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003878 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
3879 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
3880 Args.AddAllArgs(CmdArgs, options::OPT_init);
3881
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003882 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00003883 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00003884
3885 // If we had an explicit -mios-simulator-version-min argument, honor that,
3886 // otherwise use the traditional deployment targets. We can't just check the
3887 // is-sim attribute because existing code follows this path, and the linker
3888 // may not handle the argument.
3889 //
3890 // FIXME: We may be able to remove this, once we can verify no one depends on
3891 // it.
3892 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
3893 CmdArgs.push_back("-ios_simulator_version_min");
3894 else if (DarwinTC.isTargetIPhoneOS())
3895 CmdArgs.push_back("-iphoneos_version_min");
3896 else
3897 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00003898 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00003899
Daniel Dunbarc1964212009-03-26 16:23:12 +00003900 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
3901 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
3902 Args.AddLastArg(CmdArgs, options::OPT_single__module);
3903 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
3904 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003905
Daniel Dunbaraf68a882010-07-13 23:31:40 +00003906 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
3907 options::OPT_fno_pie,
3908 options::OPT_fno_PIE)) {
3909 if (A->getOption().matches(options::OPT_fpie) ||
3910 A->getOption().matches(options::OPT_fPIE))
3911 CmdArgs.push_back("-pie");
3912 else
3913 CmdArgs.push_back("-no_pie");
3914 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00003915
3916 Args.AddLastArg(CmdArgs, options::OPT_prebind);
3917 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
3918 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
3919 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
3920 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
3921 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
3922 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
3923 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
3924 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
3925 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
3926 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
3927 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
3928 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
3929 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
3930 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
3931 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003932
Daniel Dunbar84384642011-05-02 21:03:47 +00003933 // Give --sysroot= preference, over the Apple specific behavior to also use
3934 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00003935 StringRef sysroot = C.getSysRoot();
3936 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00003937 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00003938 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00003939 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3940 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00003941 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003942 }
3943
Daniel Dunbarc1964212009-03-26 16:23:12 +00003944 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
3945 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
3946 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
3947 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
3948 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00003949 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003950 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
3951 Args.AddAllArgs(CmdArgs, options::OPT_y);
3952 Args.AddLastArg(CmdArgs, options::OPT_w);
3953 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
3954 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
3955 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
3956 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
3957 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
3958 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
3959 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
3960 Args.AddLastArg(CmdArgs, options::OPT_whyload);
3961 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
3962 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
3963 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
3964 Args.AddLastArg(CmdArgs, options::OPT_Mach);
3965}
3966
3967void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003968 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003969 const InputInfoList &Inputs,
3970 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00003971 const char *LinkingOutput) const {
3972 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00003973
Daniel Dunbarc1964212009-03-26 16:23:12 +00003974 // The logic here is derived from gcc's behavior; most of which
3975 // comes from specs (starting with link_command). Consult gcc for
3976 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00003977 ArgStringList CmdArgs;
3978
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00003979 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
3980 if (Args.hasArg(options::OPT_ccc_arcmt_check,
3981 options::OPT_ccc_arcmt_migrate)) {
3982 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
3983 (*I)->claim();
3984 const char *Exec =
3985 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
3986 CmdArgs.push_back(Output.getFilename());
3987 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3988 return;
3989 }
3990
Daniel Dunbarc1964212009-03-26 16:23:12 +00003991 // I'm not sure why this particular decomposition exists in gcc, but
3992 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00003993 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00003994
Daniel Dunbarc1964212009-03-26 16:23:12 +00003995 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
3996 Args.AddAllArgs(CmdArgs, options::OPT_s);
3997 Args.AddAllArgs(CmdArgs, options::OPT_t);
3998 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
3999 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004000 Args.AddLastArg(CmdArgs, options::OPT_e);
4001 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4002 Args.AddAllArgs(CmdArgs, options::OPT_r);
4003
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004004 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4005 // members of static archive libraries which implement Objective-C classes or
4006 // categories.
4007 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4008 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004009
Daniel Dunbarc1964212009-03-26 16:23:12 +00004010 CmdArgs.push_back("-o");
4011 CmdArgs.push_back(Output.getFilename());
4012
Chad Rosier06fd3c62012-05-16 23:45:12 +00004013 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004014 !Args.hasArg(options::OPT_nostartfiles)) {
4015 // Derived from startfile spec.
4016 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004017 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004018 if (getDarwinToolChain().isTargetIOSSimulator()) {
4019 // The simulator doesn't have a versioned crt1 file.
4020 CmdArgs.push_back("-ldylib1.o");
4021 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004022 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4023 CmdArgs.push_back("-ldylib1.o");
4024 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004025 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004026 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004027 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004028 CmdArgs.push_back("-ldylib1.10.5.o");
4029 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004030 } else {
4031 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004032 if (!Args.hasArg(options::OPT_static)) {
4033 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004034 if (getDarwinToolChain().isTargetIOSSimulator()) {
4035 // The simulator doesn't have a versioned crt1 file.
4036 CmdArgs.push_back("-lbundle1.o");
4037 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004038 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4039 CmdArgs.push_back("-lbundle1.o");
4040 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004041 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004042 CmdArgs.push_back("-lbundle1.o");
4043 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004044 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004045 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004046 if (Args.hasArg(options::OPT_pg) &&
4047 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004048 if (Args.hasArg(options::OPT_static) ||
4049 Args.hasArg(options::OPT_object) ||
4050 Args.hasArg(options::OPT_preload)) {
4051 CmdArgs.push_back("-lgcrt0.o");
4052 } else {
4053 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004054
Daniel Dunbarc1964212009-03-26 16:23:12 +00004055 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004056 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004057 // By default on OS X 10.8 and later, we don't link with a crt1.o
4058 // file and the linker knows to use _main as the entry point. But,
4059 // when compiling with -pg, we need to link with the gcrt1.o file,
4060 // so pass the -no_new_main option to tell the linker to use the
4061 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004062 if (getDarwinToolChain().isTargetMacOS() &&
4063 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4064 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004065 } else {
4066 if (Args.hasArg(options::OPT_static) ||
4067 Args.hasArg(options::OPT_object) ||
4068 Args.hasArg(options::OPT_preload)) {
4069 CmdArgs.push_back("-lcrt0.o");
4070 } else {
4071 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004072 if (getDarwinToolChain().isTargetIOSSimulator()) {
4073 // The simulator doesn't have a versioned crt1 file.
4074 CmdArgs.push_back("-lcrt1.o");
4075 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004076 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4077 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004078 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004079 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004080 } else {
4081 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4082 CmdArgs.push_back("-lcrt1.o");
4083 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4084 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004085 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004086 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004087
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004088 // darwin_crt2 spec is empty.
4089 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004090 }
4091 }
4092 }
4093 }
4094
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004095 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4096 Args.hasArg(options::OPT_shared_libgcc) &&
4097 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004098 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004099 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004100 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004101 }
4102 }
4103
4104 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004105
Alexey Samsonov627b10f2012-11-06 15:09:03 +00004106 SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
Alexey Samsonovcc429802012-11-16 12:53:14 +00004107 // If we're building a dynamic lib with -fsanitize=address, or
4108 // -fsanitize=undefined, unresolved symbols may appear. Mark all
4109 // of them as dynamic_lookup. Linking executables is handled in
4110 // lib/Driver/ToolChains.cpp.
4111 if (Sanitize.needsAsanRt() || Sanitize.needsUbsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004112 if (Args.hasArg(options::OPT_dynamiclib) ||
4113 Args.hasArg(options::OPT_bundle)) {
4114 CmdArgs.push_back("-undefined");
4115 CmdArgs.push_back("dynamic_lookup");
4116 }
4117 }
4118
Daniel Dunbarc1964212009-03-26 16:23:12 +00004119 if (Args.hasArg(options::OPT_fopenmp))
4120 // This is more complicated in gcc...
4121 CmdArgs.push_back("-lgomp");
4122
Douglas Gregor9295df02012-05-15 21:00:27 +00004123 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4124
Bob Wilson16d93952012-05-15 18:57:39 +00004125 if (isObjCRuntimeLinked(Args) &&
4126 !Args.hasArg(options::OPT_nostdlib) &&
4127 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004128 // Avoid linking compatibility stubs on i386 mac.
4129 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004130 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004131 // If we don't have ARC or subscripting runtime support, link in the
4132 // runtime stubs. We have to do this *before* adding any of the normal
4133 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004134 ObjCRuntime runtime =
4135 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004136 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004137 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004138 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004139 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004140 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004141 CmdArgs.push_back("-framework");
4142 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004143 // Link libobj.
4144 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004145 }
John McCall31168b02011-06-15 23:02:42 +00004146
Daniel Dunbarc1964212009-03-26 16:23:12 +00004147 if (LinkingOutput) {
4148 CmdArgs.push_back("-arch_multiple");
4149 CmdArgs.push_back("-final_output");
4150 CmdArgs.push_back(LinkingOutput);
4151 }
4152
Daniel Dunbarc1964212009-03-26 16:23:12 +00004153 if (Args.hasArg(options::OPT_fnested_functions))
4154 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004155
Daniel Dunbarc1964212009-03-26 16:23:12 +00004156 if (!Args.hasArg(options::OPT_nostdlib) &&
4157 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004158 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004159 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004160
Daniel Dunbarc1964212009-03-26 16:23:12 +00004161 // link_ssp spec is empty.
4162
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004163 // Let the tool chain choose which runtime library to link.
4164 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004165 }
4166
Chad Rosier06fd3c62012-05-16 23:45:12 +00004167 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004168 !Args.hasArg(options::OPT_nostartfiles)) {
4169 // endfile_spec is empty.
4170 }
4171
4172 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4173 Args.AddAllArgs(CmdArgs, options::OPT_F);
4174
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004175 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004176 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004177 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004178}
4179
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004180void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004181 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004182 const InputInfoList &Inputs,
4183 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004184 const char *LinkingOutput) const {
4185 ArgStringList CmdArgs;
4186
4187 CmdArgs.push_back("-create");
4188 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004189
4190 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004191 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004192
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004193 for (InputInfoList::const_iterator
4194 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4195 const InputInfo &II = *it;
4196 assert(II.isFilename() && "Unexpected lipo input.");
4197 CmdArgs.push_back(II.getFilename());
4198 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004199 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004200 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004201 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004202}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004203
Daniel Dunbar88299622010-06-04 18:28:36 +00004204void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004205 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004206 const InputInfoList &Inputs,
4207 const ArgList &Args,
4208 const char *LinkingOutput) const {
4209 ArgStringList CmdArgs;
4210
Daniel Dunbareb86b042011-05-09 17:23:16 +00004211 CmdArgs.push_back("-o");
4212 CmdArgs.push_back(Output.getFilename());
4213
Daniel Dunbar88299622010-06-04 18:28:36 +00004214 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4215 const InputInfo &Input = Inputs[0];
4216 assert(Input.isFilename() && "Unexpected dsymutil input.");
4217 CmdArgs.push_back(Input.getFilename());
4218
Daniel Dunbar88299622010-06-04 18:28:36 +00004219 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004220 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004221 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004222}
4223
Eric Christopher551ef452011-08-23 17:56:55 +00004224void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4225 const InputInfo &Output,
4226 const InputInfoList &Inputs,
4227 const ArgList &Args,
4228 const char *LinkingOutput) const {
4229 ArgStringList CmdArgs;
4230 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004231 CmdArgs.push_back("--debug-info");
4232 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004233 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004234
4235 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4236 const InputInfo &Input = Inputs[0];
4237 assert(Input.isFilename() && "Unexpected verify input");
4238
4239 // Grabbing the output of the earlier dsymutil run.
4240 CmdArgs.push_back(Input.getFilename());
4241
4242 const char *Exec =
4243 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4244 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4245}
4246
David Chisnallf571cde2012-02-15 13:39:01 +00004247void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4248 const InputInfo &Output,
4249 const InputInfoList &Inputs,
4250 const ArgList &Args,
4251 const char *LinkingOutput) const {
4252 ArgStringList CmdArgs;
4253
4254 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4255 options::OPT_Xassembler);
4256
4257 CmdArgs.push_back("-o");
4258 CmdArgs.push_back(Output.getFilename());
4259
4260 for (InputInfoList::const_iterator
4261 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4262 const InputInfo &II = *it;
4263 CmdArgs.push_back(II.getFilename());
4264 }
4265
4266 const char *Exec =
4267 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4268 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4269}
4270
4271
4272void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4273 const InputInfo &Output,
4274 const InputInfoList &Inputs,
4275 const ArgList &Args,
4276 const char *LinkingOutput) const {
4277 // FIXME: Find a real GCC, don't hard-code versions here
4278 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4279 const llvm::Triple &T = getToolChain().getTriple();
4280 std::string LibPath = "/usr/lib/";
4281 llvm::Triple::ArchType Arch = T.getArch();
4282 switch (Arch) {
4283 case llvm::Triple::x86:
4284 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4285 T.getOSName()).str() + "/4.5.2/";
4286 break;
4287 case llvm::Triple::x86_64:
4288 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4289 T.getOSName()).str();
4290 GCCLibPath += "/4.5.2/amd64/";
4291 LibPath += "amd64/";
4292 break;
4293 default:
4294 assert(0 && "Unsupported architecture");
4295 }
4296
4297 ArgStringList CmdArgs;
4298
David Chisnall272a0712012-02-29 15:06:12 +00004299 // Demangle C++ names in errors
4300 CmdArgs.push_back("-C");
4301
David Chisnallf571cde2012-02-15 13:39:01 +00004302 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4303 (!Args.hasArg(options::OPT_shared))) {
4304 CmdArgs.push_back("-e");
4305 CmdArgs.push_back("_start");
4306 }
4307
4308 if (Args.hasArg(options::OPT_static)) {
4309 CmdArgs.push_back("-Bstatic");
4310 CmdArgs.push_back("-dn");
4311 } else {
4312 CmdArgs.push_back("-Bdynamic");
4313 if (Args.hasArg(options::OPT_shared)) {
4314 CmdArgs.push_back("-shared");
4315 } else {
4316 CmdArgs.push_back("--dynamic-linker");
4317 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4318 }
4319 }
4320
4321 if (Output.isFilename()) {
4322 CmdArgs.push_back("-o");
4323 CmdArgs.push_back(Output.getFilename());
4324 } else {
4325 assert(Output.isNothing() && "Invalid output.");
4326 }
4327
4328 if (!Args.hasArg(options::OPT_nostdlib) &&
4329 !Args.hasArg(options::OPT_nostartfiles)) {
4330 if (!Args.hasArg(options::OPT_shared)) {
4331 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4332 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004333 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004334 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4335 } else {
4336 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004337 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4338 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004339 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004340 if (getToolChain().getDriver().CCCIsCXX)
4341 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004342 }
4343
4344 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4345
4346 Args.AddAllArgs(CmdArgs, options::OPT_L);
4347 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4348 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004349 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004350
4351 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4352
4353 if (!Args.hasArg(options::OPT_nostdlib) &&
4354 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004355 if (getToolChain().getDriver().CCCIsCXX)
4356 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004357 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004358 if (!Args.hasArg(options::OPT_shared)) {
4359 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004360 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004361 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004362 }
David Chisnallf571cde2012-02-15 13:39:01 +00004363 }
4364
4365 if (!Args.hasArg(options::OPT_nostdlib) &&
4366 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004367 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004368 }
David Chisnall96de9932012-02-16 16:00:47 +00004369 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004370
4371 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4372
4373 const char *Exec =
4374 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4375 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4376}
4377
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004378void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004379 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004380 const InputInfoList &Inputs,
4381 const ArgList &Args,
4382 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004383 ArgStringList CmdArgs;
4384
4385 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4386 options::OPT_Xassembler);
4387
4388 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004389 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004390
4391 for (InputInfoList::const_iterator
4392 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4393 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004394 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004395 }
4396
4397 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004398 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004399 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004400}
4401
4402void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004403 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004404 const InputInfoList &Inputs,
4405 const ArgList &Args,
4406 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004407 ArgStringList CmdArgs;
4408
4409 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004410 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004411 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004412 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004413 }
4414
4415 if (Args.hasArg(options::OPT_static)) {
4416 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004417 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004418 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004419// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004420 CmdArgs.push_back("-Bdynamic");
4421 if (Args.hasArg(options::OPT_shared)) {
4422 CmdArgs.push_back("-shared");
4423 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004424 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004425 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4426 }
4427 }
4428
Daniel Dunbarb440f562010-08-02 02:38:21 +00004429 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004430 CmdArgs.push_back("-o");
4431 CmdArgs.push_back(Output.getFilename());
4432 } else {
4433 assert(Output.isNothing() && "Invalid output.");
4434 }
4435
4436 if (!Args.hasArg(options::OPT_nostdlib) &&
4437 !Args.hasArg(options::OPT_nostartfiles)) {
4438 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004439 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004440 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004441 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004442 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004443 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004444 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004445 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004446 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004447 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004448 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004449 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004450 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004451 }
4452
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004453 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4454 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004455 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004456
4457 Args.AddAllArgs(CmdArgs, options::OPT_L);
4458 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4459 Args.AddAllArgs(CmdArgs, options::OPT_e);
4460
Daniel Dunbar54423b22010-09-17 00:24:54 +00004461 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004462
4463 if (!Args.hasArg(options::OPT_nostdlib) &&
4464 !Args.hasArg(options::OPT_nodefaultlibs)) {
4465 // FIXME: For some reason GCC passes -lgcc before adding
4466 // the default system libraries. Just mimic this for now.
4467 CmdArgs.push_back("-lgcc");
4468
4469 if (Args.hasArg(options::OPT_pthread))
4470 CmdArgs.push_back("-pthread");
4471 if (!Args.hasArg(options::OPT_shared))
4472 CmdArgs.push_back("-lc");
4473 CmdArgs.push_back("-lgcc");
4474 }
4475
4476 if (!Args.hasArg(options::OPT_nostdlib) &&
4477 !Args.hasArg(options::OPT_nostartfiles)) {
4478 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004479 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004480 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004481 }
4482
Bill Wendling08760582011-06-27 19:15:03 +00004483 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004484
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004485 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004486 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004487 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004488}
4489
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004490void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004491 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004492 const InputInfoList &Inputs,
4493 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004494 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004495 ArgStringList CmdArgs;
4496
4497 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4498 options::OPT_Xassembler);
4499
4500 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004501 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004502
4503 for (InputInfoList::const_iterator
4504 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4505 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004506 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004507 }
4508
4509 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004510 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004511 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004512}
4513
4514void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004515 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004516 const InputInfoList &Inputs,
4517 const ArgList &Args,
4518 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004519 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004520 ArgStringList CmdArgs;
4521
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004522 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004523 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004524 CmdArgs.push_back("-e");
4525 CmdArgs.push_back("__start");
4526 }
4527
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004528 if (Args.hasArg(options::OPT_static)) {
4529 CmdArgs.push_back("-Bstatic");
4530 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004531 if (Args.hasArg(options::OPT_rdynamic))
4532 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004533 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004534 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004535 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004536 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004537 } else {
4538 CmdArgs.push_back("-dynamic-linker");
4539 CmdArgs.push_back("/usr/libexec/ld.so");
4540 }
4541 }
4542
Daniel Dunbarb440f562010-08-02 02:38:21 +00004543 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004544 CmdArgs.push_back("-o");
4545 CmdArgs.push_back(Output.getFilename());
4546 } else {
4547 assert(Output.isNothing() && "Invalid output.");
4548 }
4549
4550 if (!Args.hasArg(options::OPT_nostdlib) &&
4551 !Args.hasArg(options::OPT_nostartfiles)) {
4552 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004553 if (Args.hasArg(options::OPT_pg))
4554 CmdArgs.push_back(Args.MakeArgString(
4555 getToolChain().GetFilePath("gcrt0.o")));
4556 else
4557 CmdArgs.push_back(Args.MakeArgString(
4558 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004559 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004560 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004561 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004562 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004563 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004564 }
4565 }
4566
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004567 std::string Triple = getToolChain().getTripleString();
4568 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004569 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004570 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004571 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004572
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004573 Args.AddAllArgs(CmdArgs, options::OPT_L);
4574 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4575 Args.AddAllArgs(CmdArgs, options::OPT_e);
4576
Daniel Dunbar54423b22010-09-17 00:24:54 +00004577 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004578
4579 if (!Args.hasArg(options::OPT_nostdlib) &&
4580 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004581 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004582 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004583 if (Args.hasArg(options::OPT_pg))
4584 CmdArgs.push_back("-lm_p");
4585 else
4586 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004587 }
4588
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004589 // FIXME: For some reason GCC passes -lgcc before adding
4590 // the default system libraries. Just mimic this for now.
4591 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004592
Eric Christopher17674ec2012-09-13 06:32:34 +00004593 if (Args.hasArg(options::OPT_pthread)) {
4594 if (!Args.hasArg(options::OPT_shared) &&
4595 Args.hasArg(options::OPT_pg))
4596 CmdArgs.push_back("-lpthread_p");
4597 else
4598 CmdArgs.push_back("-lpthread");
4599 }
4600
Chandler Carruth45661652011-12-17 22:32:42 +00004601 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004602 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004603 CmdArgs.push_back("-lc_p");
4604 else
4605 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004606 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004607
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004608 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004609 }
4610
4611 if (!Args.hasArg(options::OPT_nostdlib) &&
4612 !Args.hasArg(options::OPT_nostartfiles)) {
4613 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004614 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004615 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004616 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004617 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004618 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004619 }
4620
4621 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004622 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004623 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004624}
Ed Schoutene33194b2009-04-02 19:13:12 +00004625
Eli Friedman9fa28852012-08-08 23:57:20 +00004626void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4627 const InputInfo &Output,
4628 const InputInfoList &Inputs,
4629 const ArgList &Args,
4630 const char *LinkingOutput) const {
4631 ArgStringList CmdArgs;
4632
4633 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4634 options::OPT_Xassembler);
4635
4636 CmdArgs.push_back("-o");
4637 CmdArgs.push_back(Output.getFilename());
4638
4639 for (InputInfoList::const_iterator
4640 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4641 const InputInfo &II = *it;
4642 CmdArgs.push_back(II.getFilename());
4643 }
4644
4645 const char *Exec =
4646 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4647 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4648}
4649
4650void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4651 const InputInfo &Output,
4652 const InputInfoList &Inputs,
4653 const ArgList &Args,
4654 const char *LinkingOutput) const {
4655 const Driver &D = getToolChain().getDriver();
4656 ArgStringList CmdArgs;
4657
4658 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4659 (!Args.hasArg(options::OPT_shared))) {
4660 CmdArgs.push_back("-e");
4661 CmdArgs.push_back("__start");
4662 }
4663
4664 if (Args.hasArg(options::OPT_static)) {
4665 CmdArgs.push_back("-Bstatic");
4666 } else {
4667 if (Args.hasArg(options::OPT_rdynamic))
4668 CmdArgs.push_back("-export-dynamic");
4669 CmdArgs.push_back("--eh-frame-hdr");
4670 CmdArgs.push_back("-Bdynamic");
4671 if (Args.hasArg(options::OPT_shared)) {
4672 CmdArgs.push_back("-shared");
4673 } else {
4674 CmdArgs.push_back("-dynamic-linker");
4675 CmdArgs.push_back("/usr/libexec/ld.so");
4676 }
4677 }
4678
4679 if (Output.isFilename()) {
4680 CmdArgs.push_back("-o");
4681 CmdArgs.push_back(Output.getFilename());
4682 } else {
4683 assert(Output.isNothing() && "Invalid output.");
4684 }
4685
4686 if (!Args.hasArg(options::OPT_nostdlib) &&
4687 !Args.hasArg(options::OPT_nostartfiles)) {
4688 if (!Args.hasArg(options::OPT_shared)) {
4689 if (Args.hasArg(options::OPT_pg))
4690 CmdArgs.push_back(Args.MakeArgString(
4691 getToolChain().GetFilePath("gcrt0.o")));
4692 else
4693 CmdArgs.push_back(Args.MakeArgString(
4694 getToolChain().GetFilePath("crt0.o")));
4695 CmdArgs.push_back(Args.MakeArgString(
4696 getToolChain().GetFilePath("crtbegin.o")));
4697 } else {
4698 CmdArgs.push_back(Args.MakeArgString(
4699 getToolChain().GetFilePath("crtbeginS.o")));
4700 }
4701 }
4702
4703 Args.AddAllArgs(CmdArgs, options::OPT_L);
4704 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4705 Args.AddAllArgs(CmdArgs, options::OPT_e);
4706
4707 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4708
4709 if (!Args.hasArg(options::OPT_nostdlib) &&
4710 !Args.hasArg(options::OPT_nodefaultlibs)) {
4711 if (D.CCCIsCXX) {
4712 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
4713 if (Args.hasArg(options::OPT_pg))
4714 CmdArgs.push_back("-lm_p");
4715 else
4716 CmdArgs.push_back("-lm");
4717 }
4718
Rafael Espindola1ad26f02012-10-23 17:07:31 +00004719 if (Args.hasArg(options::OPT_pthread)) {
4720 if (!Args.hasArg(options::OPT_shared) &&
4721 Args.hasArg(options::OPT_pg))
4722 CmdArgs.push_back("-lpthread_p");
4723 else
4724 CmdArgs.push_back("-lpthread");
4725 }
4726
Eli Friedman9fa28852012-08-08 23:57:20 +00004727 if (!Args.hasArg(options::OPT_shared)) {
4728 if (Args.hasArg(options::OPT_pg))
4729 CmdArgs.push_back("-lc_p");
4730 else
4731 CmdArgs.push_back("-lc");
4732 }
4733
4734 std::string myarch = "-lclang_rt.";
4735 const llvm::Triple &T = getToolChain().getTriple();
4736 llvm::Triple::ArchType Arch = T.getArch();
4737 switch (Arch) {
4738 case llvm::Triple::arm:
4739 myarch += ("arm");
4740 break;
4741 case llvm::Triple::x86:
4742 myarch += ("i386");
4743 break;
4744 case llvm::Triple::x86_64:
4745 myarch += ("amd64");
4746 break;
4747 default:
4748 assert(0 && "Unsupported architecture");
4749 }
4750 CmdArgs.push_back(Args.MakeArgString(myarch));
4751 }
4752
4753 if (!Args.hasArg(options::OPT_nostdlib) &&
4754 !Args.hasArg(options::OPT_nostartfiles)) {
4755 if (!Args.hasArg(options::OPT_shared))
4756 CmdArgs.push_back(Args.MakeArgString(
4757 getToolChain().GetFilePath("crtend.o")));
4758 else
4759 CmdArgs.push_back(Args.MakeArgString(
4760 getToolChain().GetFilePath("crtendS.o")));
4761 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00004762
4763 const char *Exec =
4764 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4765 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00004766}
4767
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004768void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004769 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004770 const InputInfoList &Inputs,
4771 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004772 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004773 ArgStringList CmdArgs;
4774
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004775 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4776 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004777 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004778 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004779 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00004780 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004781 else if (getToolChain().getArch() == llvm::Triple::mips ||
4782 getToolChain().getArch() == llvm::Triple::mipsel ||
4783 getToolChain().getArch() == llvm::Triple::mips64 ||
4784 getToolChain().getArch() == llvm::Triple::mips64el) {
4785 StringRef CPUName;
4786 StringRef ABIName;
4787 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004788
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00004789 CmdArgs.push_back("-march");
4790 CmdArgs.push_back(CPUName.data());
4791
4792 // Convert ABI name to the GNU tools acceptable variant.
4793 if (ABIName == "o32")
4794 ABIName = "32";
4795 else if (ABIName == "n64")
4796 ABIName = "64";
4797
4798 CmdArgs.push_back("-mabi");
4799 CmdArgs.push_back(ABIName.data());
4800
4801 if (getToolChain().getArch() == llvm::Triple::mips ||
4802 getToolChain().getArch() == llvm::Triple::mips64)
4803 CmdArgs.push_back("-EB");
4804 else
4805 CmdArgs.push_back("-EL");
4806
4807 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
4808 options::OPT_fpic, options::OPT_fno_pic,
4809 options::OPT_fPIE, options::OPT_fno_PIE,
4810 options::OPT_fpie, options::OPT_fno_pie);
4811 if (LastPICArg &&
4812 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
4813 LastPICArg->getOption().matches(options::OPT_fpic) ||
4814 LastPICArg->getOption().matches(options::OPT_fPIE) ||
4815 LastPICArg->getOption().matches(options::OPT_fpie))) {
4816 CmdArgs.push_back("-KPIC");
4817 }
4818 }
Eric Christopher0b26a612010-03-02 02:41:08 +00004819
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004820 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4821 options::OPT_Xassembler);
4822
4823 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004824 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004825
4826 for (InputInfoList::const_iterator
4827 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4828 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004829 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004830 }
4831
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004832 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004833 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004834 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004835}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004836
4837void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004838 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004839 const InputInfoList &Inputs,
4840 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004841 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00004842 const toolchains::FreeBSD& ToolChain =
4843 static_cast<const toolchains::FreeBSD&>(getToolChain());
4844 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004845 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00004846
4847 // Silence warning for "clang -g foo.o -o foo"
4848 Args.ClaimAllArgs(options::OPT_g_Group);
4849 // and "clang -emit-llvm foo.o -o foo"
4850 Args.ClaimAllArgs(options::OPT_emit_llvm);
4851 // and for "clang -w foo.o -o foo". Other warning options are already
4852 // handled somewhere else.
4853 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004854
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00004855 if (!D.SysRoot.empty())
4856 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
4857
Roman Divackyafe2f232012-08-28 15:09:03 +00004858 if (Args.hasArg(options::OPT_pie))
4859 CmdArgs.push_back("-pie");
4860
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004861 if (Args.hasArg(options::OPT_static)) {
4862 CmdArgs.push_back("-Bstatic");
4863 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004864 if (Args.hasArg(options::OPT_rdynamic))
4865 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004866 CmdArgs.push_back("--eh-frame-hdr");
4867 if (Args.hasArg(options::OPT_shared)) {
4868 CmdArgs.push_back("-Bshareable");
4869 } else {
4870 CmdArgs.push_back("-dynamic-linker");
4871 CmdArgs.push_back("/libexec/ld-elf.so.1");
4872 }
Roman Divackyafe2f232012-08-28 15:09:03 +00004873 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
4874 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00004875 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
4876 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
4877 CmdArgs.push_back("--hash-style=both");
4878 }
4879 }
4880 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004881 }
4882
4883 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4884 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004885 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004886 CmdArgs.push_back("-m");
4887 CmdArgs.push_back("elf_i386_fbsd");
4888 }
4889
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004890 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00004891 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00004892 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00004893 }
4894
Daniel Dunbarb440f562010-08-02 02:38:21 +00004895 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004896 CmdArgs.push_back("-o");
4897 CmdArgs.push_back(Output.getFilename());
4898 } else {
4899 assert(Output.isNothing() && "Invalid output.");
4900 }
4901
4902 if (!Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00004904 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004905 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00004906 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00004907 crt1 = "gcrt1.o";
4908 else if (Args.hasArg(options::OPT_pie))
4909 crt1 = "Scrt1.o";
4910 else
4911 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004912 }
Roman Divackyafe2f232012-08-28 15:09:03 +00004913 if (crt1)
4914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
4915
4916 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
4917
4918 const char *crtbegin = NULL;
4919 if (Args.hasArg(options::OPT_static))
4920 crtbegin = "crtbeginT.o";
4921 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
4922 crtbegin = "crtbeginS.o";
4923 else
4924 crtbegin = "crtbegin.o";
4925
4926 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004927 }
4928
4929 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00004930 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00004931 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
4932 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004933 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004934 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4935 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00004936 Args.AddAllArgs(CmdArgs, options::OPT_s);
4937 Args.AddAllArgs(CmdArgs, options::OPT_t);
4938 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4939 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004940
Roman Divackyafe2f232012-08-28 15:09:03 +00004941 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004942
4943 if (!Args.hasArg(options::OPT_nostdlib) &&
4944 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00004945 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00004946 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00004947 if (Args.hasArg(options::OPT_pg))
4948 CmdArgs.push_back("-lm_p");
4949 else
4950 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00004951 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004952 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
4953 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00004954 if (Args.hasArg(options::OPT_pg))
4955 CmdArgs.push_back("-lgcc_p");
4956 else
4957 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004958 if (Args.hasArg(options::OPT_static)) {
4959 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00004960 } else if (Args.hasArg(options::OPT_pg)) {
4961 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004962 } else {
4963 CmdArgs.push_back("--as-needed");
4964 CmdArgs.push_back("-lgcc_s");
4965 CmdArgs.push_back("--no-as-needed");
4966 }
4967
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00004968 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00004969 if (Args.hasArg(options::OPT_pg))
4970 CmdArgs.push_back("-lpthread_p");
4971 else
4972 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00004973 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004974
Roman Divacky66f22762011-02-10 16:59:40 +00004975 if (Args.hasArg(options::OPT_pg)) {
4976 if (Args.hasArg(options::OPT_shared))
4977 CmdArgs.push_back("-lc");
4978 else
4979 CmdArgs.push_back("-lc_p");
4980 CmdArgs.push_back("-lgcc_p");
4981 } else {
4982 CmdArgs.push_back("-lc");
4983 CmdArgs.push_back("-lgcc");
4984 }
4985
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004986 if (Args.hasArg(options::OPT_static)) {
4987 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00004988 } else if (Args.hasArg(options::OPT_pg)) {
4989 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004990 } else {
4991 CmdArgs.push_back("--as-needed");
4992 CmdArgs.push_back("-lgcc_s");
4993 CmdArgs.push_back("--no-as-needed");
4994 }
4995 }
4996
4997 if (!Args.hasArg(options::OPT_nostdlib) &&
4998 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00004999 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005000 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005001 else
5002 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005003 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005004 }
5005
Roman Divackyafe2f232012-08-28 15:09:03 +00005006 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005007
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005008 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005009 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005010 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005011}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005012
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005013void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5014 const InputInfo &Output,
5015 const InputInfoList &Inputs,
5016 const ArgList &Args,
5017 const char *LinkingOutput) const {
5018 ArgStringList CmdArgs;
5019
5020 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5021 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005022 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005023 CmdArgs.push_back("--32");
5024
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005025 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005026 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005027 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005028 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005029 CmdArgs.push_back("-EL");
5030
5031 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5032 options::OPT_Xassembler);
5033
5034 CmdArgs.push_back("-o");
5035 CmdArgs.push_back(Output.getFilename());
5036
5037 for (InputInfoList::const_iterator
5038 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5039 const InputInfo &II = *it;
5040 CmdArgs.push_back(II.getFilename());
5041 }
5042
David Chisnallddbd68f2011-09-27 22:03:18 +00005043 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005044 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5045}
5046
5047void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5048 const InputInfo &Output,
5049 const InputInfoList &Inputs,
5050 const ArgList &Args,
5051 const char *LinkingOutput) const {
5052 const Driver &D = getToolChain().getDriver();
5053 ArgStringList CmdArgs;
5054
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005055 if (!D.SysRoot.empty())
5056 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5057
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005058 if (Args.hasArg(options::OPT_static)) {
5059 CmdArgs.push_back("-Bstatic");
5060 } else {
5061 if (Args.hasArg(options::OPT_rdynamic))
5062 CmdArgs.push_back("-export-dynamic");
5063 CmdArgs.push_back("--eh-frame-hdr");
5064 if (Args.hasArg(options::OPT_shared)) {
5065 CmdArgs.push_back("-Bshareable");
5066 } else {
5067 CmdArgs.push_back("-dynamic-linker");
5068 CmdArgs.push_back("/libexec/ld.elf_so");
5069 }
5070 }
5071
5072 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5073 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005074 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005075 CmdArgs.push_back("-m");
5076 CmdArgs.push_back("elf_i386");
5077 }
5078
5079 if (Output.isFilename()) {
5080 CmdArgs.push_back("-o");
5081 CmdArgs.push_back(Output.getFilename());
5082 } else {
5083 assert(Output.isNothing() && "Invalid output.");
5084 }
5085
5086 if (!Args.hasArg(options::OPT_nostdlib) &&
5087 !Args.hasArg(options::OPT_nostartfiles)) {
5088 if (!Args.hasArg(options::OPT_shared)) {
5089 CmdArgs.push_back(Args.MakeArgString(
5090 getToolChain().GetFilePath("crt0.o")));
5091 CmdArgs.push_back(Args.MakeArgString(
5092 getToolChain().GetFilePath("crti.o")));
5093 CmdArgs.push_back(Args.MakeArgString(
5094 getToolChain().GetFilePath("crtbegin.o")));
5095 } else {
5096 CmdArgs.push_back(Args.MakeArgString(
5097 getToolChain().GetFilePath("crti.o")));
5098 CmdArgs.push_back(Args.MakeArgString(
5099 getToolChain().GetFilePath("crtbeginS.o")));
5100 }
5101 }
5102
5103 Args.AddAllArgs(CmdArgs, options::OPT_L);
5104 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5105 Args.AddAllArgs(CmdArgs, options::OPT_e);
5106 Args.AddAllArgs(CmdArgs, options::OPT_s);
5107 Args.AddAllArgs(CmdArgs, options::OPT_t);
5108 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5109 Args.AddAllArgs(CmdArgs, options::OPT_r);
5110
5111 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5112
5113 if (!Args.hasArg(options::OPT_nostdlib) &&
5114 !Args.hasArg(options::OPT_nodefaultlibs)) {
5115 if (D.CCCIsCXX) {
5116 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5117 CmdArgs.push_back("-lm");
5118 }
5119 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5120 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005121 if (Args.hasArg(options::OPT_static)) {
5122 CmdArgs.push_back("-lgcc_eh");
5123 } else {
5124 CmdArgs.push_back("--as-needed");
5125 CmdArgs.push_back("-lgcc_s");
5126 CmdArgs.push_back("--no-as-needed");
5127 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005128 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005129
5130 if (Args.hasArg(options::OPT_pthread))
5131 CmdArgs.push_back("-lpthread");
5132 CmdArgs.push_back("-lc");
5133
5134 CmdArgs.push_back("-lgcc");
5135 if (Args.hasArg(options::OPT_static)) {
5136 CmdArgs.push_back("-lgcc_eh");
5137 } else {
5138 CmdArgs.push_back("--as-needed");
5139 CmdArgs.push_back("-lgcc_s");
5140 CmdArgs.push_back("--no-as-needed");
5141 }
5142 }
5143
5144 if (!Args.hasArg(options::OPT_nostdlib) &&
5145 !Args.hasArg(options::OPT_nostartfiles)) {
5146 if (!Args.hasArg(options::OPT_shared))
5147 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5148 "crtend.o")));
5149 else
5150 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5151 "crtendS.o")));
5152 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5153 "crtn.o")));
5154 }
5155
Bill Wendling08760582011-06-27 19:15:03 +00005156 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005157
David Chisnallddbd68f2011-09-27 22:03:18 +00005158 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005159 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5160}
5161
Rafael Espindola92b00932010-08-10 00:25:48 +00005162void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5163 const InputInfo &Output,
5164 const InputInfoList &Inputs,
5165 const ArgList &Args,
5166 const char *LinkingOutput) const {
5167 ArgStringList CmdArgs;
5168
5169 // Add --32/--64 to make sure we get the format we want.
5170 // This is incomplete
5171 if (getToolChain().getArch() == llvm::Triple::x86) {
5172 CmdArgs.push_back("--32");
5173 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5174 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005175 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5176 CmdArgs.push_back("-a32");
5177 CmdArgs.push_back("-mppc");
5178 CmdArgs.push_back("-many");
5179 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5180 CmdArgs.push_back("-a64");
5181 CmdArgs.push_back("-mppc64");
5182 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005183 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005184 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005185 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5186 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005187
5188 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5189 getToolChain().getTriple());
5190 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005191
5192 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5193 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5194 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005195 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5196 getToolChain().getArch() == llvm::Triple::mipsel ||
5197 getToolChain().getArch() == llvm::Triple::mips64 ||
5198 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005199 StringRef CPUName;
5200 StringRef ABIName;
5201 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005202
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005203 CmdArgs.push_back("-march");
5204 CmdArgs.push_back(CPUName.data());
5205
5206 // Convert ABI name to the GNU tools acceptable variant.
5207 if (ABIName == "o32")
5208 ABIName = "32";
5209 else if (ABIName == "n64")
5210 ABIName = "64";
5211
5212 CmdArgs.push_back("-mabi");
5213 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005214
5215 if (getToolChain().getArch() == llvm::Triple::mips ||
5216 getToolChain().getArch() == llvm::Triple::mips64)
5217 CmdArgs.push_back("-EB");
5218 else
5219 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005220
5221 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5222 options::OPT_fpic, options::OPT_fno_pic,
5223 options::OPT_fPIE, options::OPT_fno_PIE,
5224 options::OPT_fpie, options::OPT_fno_pie);
5225 if (LastPICArg &&
5226 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5227 LastPICArg->getOption().matches(options::OPT_fpic) ||
5228 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5229 LastPICArg->getOption().matches(options::OPT_fpie))) {
5230 CmdArgs.push_back("-KPIC");
5231 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005232 }
5233
5234 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5235 options::OPT_Xassembler);
5236
5237 CmdArgs.push_back("-o");
5238 CmdArgs.push_back(Output.getFilename());
5239
5240 for (InputInfoList::const_iterator
5241 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5242 const InputInfo &II = *it;
5243 CmdArgs.push_back(II.getFilename());
5244 }
5245
5246 const char *Exec =
5247 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5248 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5249}
5250
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005251static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5252 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005253 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Logan Chien3d3373c2012-11-19 12:04:11 +00005254 bool StaticLibgcc = Args.hasArg(options::OPT_static) ||
5255 Args.hasArg(options::OPT_static_libgcc);
Rafael Espindolacc354322011-10-17 21:39:04 +00005256 if (!D.CCCIsCXX)
5257 CmdArgs.push_back("-lgcc");
5258
Logan Chien3d3373c2012-11-19 12:04:11 +00005259 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005260 if (D.CCCIsCXX)
5261 CmdArgs.push_back("-lgcc");
5262 } else {
5263 if (!D.CCCIsCXX)
5264 CmdArgs.push_back("--as-needed");
5265 CmdArgs.push_back("-lgcc_s");
5266 if (!D.CCCIsCXX)
5267 CmdArgs.push_back("--no-as-needed");
5268 }
5269
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005270 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005271 CmdArgs.push_back("-lgcc_eh");
5272 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5273 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005274
5275 // According to Android ABI, we have to link with libdl if we are
5276 // linking with non-static libgcc.
5277 //
5278 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5279 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5280 if (isAndroid && !StaticLibgcc)
5281 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005282}
5283
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005284static bool hasMipsN32ABIArg(const ArgList &Args) {
5285 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005286 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005287}
5288
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005289void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5290 const InputInfo &Output,
5291 const InputInfoList &Inputs,
5292 const ArgList &Args,
5293 const char *LinkingOutput) const {
5294 const toolchains::Linux& ToolChain =
5295 static_cast<const toolchains::Linux&>(getToolChain());
5296 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005297 const bool isAndroid =
5298 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005299
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005300 ArgStringList CmdArgs;
5301
Rafael Espindolad1002f62010-11-15 18:28:16 +00005302 // Silence warning for "clang -g foo.o -o foo"
5303 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005304 // and "clang -emit-llvm foo.o -o foo"
5305 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005306 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005307 // handled somewhere else.
5308 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005309
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005310 if (!D.SysRoot.empty())
5311 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005312
Rafael Espindolad47ac232010-11-17 22:26:15 +00005313 if (Args.hasArg(options::OPT_pie))
5314 CmdArgs.push_back("-pie");
5315
Rafael Espindola1c76c592010-11-07 22:57:16 +00005316 if (Args.hasArg(options::OPT_rdynamic))
5317 CmdArgs.push_back("-export-dynamic");
5318
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005319 if (Args.hasArg(options::OPT_s))
5320 CmdArgs.push_back("-s");
5321
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005322 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5323 e = ToolChain.ExtraOpts.end();
5324 i != e; ++i)
5325 CmdArgs.push_back(i->c_str());
5326
5327 if (!Args.hasArg(options::OPT_static)) {
5328 CmdArgs.push_back("--eh-frame-hdr");
5329 }
5330
5331 CmdArgs.push_back("-m");
5332 if (ToolChain.getArch() == llvm::Triple::x86)
5333 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005334 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005335 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005336 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005337 else if (ToolChain.getArch() == llvm::Triple::ppc)
5338 CmdArgs.push_back("elf32ppclinux");
5339 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5340 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005341 else if (ToolChain.getArch() == llvm::Triple::mips)
5342 CmdArgs.push_back("elf32btsmip");
5343 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5344 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005345 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5346 if (hasMipsN32ABIArg(Args))
5347 CmdArgs.push_back("elf32btsmipn32");
5348 else
5349 CmdArgs.push_back("elf64btsmip");
5350 }
5351 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5352 if (hasMipsN32ABIArg(Args))
5353 CmdArgs.push_back("elf32ltsmipn32");
5354 else
5355 CmdArgs.push_back("elf64ltsmip");
5356 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005357 else
5358 CmdArgs.push_back("elf_x86_64");
5359
5360 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005361 if (ToolChain.getArch() == llvm::Triple::arm
5362 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005363 CmdArgs.push_back("-Bstatic");
5364 else
5365 CmdArgs.push_back("-static");
5366 } else if (Args.hasArg(options::OPT_shared)) {
5367 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005368 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005369 CmdArgs.push_back("-Bsymbolic");
5370 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005371 }
5372
5373 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005374 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005375 (!Args.hasArg(options::OPT_static) &&
5376 !Args.hasArg(options::OPT_shared))) {
5377 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005378 if (isAndroid)
5379 CmdArgs.push_back("/system/bin/linker");
5380 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005381 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005382 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005383 ToolChain.getArch() == llvm::Triple::thumb) {
5384 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5385 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5386 else
5387 CmdArgs.push_back("/lib/ld-linux.so.3");
5388 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005389 else if (ToolChain.getArch() == llvm::Triple::mips ||
5390 ToolChain.getArch() == llvm::Triple::mipsel)
5391 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005392 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005393 ToolChain.getArch() == llvm::Triple::mips64el) {
5394 if (hasMipsN32ABIArg(Args))
5395 CmdArgs.push_back("/lib32/ld.so.1");
5396 else
5397 CmdArgs.push_back("/lib64/ld.so.1");
5398 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005399 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005400 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005401 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005402 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005403 else
5404 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5405 }
5406
5407 CmdArgs.push_back("-o");
5408 CmdArgs.push_back(Output.getFilename());
5409
Rafael Espindola81937ec2010-12-01 01:52:43 +00005410 if (!Args.hasArg(options::OPT_nostdlib) &&
5411 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005412 if (!isAndroid) {
5413 const char *crt1 = NULL;
5414 if (!Args.hasArg(options::OPT_shared)){
5415 if (Args.hasArg(options::OPT_pie))
5416 crt1 = "Scrt1.o";
5417 else
5418 crt1 = "crt1.o";
5419 }
5420 if (crt1)
5421 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005422
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005423 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5424 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005425
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005426 const char *crtbegin;
5427 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005428 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005429 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005430 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005431 else if (Args.hasArg(options::OPT_pie))
5432 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005433 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005434 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005435 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005436
5437 // Add crtfastmath.o if available and fast math is enabled.
5438 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005439 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005440
5441 Args.AddAllArgs(CmdArgs, options::OPT_L);
5442
5443 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5444
Roman Divackyee8188a2011-03-01 17:53:14 +00005445 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5446 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005447 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005448
Rafael Espindola9446d762012-04-09 23:53:34 +00005449 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5450 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5451 // forward.
5452 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5453 CmdArgs.push_back("-plugin");
5454 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5455 CmdArgs.push_back(Args.MakeArgString(Plugin));
5456 }
5457
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005458 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5459 CmdArgs.push_back("--no-demangle");
5460
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005461 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5462
Alexey Samsonov627b10f2012-11-06 15:09:03 +00005463 SanitizerArgs Sanitize(D, Args);
Richard Smith52be6192012-11-05 22:04:41 +00005464
Richard Smith4d3110a2012-10-25 02:14:12 +00005465 // Call this before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00005466 if (Sanitize.needsUbsanRt())
5467 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00005468
Chandler Carruth94a32012012-05-14 18:31:18 +00005469 if (D.CCCIsCXX &&
5470 !Args.hasArg(options::OPT_nostdlib) &&
5471 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005472 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5473 !Args.hasArg(options::OPT_static);
5474 if (OnlyLibstdcxxStatic)
5475 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005476 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005477 if (OnlyLibstdcxxStatic)
5478 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005479 CmdArgs.push_back("-lm");
5480 }
5481
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005482 // Call this before we add the C run-time.
Richard Smith52be6192012-11-05 22:04:41 +00005483 if (Sanitize.needsAsanRt())
5484 addAsanRTLinux(getToolChain(), Args, CmdArgs);
5485 if (Sanitize.needsTsanRt())
5486 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005487
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005488 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005489 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5490 if (Args.hasArg(options::OPT_static))
5491 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005492
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005493 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005494
Chandler Carruth94a32012012-05-14 18:31:18 +00005495 if (Args.hasArg(options::OPT_pthread) ||
5496 Args.hasArg(options::OPT_pthreads))
5497 CmdArgs.push_back("-lpthread");
5498
5499 CmdArgs.push_back("-lc");
5500
5501 if (Args.hasArg(options::OPT_static))
5502 CmdArgs.push_back("--end-group");
5503 else
5504 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5505 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005506
Rafael Espindola81937ec2010-12-01 01:52:43 +00005507 if (!Args.hasArg(options::OPT_nostartfiles)) {
5508 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005509 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005510 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005511 else if (Args.hasArg(options::OPT_pie))
5512 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005513 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005514 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005515
Rafael Espindola81937ec2010-12-01 01:52:43 +00005516 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005517 if (!isAndroid)
5518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005519 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005520 }
5521
Bill Wendling08760582011-06-27 19:15:03 +00005522 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005523
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005524 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5525}
Rafael Espindola92b00932010-08-10 00:25:48 +00005526
Chris Lattner3e2ee142010-07-07 16:01:42 +00005527void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005528 const InputInfo &Output,
5529 const InputInfoList &Inputs,
5530 const ArgList &Args,
5531 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005532 ArgStringList CmdArgs;
5533
5534 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5535 options::OPT_Xassembler);
5536
5537 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005538 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005539
5540 for (InputInfoList::const_iterator
5541 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5542 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005543 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005544 }
5545
5546 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005547 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005548 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005549}
5550
5551void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005552 const InputInfo &Output,
5553 const InputInfoList &Inputs,
5554 const ArgList &Args,
5555 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005556 const Driver &D = getToolChain().getDriver();
5557 ArgStringList CmdArgs;
5558
Daniel Dunbarb440f562010-08-02 02:38:21 +00005559 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005560 CmdArgs.push_back("-o");
5561 CmdArgs.push_back(Output.getFilename());
5562 } else {
5563 assert(Output.isNothing() && "Invalid output.");
5564 }
5565
5566 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005567 !Args.hasArg(options::OPT_nostartfiles)) {
5568 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5569 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5570 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5571 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5572 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005573
5574 Args.AddAllArgs(CmdArgs, options::OPT_L);
5575 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5576 Args.AddAllArgs(CmdArgs, options::OPT_e);
5577
Daniel Dunbar54423b22010-09-17 00:24:54 +00005578 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005579
Eli Friedman83de5132011-12-08 23:54:21 +00005580 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5581
Chris Lattner3e2ee142010-07-07 16:01:42 +00005582 if (!Args.hasArg(options::OPT_nostdlib) &&
5583 !Args.hasArg(options::OPT_nodefaultlibs)) {
5584 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005585 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005586 CmdArgs.push_back("-lm");
5587 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005588 }
5589
5590 if (!Args.hasArg(options::OPT_nostdlib) &&
5591 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005592 if (Args.hasArg(options::OPT_pthread))
5593 CmdArgs.push_back("-lpthread");
5594 CmdArgs.push_back("-lc");
5595 CmdArgs.push_back("-lCompilerRT-Generic");
5596 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5597 CmdArgs.push_back(
5598 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005599 }
5600
Eli Friedman83de5132011-12-08 23:54:21 +00005601 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005602 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005603}
5604
Daniel Dunbarcc912342009-05-02 18:28:39 +00005605/// DragonFly Tools
5606
5607// For now, DragonFly Assemble does just about the same as for
5608// FreeBSD, but this may change soon.
5609void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005610 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005611 const InputInfoList &Inputs,
5612 const ArgList &Args,
5613 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005614 ArgStringList CmdArgs;
5615
5616 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5617 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005618 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00005619 CmdArgs.push_back("--32");
5620
5621 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5622 options::OPT_Xassembler);
5623
5624 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005625 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005626
5627 for (InputInfoList::const_iterator
5628 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5629 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005630 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005631 }
5632
5633 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005634 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005635 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005636}
5637
5638void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005639 const InputInfo &Output,
5640 const InputInfoList &Inputs,
5641 const ArgList &Args,
5642 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005643 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005644 ArgStringList CmdArgs;
5645
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005646 if (!D.SysRoot.empty())
5647 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5648
Daniel Dunbarcc912342009-05-02 18:28:39 +00005649 if (Args.hasArg(options::OPT_static)) {
5650 CmdArgs.push_back("-Bstatic");
5651 } else {
5652 if (Args.hasArg(options::OPT_shared))
5653 CmdArgs.push_back("-Bshareable");
5654 else {
5655 CmdArgs.push_back("-dynamic-linker");
5656 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5657 }
5658 }
5659
5660 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5661 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005662 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005663 CmdArgs.push_back("-m");
5664 CmdArgs.push_back("elf_i386");
5665 }
5666
Daniel Dunbarb440f562010-08-02 02:38:21 +00005667 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005668 CmdArgs.push_back("-o");
5669 CmdArgs.push_back(Output.getFilename());
5670 } else {
5671 assert(Output.isNothing() && "Invalid output.");
5672 }
5673
5674 if (!Args.hasArg(options::OPT_nostdlib) &&
5675 !Args.hasArg(options::OPT_nostartfiles)) {
5676 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005677 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005678 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005679 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005680 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005681 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005682 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005683 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005684 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005685 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005686 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005687 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005688 }
5689 }
5690
5691 Args.AddAllArgs(CmdArgs, options::OPT_L);
5692 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5693 Args.AddAllArgs(CmdArgs, options::OPT_e);
5694
Daniel Dunbar54423b22010-09-17 00:24:54 +00005695 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00005696
5697 if (!Args.hasArg(options::OPT_nostdlib) &&
5698 !Args.hasArg(options::OPT_nodefaultlibs)) {
5699 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5700 // rpaths
5701 CmdArgs.push_back("-L/usr/lib/gcc41");
5702
5703 if (!Args.hasArg(options::OPT_static)) {
5704 CmdArgs.push_back("-rpath");
5705 CmdArgs.push_back("/usr/lib/gcc41");
5706
5707 CmdArgs.push_back("-rpath-link");
5708 CmdArgs.push_back("/usr/lib/gcc41");
5709
5710 CmdArgs.push_back("-rpath");
5711 CmdArgs.push_back("/usr/lib");
5712
5713 CmdArgs.push_back("-rpath-link");
5714 CmdArgs.push_back("/usr/lib");
5715 }
5716
Rafael Espindola38360b32010-07-20 12:59:03 +00005717 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005718 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00005719 CmdArgs.push_back("-lm");
5720 }
5721
Daniel Dunbarcc912342009-05-02 18:28:39 +00005722 if (Args.hasArg(options::OPT_shared)) {
5723 CmdArgs.push_back("-lgcc_pic");
5724 } else {
5725 CmdArgs.push_back("-lgcc");
5726 }
5727
5728
5729 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00005730 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00005731
5732 if (!Args.hasArg(options::OPT_nolibc)) {
5733 CmdArgs.push_back("-lc");
5734 }
5735
5736 if (Args.hasArg(options::OPT_shared)) {
5737 CmdArgs.push_back("-lgcc_pic");
5738 } else {
5739 CmdArgs.push_back("-lgcc");
5740 }
5741 }
5742
5743 if (!Args.hasArg(options::OPT_nostdlib) &&
5744 !Args.hasArg(options::OPT_nostartfiles)) {
5745 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005746 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005747 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005748 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005749 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005750 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005751 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005752 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005753 }
5754
Bill Wendling08760582011-06-27 19:15:03 +00005755 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005756
Daniel Dunbarcc912342009-05-02 18:28:39 +00005757 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005758 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005759 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005760}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005761
5762void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
5763 const InputInfo &Output,
5764 const InputInfoList &Inputs,
5765 const ArgList &Args,
5766 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005767 ArgStringList CmdArgs;
5768
5769 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00005770 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
5771 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005772 } else {
5773 assert(Output.isNothing() && "Invalid output.");
5774 }
5775
5776 if (!Args.hasArg(options::OPT_nostdlib) &&
5777 !Args.hasArg(options::OPT_nostartfiles)) {
5778 CmdArgs.push_back("-defaultlib:libcmt");
5779 }
5780
5781 CmdArgs.push_back("-nologo");
5782
Michael J. Spencere2f49362012-06-18 16:56:04 +00005783 Args.AddAllArgValues(CmdArgs, options::OPT_l);
5784
5785 // Add filenames immediately.
5786 for (InputInfoList::const_iterator
5787 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5788 if (it->isFilename())
5789 CmdArgs.push_back(it->getFilename());
5790 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005791
5792 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00005793 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005794 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5795}