blob: c7053e84fa94ccd5ade3c2a4bd9d250c4de5bbce [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
12#include "SanitizerArgs.h"
13#include "ToolChains.h"
14#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000025#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000026#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000027#include "llvm/Option/Arg.h"
28#include "llvm/Option/ArgList.h"
29#include "llvm/Option/Option.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000032#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000033#include "llvm/Support/Host.h"
34#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000036#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000037
Daniel Dunbar1a093d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000041using namespace llvm::opt;
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,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000233 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000234 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000235 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000236 ArgStringList &CmdArgs,
237 const InputInfo &Output,
238 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000239 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000240
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000241 CheckPreprocessingOptions(D, Args);
242
243 Args.AddLastArg(CmdArgs, options::OPT_C);
244 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000245
246 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000247 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000248 (A = Args.getLastArg(options::OPT_MD)) ||
249 (A = Args.getLastArg(options::OPT_MMD))) {
250 // Determine the output location.
251 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000252 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000253 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000254 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000255 } else if (Output.getType() == types::TY_Dependencies) {
256 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000257 } else if (A->getOption().matches(options::OPT_M) ||
258 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 DepFile = "-";
260 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000261 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000262 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 }
264 CmdArgs.push_back("-dependency-file");
265 CmdArgs.push_back(DepFile);
266
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000267 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000268 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
269 const char *DepTarget;
270
271 // If user provided -o, that is the dependency target, except
272 // when we are only generating a dependency file.
273 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
274 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000275 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000276 } else {
277 // Otherwise derive from the base input.
278 //
279 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000280 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000281 llvm::sys::path::replace_extension(P, "o");
282 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000283 }
284
285 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000286 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000287 QuoteTarget(DepTarget, Quoted);
288 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 }
290
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000291 if (A->getOption().matches(options::OPT_M) ||
292 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 CmdArgs.push_back("-sys-header-deps");
294 }
295
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000296 if (Args.hasArg(options::OPT_MG)) {
297 if (!A || A->getOption().matches(options::OPT_MD) ||
298 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000299 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000300 CmdArgs.push_back("-MG");
301 }
302
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000304
305 // Convert all -MQ <target> args to -MT <quoted target>
306 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
307 options::OPT_MQ),
308 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000309 const Arg *A = *it;
310 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311
Daniel Dunbara442fd52010-06-11 22:00:13 +0000312 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000313 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000314 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000315 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000316 CmdArgs.push_back(Args.MakeArgString(Quoted));
317
318 // -MT flag - no change
319 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000320 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000321 }
322 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323
Douglas Gregor111af7d2009-04-18 00:34:01 +0000324 // Add -i* options, and automatically translate to
325 // -include-pch/-include-pth for transparent PCH support. It's
326 // wonky, but we include looking for .gch so we can support seamless
327 // replacement into a build system already set up to be generating
328 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000329 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000330 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
331 ie = Args.filtered_end(); it != ie; ++it) {
332 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333
334 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000335 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
336 RenderedImplicitInclude = true;
337
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000338 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000339 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000340
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000342 bool FoundPCH = false;
Richard Smithbd55daf2012-11-01 04:30:05 +0000343 llvm::sys::Path P(A->getValue());
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000344 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000345 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000346 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000347 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000348 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000349 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000350 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 }
352
Douglas Gregor111af7d2009-04-18 00:34:01 +0000353 if (!FoundPCH) {
354 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000355 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000356 FoundPTH = true;
357 else
358 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000359 }
360
Douglas Gregor111af7d2009-04-18 00:34:01 +0000361 if (!FoundPCH && !FoundPTH) {
362 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000363 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000364 FoundPCH = UsePCH;
365 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 }
Mike Stump11289f42009-09-09 15:08:12 +0000367 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 P.eraseSuffix();
369 }
370
371 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000372 if (IsFirstImplicitInclude) {
373 A->claim();
374 if (UsePCH)
375 CmdArgs.push_back("-include-pch");
376 else
377 CmdArgs.push_back("-include-pth");
378 CmdArgs.push_back(Args.MakeArgString(P.str()));
379 continue;
380 } else {
381 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000382 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000383 << P.str() << A->getAsString(Args);
384 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000385 }
386 }
387
388 // Not translated, render as usual.
389 A->claim();
390 A->render(Args, CmdArgs);
391 }
392
393 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000394 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
395 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000396
397 // Add -Wp, and -Xassembler if using the preprocessor.
398
399 // FIXME: There is a very unfortunate problem here, some troubled
400 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
401 // really support that we would have to parse and then translate
402 // those options. :(
403 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
404 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000405
406 // -I- is a deprecated GCC feature, reject it.
407 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000408 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000409
410 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
411 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000412 StringRef sysroot = C.getSysRoot();
413 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000414 if (!Args.hasArg(options::OPT_isysroot)) {
415 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000416 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417 }
418 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000419
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000420 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000421 // FIXME: We should probably sink the logic for handling these from the
422 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000423 // CPATH - included following the user specified includes (but prior to
424 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000426 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000434
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000435 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000436 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000437 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000438
439 // Add system include arguments.
440 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000441}
442
Daniel Dunbarf492c922009-09-10 22:59:51 +0000443/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000444/// CPU.
445//
446// FIXME: This is redundant with -mcpu, why does LLVM use this.
447// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000448static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000449 return llvm::StringSwitch<const char *>(CPU)
Tim Northover92509c12013-06-13 15:02:46 +0000450 .Case("strongarm", "v4")
Chad Rosier9ac84512011-10-07 17:48:56 +0000451 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
452 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
453 .Cases("arm920", "arm920t", "arm922t", "v4t")
454 .Cases("arm940t", "ep9312","v4t")
455 .Cases("arm10tdmi", "arm1020t", "v5")
456 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
457 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
458 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
459 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
460 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
461 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000462 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
463 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000464 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000465 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000466 .Case("cortex-m3", "v7m")
467 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000468 .Case("cortex-a9-mp", "v7f")
469 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000470 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000471}
472
Benjamin Kramer09811c72012-06-26 22:20:06 +0000473/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
474//
475// FIXME: tblgen this.
476static std::string getARMTargetCPU(const ArgList &Args,
477 const llvm::Triple &Triple) {
478 // FIXME: Warn on inconsistent use of -mcpu and -march.
479
480 // If we have -mcpu=, use that.
481 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000482 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000483 // Handle -mcpu=native.
484 if (MCPU == "native")
485 return llvm::sys::getHostCPUName();
486 else
487 return MCPU;
488 }
489
490 StringRef MArch;
491 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
492 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000493 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000494 } else {
495 // Otherwise, use the Arch from the triple.
496 MArch = Triple.getArchName();
497 }
498
499 // Handle -march=native.
500 std::string NativeMArch;
501 if (MArch == "native") {
502 std::string CPU = llvm::sys::getHostCPUName();
503 if (CPU != "generic") {
504 // Translate the native cpu into the architecture. The switch below will
505 // then chose the minimum cpu for that arch.
506 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
507 MArch = NativeMArch;
508 }
509 }
510
511 return llvm::StringSwitch<const char *>(MArch)
512 .Cases("armv2", "armv2a","arm2")
513 .Case("armv3", "arm6")
514 .Case("armv3m", "arm7m")
Tim Northover92509c12013-06-13 15:02:46 +0000515 .Case("armv4", "strongarm")
516 .Case("armv4t", "arm7tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000517 .Cases("armv5", "armv5t", "arm10tdmi")
518 .Cases("armv5e", "armv5te", "arm1022e")
519 .Case("armv5tej", "arm926ej-s")
520 .Cases("armv6", "armv6k", "arm1136jf-s")
521 .Case("armv6j", "arm1136j-s")
522 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
523 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000524 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000525 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000526 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000527 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
528 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000529 .Cases("armv7r", "armv7-r", "cortex-r4")
530 .Cases("armv7m", "armv7-m", "cortex-m3")
531 .Case("ep9312", "ep9312")
532 .Case("iwmmxt", "iwmmxt")
533 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000534 // If all else failed, return the most base CPU with thumb interworking
535 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000536 .Default("arm7tdmi");
537}
538
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000539// FIXME: Move to target hook.
540static bool isSignedCharDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return true;
544
Tim Northover9bb857a2013-01-31 12:13:10 +0000545 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000546 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000547 case llvm::Triple::ppc:
548 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000549 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000550 return true;
551 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000552
553 case llvm::Triple::systemz:
554 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000555 }
556}
557
Chad Rosiercfbfc582012-04-04 20:51:35 +0000558// Handle -mfpu=.
559//
560// FIXME: Centralize feature selection, defaulting shouldn't be also in the
561// frontend target.
562static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
563 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000564 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000565
566 // Set the target features based on the FPU.
567 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
568 // Disable any default FPU support.
569 CmdArgs.push_back("-target-feature");
570 CmdArgs.push_back("-vfp2");
571 CmdArgs.push_back("-target-feature");
572 CmdArgs.push_back("-vfp3");
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-neon");
575 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+vfp3");
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("+d16");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("-neon");
582 } else if (FPU == "vfp") {
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("+vfp2");
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neon");
587 } else if (FPU == "vfp3" || FPU == "vfpv3") {
588 CmdArgs.push_back("-target-feature");
589 CmdArgs.push_back("+vfp3");
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("-neon");
592 } else if (FPU == "neon") {
593 CmdArgs.push_back("-target-feature");
594 CmdArgs.push_back("+neon");
595 } else
596 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
597}
598
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000599// Handle -mfpmath=.
600static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000601 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000602 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000603
604 // Set the target features based on the FPMath.
605 if (FPMath == "neon") {
606 CmdArgs.push_back("-target-feature");
607 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000608
Bob Wilsonf643afc2013-03-04 22:37:46 +0000609 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
610 CPU != "cortex-a8" && CPU != "cortex-a9" &&
611 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000612 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
613
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000614 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
615 FPMath == "vfp4") {
616 CmdArgs.push_back("-target-feature");
617 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000618
619 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000620 } else
621 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
622}
623
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000624// Select the float ABI as determined by -msoft-float, -mhard-float, and
625// -mfloat-abi=.
626static StringRef getARMFloatABI(const Driver &D,
627 const ArgList &Args,
628 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000629 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000630 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
631 options::OPT_mhard_float,
632 options::OPT_mfloat_abi_EQ)) {
633 if (A->getOption().matches(options::OPT_msoft_float))
634 FloatABI = "soft";
635 else if (A->getOption().matches(options::OPT_mhard_float))
636 FloatABI = "hard";
637 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000638 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000640 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000641 << A->getAsString(Args);
642 FloatABI = "soft";
643 }
644 }
645 }
646
647 // If unspecified, choose the default based on the platform.
648 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000649 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000650 case llvm::Triple::Darwin:
651 case llvm::Triple::MacOSX:
652 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000653 // Darwin defaults to "softfp" for v6 and v7.
654 //
655 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000656 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000657 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000658 if (StringRef(ArchName).startswith("v6") ||
659 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000660 FloatABI = "softfp";
661 else
662 FloatABI = "soft";
663 break;
664 }
665
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000666 case llvm::Triple::FreeBSD:
667 // FreeBSD defaults to soft float
668 FloatABI = "soft";
669 break;
670
Daniel Dunbar78485922009-09-10 23:00:09 +0000671 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000672 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000673 case llvm::Triple::GNUEABIHF:
674 FloatABI = "hard";
675 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000676 case llvm::Triple::GNUEABI:
677 FloatABI = "softfp";
678 break;
679 case llvm::Triple::EABI:
680 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
681 FloatABI = "softfp";
682 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000683 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000684 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000685 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000686 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000687 FloatABI = "softfp";
688 else
689 FloatABI = "soft";
690 break;
691 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000692 default:
693 // Assume "soft", but warn the user we are guessing.
694 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000695 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000696 break;
697 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000698 }
699 }
700
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000701 return FloatABI;
702}
703
704
705void Clang::AddARMTargetArgs(const ArgList &Args,
706 ArgStringList &CmdArgs,
707 bool KernelOrKext) const {
708 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000709 // Get the effective triple, which takes into account the deployment target.
710 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
711 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000712 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000713
714 // Select the ABI to use.
715 //
716 // FIXME: Support -meabi.
717 const char *ABIName = 0;
718 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000719 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000720 } else if (Triple.isOSDarwin()) {
721 // The backend is hardwired to assume AAPCS for M-class processors, ensure
722 // the frontend matches that.
723 if (StringRef(CPUName).startswith("cortex-m")) {
724 ABIName = "aapcs";
725 } else {
726 ABIName = "apcs-gnu";
727 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000728 } else {
729 // Select the default based on the platform.
730 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000731 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000732 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000733 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000734 ABIName = "aapcs-linux";
735 break;
736 case llvm::Triple::EABI:
737 ABIName = "aapcs";
738 break;
739 default:
740 ABIName = "apcs-gnu";
741 }
742 }
743 CmdArgs.push_back("-target-abi");
744 CmdArgs.push_back(ABIName);
745
746 // Set the CPU based on -march= and -mcpu=.
747 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000748 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000749
750 // Determine floating point ABI from the options & target defaults.
751 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 if (FloatABI == "soft") {
753 // Floating point operations and argument passing are soft.
754 //
755 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000756 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000757 CmdArgs.push_back("-mfloat-abi");
758 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000759 } else if (FloatABI == "softfp") {
760 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000761 CmdArgs.push_back("-mfloat-abi");
762 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000763 } else {
764 // Floating point operations and argument passing are hard.
765 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000768 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000769
770 // Set appropriate target features for floating point mode.
771 //
772 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
773 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
774 // stripped out by the ARM target.
775
776 // Use software floating point operations?
777 if (FloatABI == "soft") {
778 CmdArgs.push_back("-target-feature");
779 CmdArgs.push_back("+soft-float");
780 }
781
782 // Use software floating point argument passing?
783 if (FloatABI != "hard") {
784 CmdArgs.push_back("-target-feature");
785 CmdArgs.push_back("+soft-float-abi");
786 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000787
788 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000789 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000790 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000791
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000792 // Honor -mfpmath=.
793 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000794 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000795
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000796 // Setting -msoft-float effectively disables NEON because of the GCC
797 // implementation, although the same isn't true of VFP or VFP3.
798 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000799 CmdArgs.push_back("-target-feature");
800 CmdArgs.push_back("-neon");
801 }
802
803 // Kernel code has more strict alignment requirements.
804 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000805 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
806 CmdArgs.push_back("-backend-option");
807 CmdArgs.push_back("-arm-long-calls");
808 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000809
Daniel Dunbar12100e22011-03-22 16:48:17 +0000810 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000811 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000812
813 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000814 CmdArgs.push_back("-backend-option");
815 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000816 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000817
818 // Setting -mno-global-merge disables the codegen global merge pass. Setting
819 // -mglobal-merge has no effect as the pass is enabled by default.
820 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
821 options::OPT_mno_global_merge)) {
822 if (A->getOption().matches(options::OPT_mno_global_merge))
823 CmdArgs.push_back("-mno-global-merge");
824 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000825
Bob Wilson9c8af452013-04-11 18:53:25 +0000826 if (!Args.hasFlag(options::OPT_mimplicit_float,
827 options::OPT_mno_implicit_float,
828 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000829 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000830}
831
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000832// Translate MIPS CPU name alias option to CPU name.
833static StringRef getMipsCPUFromAlias(const Arg &A) {
834 if (A.getOption().matches(options::OPT_mips32))
835 return "mips32";
836 if (A.getOption().matches(options::OPT_mips32r2))
837 return "mips32r2";
838 if (A.getOption().matches(options::OPT_mips64))
839 return "mips64";
840 if (A.getOption().matches(options::OPT_mips64r2))
841 return "mips64r2";
842 llvm_unreachable("Unexpected option");
843 return "";
844}
845
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000846// Get CPU and ABI names. They are not independent
847// so we have to calculate them together.
848static void getMipsCPUAndABI(const ArgList &Args,
849 const ToolChain &TC,
850 StringRef &CPUName,
851 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000852 const char *DefMips32CPU = "mips32";
853 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000854
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000855 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000856 options::OPT_mcpu_EQ,
857 options::OPT_mips_CPUs_Group)) {
858 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
859 CPUName = getMipsCPUFromAlias(*A);
860 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000861 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000862 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000863
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000864 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000865 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000866 // Convert a GNU style Mips ABI name to the name
867 // accepted by LLVM Mips backend.
868 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
869 .Case("32", "o32")
870 .Case("64", "n64")
871 .Default(ABIName);
872 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000873
874 // Setup default CPU and ABI names.
875 if (CPUName.empty() && ABIName.empty()) {
876 switch (TC.getTriple().getArch()) {
877 default:
878 llvm_unreachable("Unexpected triple arch name");
879 case llvm::Triple::mips:
880 case llvm::Triple::mipsel:
881 CPUName = DefMips32CPU;
882 break;
883 case llvm::Triple::mips64:
884 case llvm::Triple::mips64el:
885 CPUName = DefMips64CPU;
886 break;
887 }
888 }
889
890 if (!ABIName.empty()) {
891 // Deduce CPU name from ABI name.
892 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000893 .Cases("32", "o32", "eabi", DefMips32CPU)
894 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000895 .Default("");
896 }
897 else if (!CPUName.empty()) {
898 // Deduce ABI name from CPU name.
899 ABIName = llvm::StringSwitch<const char *>(CPUName)
900 .Cases("mips32", "mips32r2", "o32")
901 .Cases("mips64", "mips64r2", "n64")
902 .Default("");
903 }
904
905 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000906}
907
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000908// Convert ABI name to the GNU tools acceptable variant.
909static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
910 return llvm::StringSwitch<llvm::StringRef>(ABI)
911 .Case("o32", "32")
912 .Case("n64", "64")
913 .Default(ABI);
914}
915
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000916// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
917// and -mfloat-abi=.
918static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000919 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000920 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000921 options::OPT_mhard_float,
922 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000923 if (A->getOption().matches(options::OPT_msoft_float))
924 FloatABI = "soft";
925 else if (A->getOption().matches(options::OPT_mhard_float))
926 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000927 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000928 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000929 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000930 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000931 FloatABI = "hard";
932 }
933 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000934 }
935
936 // If unspecified, choose the default based on the platform.
937 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000938 // Assume "hard", because it's a default value used by gcc.
939 // When we start to recognize specific target MIPS processors,
940 // we will be able to select the default more correctly.
941 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000942 }
943
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000944 return FloatABI;
945}
946
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000947static void AddTargetFeature(const ArgList &Args,
948 ArgStringList &CmdArgs,
949 OptSpecifier OnOpt,
950 OptSpecifier OffOpt,
951 StringRef FeatureName) {
952 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
953 CmdArgs.push_back("-target-feature");
954 if (A->getOption().matches(OnOpt))
955 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
956 else
957 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
958 }
959}
960
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000961void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000962 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000963 const Driver &D = getToolChain().getDriver();
964 StringRef CPUName;
965 StringRef ABIName;
966 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
967
968 CmdArgs.push_back("-target-cpu");
969 CmdArgs.push_back(CPUName.data());
970
971 CmdArgs.push_back("-target-abi");
972 CmdArgs.push_back(ABIName.data());
973
974 StringRef FloatABI = getMipsFloatABI(D, Args);
975
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000976 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
977
978 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000979 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000980 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000981 CmdArgs.push_back("-mfloat-abi");
982 CmdArgs.push_back("soft");
983
984 // FIXME: Note, this is a hack. We need to pass the selected float
985 // mode to the MipsTargetInfoBase to define appropriate macros there.
986 // Now it is the only method.
987 CmdArgs.push_back("-target-feature");
988 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000989
990 if (FloatABI == "hard" && IsMips16) {
991 CmdArgs.push_back("-mllvm");
992 CmdArgs.push_back("-mips16-hard-float");
993 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000994 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000995 else {
996 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000997 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001000 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001001
Simon Atanasyan82eec3a2013-04-14 14:07:36 +00001002 AddTargetFeature(Args, CmdArgs,
1003 options::OPT_msingle_float, options::OPT_mdouble_float,
1004 "single-float");
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001005 AddTargetFeature(Args, CmdArgs,
1006 options::OPT_mips16, options::OPT_mno_mips16,
1007 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001008 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan60777612013-04-14 14:07:51 +00001009 options::OPT_mmicromips, options::OPT_mno_micromips,
1010 "micromips");
1011 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001012 options::OPT_mdsp, options::OPT_mno_dsp,
1013 "dsp");
1014 AddTargetFeature(Args, CmdArgs,
1015 options::OPT_mdspr2, options::OPT_mno_dspr2,
1016 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001017
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1019 if (A->getOption().matches(options::OPT_mxgot)) {
1020 CmdArgs.push_back("-mllvm");
1021 CmdArgs.push_back("-mxgot");
1022 }
1023 }
1024
Simon Atanasyanc580b322013-05-11 06:33:44 +00001025 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1026 options::OPT_mno_ldc1_sdc1)) {
1027 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1028 CmdArgs.push_back("-mllvm");
1029 CmdArgs.push_back("-mno-ldc1-sdc1");
1030 }
1031 }
1032
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001033 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001034 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001035 CmdArgs.push_back("-mllvm");
1036 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1037 A->claim();
1038 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001039}
1040
Hal Finkel8eb59282012-06-11 22:35:19 +00001041/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1042static std::string getPPCTargetCPU(const ArgList &Args) {
1043 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001044 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001045
1046 if (CPUName == "native") {
1047 std::string CPU = llvm::sys::getHostCPUName();
1048 if (!CPU.empty() && CPU != "generic")
1049 return CPU;
1050 else
1051 return "";
1052 }
1053
1054 return llvm::StringSwitch<const char *>(CPUName)
1055 .Case("common", "generic")
1056 .Case("440", "440")
1057 .Case("440fp", "440")
1058 .Case("450", "450")
1059 .Case("601", "601")
1060 .Case("602", "602")
1061 .Case("603", "603")
1062 .Case("603e", "603e")
1063 .Case("603ev", "603ev")
1064 .Case("604", "604")
1065 .Case("604e", "604e")
1066 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001067 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001068 .Case("G3", "g3")
1069 .Case("7400", "7400")
1070 .Case("G4", "g4")
1071 .Case("7450", "7450")
1072 .Case("G4+", "g4+")
1073 .Case("750", "750")
1074 .Case("970", "970")
1075 .Case("G5", "g5")
1076 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001077 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001078 .Case("e500mc", "e500mc")
1079 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001080 .Case("power3", "pwr3")
1081 .Case("power4", "pwr4")
1082 .Case("power5", "pwr5")
1083 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001084 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001085 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001086 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001087 .Case("pwr3", "pwr3")
1088 .Case("pwr4", "pwr4")
1089 .Case("pwr5", "pwr5")
1090 .Case("pwr5x", "pwr5x")
1091 .Case("pwr6", "pwr6")
1092 .Case("pwr6x", "pwr6x")
1093 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001094 .Case("powerpc", "ppc")
1095 .Case("powerpc64", "ppc64")
1096 .Default("");
1097 }
1098
1099 return "";
1100}
1101
1102void Clang::AddPPCTargetArgs(const ArgList &Args,
1103 ArgStringList &CmdArgs) const {
1104 std::string TargetCPUName = getPPCTargetCPU(Args);
1105
1106 // LLVM may default to generating code for the native CPU,
1107 // but, like gcc, we default to a more generic option for
1108 // each architecture. (except on Darwin)
1109 llvm::Triple Triple = getToolChain().getTriple();
1110 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1111 if (Triple.getArch() == llvm::Triple::ppc64)
1112 TargetCPUName = "ppc64";
1113 else
1114 TargetCPUName = "ppc";
1115 }
1116
1117 if (!TargetCPUName.empty()) {
1118 CmdArgs.push_back("-target-cpu");
1119 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1120 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001121
1122 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001123 AddTargetFeature(Args, CmdArgs,
1124 options::OPT_faltivec, options::OPT_fno_altivec,
1125 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001126
Hal Finkel7d458592013-03-30 13:47:44 +00001127 AddTargetFeature(Args, CmdArgs,
1128 options::OPT_mfprnd, options::OPT_mno_fprnd,
1129 "fprnd");
1130
Hal Finkel279ca4d2013-03-28 08:38:53 +00001131 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1132 AddTargetFeature(Args, CmdArgs,
1133 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1134 "mfocrf");
1135
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001136 AddTargetFeature(Args, CmdArgs,
1137 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1138 "popcntd");
1139
Hal Finkel279ca4d2013-03-28 08:38:53 +00001140 // It is really only possible to turn qpx off because turning qpx on is tied
1141 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001142 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1143 CmdArgs.push_back("-target-feature");
1144 CmdArgs.push_back("-qpx");
1145 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001146}
1147
Tom Stellard6674c702013-04-01 20:56:53 +00001148/// Get the (LLVM) name of the R600 gpu we are targeting.
1149static std::string getR600TargetGPU(const ArgList &Args) {
1150 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1151 std::string GPUName = A->getValue();
1152 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001153 .Cases("rv630", "rv635", "r600")
1154 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001155 .Case("rv740", "rv770")
1156 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001157 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001158 .Case("hemlock", "cypress")
1159 .Case("aruba", "cayman")
1160 .Default(GPUName.c_str());
1161 }
1162 return "";
1163}
1164
1165void Clang::AddR600TargetArgs(const ArgList &Args,
1166 ArgStringList &CmdArgs) const {
1167 std::string TargetGPUName = getR600TargetGPU(Args);
1168 CmdArgs.push_back("-target-cpu");
1169 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1170}
1171
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001172void Clang::AddSparcTargetArgs(const ArgList &Args,
1173 ArgStringList &CmdArgs) const {
1174 const Driver &D = getToolChain().getDriver();
1175
1176 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001177 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001178 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001179 }
1180
1181 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001182 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001183 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1184 options::OPT_mhard_float)) {
1185 if (A->getOption().matches(options::OPT_msoft_float))
1186 FloatABI = "soft";
1187 else if (A->getOption().matches(options::OPT_mhard_float))
1188 FloatABI = "hard";
1189 }
1190
1191 // If unspecified, choose the default based on the platform.
1192 if (FloatABI.empty()) {
1193 switch (getToolChain().getTriple().getOS()) {
1194 default:
1195 // Assume "soft", but warn the user we are guessing.
1196 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001197 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001198 break;
1199 }
1200 }
1201
1202 if (FloatABI == "soft") {
1203 // Floating point operations and argument passing are soft.
1204 //
1205 // FIXME: This changes CPP defines, we need -target-soft-float.
1206 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001207 CmdArgs.push_back("-target-feature");
1208 CmdArgs.push_back("+soft-float");
1209 } else {
1210 assert(FloatABI == "hard" && "Invalid float abi!");
1211 CmdArgs.push_back("-mhard-float");
1212 }
1213}
1214
Chandler Carruth953fb082013-01-13 11:46:33 +00001215static const char *getX86TargetCPU(const ArgList &Args,
1216 const llvm::Triple &Triple) {
1217 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1218 if (StringRef(A->getValue()) != "native")
1219 return A->getValue();
1220
1221 // FIXME: Reject attempts to use -march=native unless the target matches
1222 // the host.
1223 //
1224 // FIXME: We should also incorporate the detected target features for use
1225 // with -native.
1226 std::string CPU = llvm::sys::getHostCPUName();
1227 if (!CPU.empty() && CPU != "generic")
1228 return Args.MakeArgString(CPU);
1229 }
1230
1231 // Select the default CPU if none was given (or detection failed).
1232
1233 if (Triple.getArch() != llvm::Triple::x86_64 &&
1234 Triple.getArch() != llvm::Triple::x86)
1235 return 0; // This routine is only handling x86 targets.
1236
1237 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1238
1239 // FIXME: Need target hooks.
1240 if (Triple.isOSDarwin())
1241 return Is64Bit ? "core2" : "yonah";
1242
1243 // Everything else goes to x86-64 in 64-bit mode.
1244 if (Is64Bit)
1245 return "x86-64";
1246
1247 if (Triple.getOSName().startswith("haiku"))
1248 return "i586";
1249 if (Triple.getOSName().startswith("openbsd"))
1250 return "i486";
1251 if (Triple.getOSName().startswith("bitrig"))
1252 return "i686";
1253 if (Triple.getOSName().startswith("freebsd"))
1254 return "i486";
1255 if (Triple.getOSName().startswith("netbsd"))
1256 return "i486";
1257 // All x86 devices running Android have core2 as their common
1258 // denominator. This makes a better choice than pentium4.
1259 if (Triple.getEnvironment() == llvm::Triple::Android)
1260 return "core2";
1261
1262 // Fallback to p4.
1263 return "pentium4";
1264}
1265
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001266void Clang::AddX86TargetArgs(const ArgList &Args,
1267 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001268 if (!Args.hasFlag(options::OPT_mred_zone,
1269 options::OPT_mno_red_zone,
1270 true) ||
1271 Args.hasArg(options::OPT_mkernel) ||
1272 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001273 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001274
Bob Wilson2616e2e2013-02-10 16:01:41 +00001275 // Default to avoid implicit floating-point for kernel/kext code, but allow
1276 // that to be overridden with -mno-soft-float.
1277 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1278 Args.hasArg(options::OPT_fapple_kext));
1279 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1280 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001281 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001282 options::OPT_mno_implicit_float)) {
1283 const Option &O = A->getOption();
1284 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1285 O.matches(options::OPT_msoft_float));
1286 }
1287 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001288 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001289
Chandler Carruth953fb082013-01-13 11:46:33 +00001290 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001291 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001292 CmdArgs.push_back(CPUName);
1293 }
1294
Eli Friedmanad811f02011-07-02 00:34:19 +00001295 // The required algorithm here is slightly strange: the options are applied
1296 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1297 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1298 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1299 // former correctly, but not the latter; handle directly-overridden
1300 // attributes here.
1301 llvm::StringMap<unsigned> PrevFeature;
1302 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001303 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1304 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001305 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001306 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001307
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001308 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001309 assert(Name.startswith("m") && "Invalid feature name.");
1310 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001311
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001312 bool IsNegative = Name.startswith("no-");
1313 if (IsNegative)
1314 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001315
Eli Friedmanad811f02011-07-02 00:34:19 +00001316 unsigned& Prev = PrevFeature[Name];
1317 if (Prev)
1318 Features[Prev - 1] = 0;
1319 Prev = Features.size() + 1;
1320 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1321 }
1322 for (unsigned i = 0; i < Features.size(); i++) {
1323 if (Features[i]) {
1324 CmdArgs.push_back("-target-feature");
1325 CmdArgs.push_back(Features[i]);
1326 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001327 }
1328}
1329
Matthew Curtise8f80a12012-12-06 17:49:03 +00001330static inline bool HasPICArg(const ArgList &Args) {
1331 return Args.hasArg(options::OPT_fPIC)
1332 || Args.hasArg(options::OPT_fpic);
1333}
1334
1335static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1336 return Args.getLastArg(options::OPT_G,
1337 options::OPT_G_EQ,
1338 options::OPT_msmall_data_threshold_EQ);
1339}
1340
1341static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1342 std::string value;
1343 if (HasPICArg(Args))
1344 value = "0";
1345 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1346 value = A->getValue();
1347 A->claim();
1348 }
1349 return value;
1350}
1351
Tony Linthicum76329bf2011-12-12 21:14:55 +00001352void Clang::AddHexagonTargetArgs(const ArgList &Args,
1353 ArgStringList &CmdArgs) const {
1354 llvm::Triple Triple = getToolChain().getTriple();
1355
1356 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001357 CmdArgs.push_back(Args.MakeArgString(
1358 "hexagon"
1359 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001360 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001361 CmdArgs.push_back("-mqdsp6-compat");
1362 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001363
Matthew Curtise8f80a12012-12-06 17:49:03 +00001364 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1365 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001366 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001367 CmdArgs.push_back(Args.MakeArgString(
1368 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001369 }
1370
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001371 if (!Args.hasArg(options::OPT_fno_short_enums))
1372 CmdArgs.push_back("-fshort-enums");
1373 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1374 CmdArgs.push_back ("-mllvm");
1375 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1376 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001377 CmdArgs.push_back ("-mllvm");
1378 CmdArgs.push_back ("-machine-sink-split=0");
1379}
1380
Eric Christopher84fbdb42011-08-19 00:30:14 +00001381static bool
John McCall5fb5df92012-06-20 06:18:46 +00001382shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001383 const llvm::Triple &Triple) {
1384 // We use the zero-cost exception tables for Objective-C if the non-fragile
1385 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1386 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001387 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001388 return true;
1389
Bob Wilson6524dd32011-10-14 05:03:44 +00001390 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001391 return false;
1392
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001393 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001394 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001395 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001396}
1397
Anders Carlssone96ab552011-02-28 02:27:16 +00001398/// addExceptionArgs - Adds exception related arguments to the driver command
1399/// arguments. There's a master flag, -fexceptions and also language specific
1400/// flags to enable/disable C++ and Objective-C exceptions.
1401/// This makes it possible to for example disable C++ exceptions but enable
1402/// Objective-C exceptions.
1403static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1404 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001405 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001406 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001407 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001408 if (KernelOrKext) {
1409 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1410 // arguments now to avoid warnings about unused arguments.
1411 Args.ClaimAllArgs(options::OPT_fexceptions);
1412 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1413 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1414 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1415 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1416 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001417 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001418 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001419
1420 // Exceptions are enabled by default.
1421 bool ExceptionsEnabled = true;
1422
1423 // This keeps track of whether exceptions were explicitly turned on or off.
1424 bool DidHaveExplicitExceptionFlag = false;
1425
Rafael Espindola00a66572009-10-01 13:33:33 +00001426 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1427 options::OPT_fno_exceptions)) {
1428 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001429 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001430 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001431 ExceptionsEnabled = false;
1432
1433 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001434 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001435
Anders Carlssone96ab552011-02-28 02:27:16 +00001436 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001437
Anders Carlssone96ab552011-02-28 02:27:16 +00001438 // Exception tables and cleanups can be enabled with -fexceptions even if the
1439 // language itself doesn't support exceptions.
1440 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1441 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001442
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001443 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1444 // is not necessarily sensible, but follows GCC.
1445 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001446 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001447 options::OPT_fno_objc_exceptions,
1448 true)) {
1449 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001450
Eric Christopher84fbdb42011-08-19 00:30:14 +00001451 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001452 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001453 }
1454
1455 if (types::isCXX(InputType)) {
1456 bool CXXExceptionsEnabled = ExceptionsEnabled;
1457
Eric Christopher84fbdb42011-08-19 00:30:14 +00001458 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1459 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001460 options::OPT_fexceptions,
1461 options::OPT_fno_exceptions)) {
1462 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1463 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001464 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001465 CXXExceptionsEnabled = false;
1466 }
1467
1468 if (CXXExceptionsEnabled) {
1469 CmdArgs.push_back("-fcxx-exceptions");
1470
1471 ShouldUseExceptionTables = true;
1472 }
1473 }
1474
1475 if (ShouldUseExceptionTables)
1476 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001477}
1478
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001479static bool ShouldDisableAutolink(const ArgList &Args,
1480 const ToolChain &TC) {
1481 bool Default = true;
1482 if (TC.getTriple().isOSDarwin()) {
1483 // The native darwin assembler doesn't support the linker_option directives,
1484 // so we disable them if we think the .s file will be passed to it.
1485 Default = TC.useIntegratedAs();
1486 }
1487 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1488 Default);
1489}
1490
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001491static bool ShouldDisableCFI(const ArgList &Args,
1492 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001493 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001494 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001495 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001496 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001497 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001498 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001499 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001500 options::OPT_fno_dwarf2_cfi_asm,
1501 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001502}
1503
Ted Kremenek62093662013-03-12 17:02:12 +00001504static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1505 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001506 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1507 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001508 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001509 return !UseDwarfDirectory;
1510}
1511
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001512/// \brief Check whether the given input tree contains any compilation actions.
1513static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001514 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001515 return true;
1516
1517 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1518 if (ContainsCompileAction(*it))
1519 return true;
1520
1521 return false;
1522}
1523
1524/// \brief Check if -relax-all should be passed to the internal assembler.
1525/// This is done by default when compiling non-assembler source with -O0.
1526static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1527 bool RelaxDefault = true;
1528
1529 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1530 RelaxDefault = A->getOption().matches(options::OPT_O0);
1531
1532 if (RelaxDefault) {
1533 RelaxDefault = false;
1534 for (ActionList::const_iterator it = C.getActions().begin(),
1535 ie = C.getActions().end(); it != ie; ++it) {
1536 if (ContainsCompileAction(*it)) {
1537 RelaxDefault = true;
1538 break;
1539 }
1540 }
1541 }
1542
1543 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1544 RelaxDefault);
1545}
1546
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001547SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001548 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1549 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001550 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1551 // at least once (possibly, disabled further).
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001552 const Driver &D = TC.getDriver();
Richard Smith52be6192012-11-05 22:04:41 +00001553 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001554 unsigned Add, Remove;
1555 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001556 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001557 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001558 Kind |= Add;
1559 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001560 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001561 }
1562
Chad Rosierae229d52013-01-29 23:31:22 +00001563 UbsanTrapOnError =
1564 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1565 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1566 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1567
1568 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1569 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1570 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1571 D.Diag(diag::err_drv_argument_not_allowed_with)
1572 << "-fcatch-undefined-behavior"
1573 << "-fno-sanitize-undefined-trap-on-error";
1574 }
1575
1576 // Warn about undefined sanitizer options that require runtime support.
1577 if (UbsanTrapOnError && notAllowedWithTrap()) {
1578 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1579 D.Diag(diag::err_drv_argument_not_allowed_with)
1580 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1581 << "-fcatch-undefined-behavior";
1582 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1583 options::OPT_fno_sanitize_undefined_trap_on_error,
1584 false))
1585 D.Diag(diag::err_drv_argument_not_allowed_with)
1586 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1587 << "-fsanitize-undefined-trap-on-error";
1588 }
1589
Richard Smith52be6192012-11-05 22:04:41 +00001590 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001591 bool NeedsAsan = needsAsanRt();
1592 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001593 bool NeedsMsan = needsMsanRt();
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001594 bool NeedsLsan = needsLeakDetection();
Richard Smith06d87f12012-12-01 01:02:45 +00001595 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001596 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001597 << lastArgumentForKind(D, Args, NeedsAsanRt)
1598 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001599 if (NeedsAsan && NeedsMsan)
1600 D.Diag(diag::err_drv_argument_not_allowed_with)
1601 << lastArgumentForKind(D, Args, NeedsAsanRt)
1602 << lastArgumentForKind(D, Args, NeedsMsanRt);
1603 if (NeedsTsan && NeedsMsan)
1604 D.Diag(diag::err_drv_argument_not_allowed_with)
1605 << lastArgumentForKind(D, Args, NeedsTsanRt)
1606 << lastArgumentForKind(D, Args, NeedsMsanRt);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001607 if (NeedsLsan && NeedsTsan)
1608 D.Diag(diag::err_drv_argument_not_allowed_with)
1609 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1610 << lastArgumentForKind(D, Args, NeedsTsanRt);
1611 if (NeedsLsan && NeedsMsan)
1612 D.Diag(diag::err_drv_argument_not_allowed_with)
1613 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1614 << lastArgumentForKind(D, Args, NeedsMsanRt);
1615 // FIXME: Currenly -fsanitize=leak is silently ignored in the presence of
1616 // -fsanitize=address. Perhaps it should print an error, or perhaps
1617 // -f(-no)sanitize=leak should change whether leak detection is enabled by
1618 // default in ASan?
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001619
1620 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001621 // explicitly contain -fsanitize=address (probably, turned off later in the
1622 // command line).
1623 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1624 D.Diag(diag::warn_drv_unused_sanitizer)
1625 << lastArgumentForKind(D, Args, AddressFull)
1626 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001627
1628 // Parse -f(no-)sanitize-blacklist options.
1629 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1630 options::OPT_fno_sanitize_blacklist)) {
1631 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1632 std::string BLPath = BLArg->getValue();
1633 bool BLExists = false;
1634 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1635 BlacklistFile = BLPath;
1636 else
1637 D.Diag(diag::err_drv_no_such_file) << BLPath;
1638 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001639 } else {
1640 // If no -fsanitize-blacklist option is specified, try to look up for
1641 // blacklist in the resource directory.
1642 std::string BLPath;
1643 bool BLExists = false;
1644 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1645 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1646 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001647 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001648
1649 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001650 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001651 MsanTrackOrigins =
1652 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1653 options::OPT_fno_sanitize_memory_track_origins,
1654 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001655
1656 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov7e434072013-04-09 07:27:44 +00001657 if (NeedsAsan) {
1658 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1659 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov29524a92013-01-20 13:12:12 +00001660 AsanZeroBaseShadow =
Alexey Samsonov7e434072013-04-09 07:27:44 +00001661 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1662 options::OPT_fno_sanitize_address_zero_base_shadow,
1663 ZeroBaseShadowDefault);
1664 // Zero-base shadow is a requirement on Android.
1665 if (IsAndroid && !AsanZeroBaseShadow) {
1666 D.Diag(diag::err_drv_argument_not_allowed_with)
1667 << "-fno-sanitize-address-zero-base-shadow"
1668 << lastArgumentForKind(D, Args, Address);
1669 }
1670 }
Richard Smith52be6192012-11-05 22:04:41 +00001671}
1672
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001673static void addSanitizerRTLinkFlagsLinux(
1674 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001675 const StringRef Sanitizer, bool BeforeLibStdCXX,
1676 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001677 // Sanitizer runtime is located in the Linux library directory and
1678 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1679 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1680 llvm::sys::path::append(
1681 LibSanitizer, "lib", "linux",
1682 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001683
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001684 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1685 // etc.) so that the linker picks custom versions of the global 'operator
1686 // new' and 'operator delete' symbols. We take the extreme (but simple)
1687 // strategy of inserting it at the front of the link command. It also
1688 // needs to be forced to end up in the executable, so wrap it in
1689 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001690 SmallVector<const char *, 3> LibSanitizerArgs;
1691 LibSanitizerArgs.push_back("-whole-archive");
1692 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1693 LibSanitizerArgs.push_back("-no-whole-archive");
1694
1695 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1696 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1697
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001698 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001699 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001700 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001701
1702 // If possible, use a dynamic symbols file to export the symbols from the
1703 // runtime library. If we can't do so, use -export-dynamic instead to export
1704 // all symbols from the binary.
1705 if (ExportSymbols) {
1706 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1707 CmdArgs.push_back(
1708 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1709 else
1710 CmdArgs.push_back("-export-dynamic");
1711 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001712}
1713
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001714/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1715/// This needs to be called before we add the C run-time (malloc, etc).
1716static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001717 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001718 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001719 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1720 llvm::sys::path::append(LibAsan, "lib", "linux",
1721 (Twine("libclang_rt.asan-") +
1722 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001723 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001724 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001725 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001726 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001727 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001728}
1729
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001730/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1731/// This needs to be called before we add the C run-time (malloc, etc).
1732static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1733 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001734 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001735 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001736}
1737
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001738/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1739/// This needs to be called before we add the C run-time (malloc, etc).
1740static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1741 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001742 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001743 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001744}
1745
1746/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1747/// This needs to be called before we add the C run-time (malloc, etc).
1748static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1749 ArgStringList &CmdArgs) {
1750 if (!Args.hasArg(options::OPT_shared))
1751 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001752}
1753
Richard Smithe30752c2012-10-09 19:52:38 +00001754/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1755/// (Linux).
1756static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001757 ArgStringList &CmdArgs, bool IsCXX,
1758 bool HasOtherSanitizerRt) {
1759 if (Args.hasArg(options::OPT_shared))
1760 return;
1761
1762 // Need a copy of sanitizer_common. This could come from another sanitizer
1763 // runtime; if we're not including one, include our own copy.
1764 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001765 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001766
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001767 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001768
1769 // Only include the bits of the runtime which need a C++ ABI library if
1770 // we're linking in C++ mode.
1771 if (IsCXX)
1772 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001773}
1774
Rafael Espindola224dd632011-12-14 21:02:23 +00001775static bool shouldUseFramePointer(const ArgList &Args,
1776 const llvm::Triple &Triple) {
1777 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1778 options::OPT_fomit_frame_pointer))
1779 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1780
Rafael Espindola00b29182011-12-14 21:50:24 +00001781 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001782 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1783 Triple.getArch() == llvm::Triple::x86) &&
1784 Triple.getOS() == llvm::Triple::Linux) {
1785 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1786 if (!A->getOption().matches(options::OPT_O0))
1787 return false;
1788 }
1789
1790 return true;
1791}
1792
Eric Christopherb7d97e92013-04-03 01:58:53 +00001793static bool shouldUseLeafFramePointer(const ArgList &Args,
1794 const llvm::Triple &Triple) {
1795 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1796 options::OPT_momit_leaf_frame_pointer))
1797 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1798
1799 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1800 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1801 Triple.getArch() == llvm::Triple::x86) &&
1802 Triple.getOS() == llvm::Triple::Linux) {
1803 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1804 if (!A->getOption().matches(options::OPT_O0))
1805 return false;
1806 }
1807
1808 return true;
1809}
1810
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001811/// If the PWD environment variable is set, add a CC1 option to specify the
1812/// debug compilation directory.
1813static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001814 struct stat StatPWDBuf, StatDotBuf;
1815
Benjamin Kramer85f5aa12013-04-27 08:42:33 +00001816 const char *pwd = ::getenv("PWD");
1817 if (!pwd)
1818 return;
1819
1820 if (llvm::sys::path::is_absolute(pwd) &&
Chad Rosiera35d5a32013-04-26 20:49:50 +00001821 stat(pwd, &StatPWDBuf) == 0 &&
1822 stat(".", &StatDotBuf) == 0 &&
1823 StatPWDBuf.st_ino == StatDotBuf.st_ino &&
1824 StatPWDBuf.st_dev == StatDotBuf.st_dev) {
1825 CmdArgs.push_back("-fdebug-compilation-dir");
1826 CmdArgs.push_back(Args.MakeArgString(pwd));
1827 return;
1828 }
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001829
Chad Rosiera35d5a32013-04-26 20:49:50 +00001830 // Fall back to using getcwd.
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001831 SmallString<128> cwd;
1832 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001833 CmdArgs.push_back("-fdebug-compilation-dir");
1834 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001835 }
1836}
1837
Eric Christopherd3804002013-02-22 20:12:52 +00001838static const char *SplitDebugName(const ArgList &Args,
1839 const InputInfoList &Inputs) {
1840 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1841 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1842 SmallString<128> T(FinalOutput->getValue());
1843 llvm::sys::path::replace_extension(T, "dwo");
1844 return Args.MakeArgString(T);
1845 } else {
1846 // Use the compilation dir.
1847 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1848 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1849 llvm::sys::path::replace_extension(F, "dwo");
1850 T += F;
1851 return Args.MakeArgString(F);
1852 }
1853}
1854
1855static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1856 const Tool &T, const JobAction &JA,
1857 const ArgList &Args, const InputInfo &Output,
1858 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001859 ArgStringList ExtractArgs;
1860 ExtractArgs.push_back("--extract-dwo");
1861
1862 ArgStringList StripArgs;
1863 StripArgs.push_back("--strip-dwo");
1864
1865 // Grabbing the output of the earlier compile step.
1866 StripArgs.push_back(Output.getFilename());
1867 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001868 ExtractArgs.push_back(OutFile);
1869
1870 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001871 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001872
1873 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001874 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001875
1876 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001877 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001878}
1879
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001880static bool isOptimizationLevelFast(const ArgList &Args) {
1881 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1882 if (A->getOption().matches(options::OPT_Ofast))
1883 return true;
1884 return false;
1885}
1886
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001887void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001888 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001889 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001890 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001891 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001892 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1893 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001894 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001895 ArgStringList CmdArgs;
1896
Daniel Dunbare521a892009-03-31 20:53:55 +00001897 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1898
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001899 // Invoke ourselves in -cc1 mode.
1900 //
1901 // FIXME: Implement custom jobs for internal actions.
1902 CmdArgs.push_back("-cc1");
1903
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001904 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001905 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001906 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001907 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001908
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001909 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001910 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001911
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001912 if (isa<AnalyzeJobAction>(JA)) {
1913 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1914 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001915 } else if (isa<MigrateJobAction>(JA)) {
1916 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001917 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001918 if (Output.getType() == types::TY_Dependencies)
1919 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001920 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001921 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001922 if (Args.hasArg(options::OPT_rewrite_objc) &&
1923 !Args.hasArg(options::OPT_g_Group))
1924 CmdArgs.push_back("-P");
1925 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001926 } else if (isa<AssembleJobAction>(JA)) {
1927 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001928
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001929 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001930 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001931
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001932 // When using an integrated assembler, translate -Wa, and -Xassembler
1933 // options.
1934 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1935 options::OPT_Xassembler),
1936 ie = Args.filtered_end(); it != ie; ++it) {
1937 const Arg *A = *it;
1938 A->claim();
1939
1940 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001941 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001942
1943 if (Value == "-force_cpusubtype_ALL") {
1944 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001945 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001946 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001947 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001948 CmdArgs.push_back("-mllvm");
1949 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001950 } else if (Value == "--noexecstack") {
1951 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001952 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001953 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001954 << A->getOption().getName() << Value;
1955 }
1956 }
1957 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001958
1959 // Also ignore explicit -force_cpusubtype_ALL option.
1960 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001961 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001962 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001963 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001964
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001965 if (JA.getType() == types::TY_Nothing)
1966 CmdArgs.push_back("-fsyntax-only");
1967 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001968 CmdArgs.push_back("-emit-pch");
1969 else
1970 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001971 } else {
1972 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001973
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001974 if (JA.getType() == types::TY_Nothing) {
1975 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001976 } else if (JA.getType() == types::TY_LLVM_IR ||
1977 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001978 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001979 } else if (JA.getType() == types::TY_LLVM_BC ||
1980 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001981 CmdArgs.push_back("-emit-llvm-bc");
1982 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001983 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001984 } else if (JA.getType() == types::TY_AST) {
1985 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00001986 } else if (JA.getType() == types::TY_ModuleFile) {
1987 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001988 } else if (JA.getType() == types::TY_RewrittenObjC) {
1989 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001990 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001991 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1992 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001993 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001994 } else {
1995 assert(JA.getType() == types::TY_PP_Asm &&
1996 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001997 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001998 }
1999
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002000 // The make clang go fast button.
2001 CmdArgs.push_back("-disable-free");
2002
John McCallbb79b5f2010-02-13 03:50:24 +00002003 // Disable the verification pass in -asserts builds.
2004#ifdef NDEBUG
2005 CmdArgs.push_back("-disable-llvm-verifier");
2006#endif
2007
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002008 // Set the main file name, so that debug info works even with
2009 // -save-temps.
2010 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002011 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002012
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002013 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002014 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002015 if (Args.hasArg(options::OPT_static))
2016 CmdArgs.push_back("-static-define");
2017
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002018 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002019 // Enable region store model by default.
2020 CmdArgs.push_back("-analyzer-store=region");
2021
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002022 // Treat blocks as analysis entry points.
2023 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2024
Ted Kremenek49c79792011-03-24 00:28:47 +00002025 CmdArgs.push_back("-analyzer-eagerly-assume");
2026
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002027 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002028 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002029 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002030
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002031 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2032 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002033
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002034 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002035 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002036
2037 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002038
Jordan Rose10ad0812013-04-05 17:55:07 +00002039 if (types::isCXX(Inputs[0].getType()))
2040 CmdArgs.push_back("-analyzer-checker=cplusplus");
2041
Ted Kremenek37e96522012-01-26 02:27:38 +00002042 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002043 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2044 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2045 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2046 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2047 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2048 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002049 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002050
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002051 // Set the output format. The default is plist, for (lame) historical
2052 // reasons.
2053 CmdArgs.push_back("-analyzer-output");
2054 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002055 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002056 else
2057 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002058
Ted Kremenekfe449a22010-03-22 22:32:05 +00002059 // Disable the presentation of standard compiler warnings when
2060 // using --analyze. We only want to show static analyzer diagnostics
2061 // or frontend errors.
2062 CmdArgs.push_back("-w");
2063
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002064 // Add -Xanalyzer arguments when running as analyzer.
2065 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002066 }
2067
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002068 CheckCodeGenerationOptions(D, Args);
2069
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002070 bool PIE = getToolChain().isPIEDefault();
2071 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002072 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002073
Alexey Samsonov090301e2013-04-09 12:28:19 +00002074 // For the PIC and PIE flag options, this logic is different from the
2075 // legacy logic in very old versions of GCC, as that logic was just
2076 // a bug no one had ever fixed. This logic is both more rational and
2077 // consistent with GCC's new logic now that the bugs are fixed. The last
2078 // argument relating to either PIC or PIE wins, and no other argument is
2079 // used. If the last argument is any flavor of the '-fno-...' arguments,
2080 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2081 // at the same level.
2082 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2083 options::OPT_fpic, options::OPT_fno_pic,
2084 options::OPT_fPIE, options::OPT_fno_PIE,
2085 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002086 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2087 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002088 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002089 if (LastPICArg) {
2090 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002091 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2092 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2093 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2094 PIC = PIE || O.matches(options::OPT_fPIC) ||
2095 O.matches(options::OPT_fpic);
2096 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2097 O.matches(options::OPT_fPIC);
2098 } else {
2099 PIE = PIC = false;
2100 }
2101 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002102 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002103
2104 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2105 // specified while enabling PIC enabled level 1 PIC, just force it back to
2106 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2107 // informal testing).
2108 if (PIC && getToolChain().getTriple().isOSDarwin())
2109 IsPICLevelTwo |= getToolChain().isPICDefault();
2110
Chandler Carruthc0c04552012-04-08 16:40:35 +00002111 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2112 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002113 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002114 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002115 (Triple.getOS() != llvm::Triple::IOS ||
2116 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002117 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002118 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002119 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002120
Chandler Carruth76a943b2012-11-19 03:52:03 +00002121 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2122 // This is a very special mode. It trumps the other modes, almost no one
2123 // uses it, and it isn't even valid on any OS but Darwin.
2124 if (!getToolChain().getTriple().isOSDarwin())
2125 D.Diag(diag::err_drv_unsupported_opt_for_target)
2126 << A->getSpelling() << getToolChain().getTriple().str();
2127
2128 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2129
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002130 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002131 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002132
Chandler Carruth76a943b2012-11-19 03:52:03 +00002133 // Only a forced PIC mode can cause the actual compile to have PIC defines
2134 // etc., no flags are sufficient. This behavior was selected to closely
2135 // match that of llvm-gcc and Apple GCC before that.
2136 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2137 CmdArgs.push_back("-pic-level");
2138 CmdArgs.push_back("2");
2139 }
2140 } else {
2141 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2142 // handled in Clang's IRGen by the -pie-level flag.
2143 CmdArgs.push_back("-mrelocation-model");
2144 CmdArgs.push_back(PIC ? "pic" : "static");
2145
2146 if (PIC) {
2147 CmdArgs.push_back("-pic-level");
2148 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2149 if (PIE) {
2150 CmdArgs.push_back("-pie-level");
2151 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2152 }
2153 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002154 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002155
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002156 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2157 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002158 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002159
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002160 // LLVM Code Generator Options.
2161
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002162 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2163 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002164 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002165 }
2166
Roman Divacky65b88cd2011-03-01 17:40:53 +00002167 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2168 CmdArgs.push_back("-mrtd");
2169
Rafael Espindola224dd632011-12-14 21:02:23 +00002170 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002171 CmdArgs.push_back("-mdisable-fp-elim");
2172 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2173 options::OPT_fno_zero_initialized_in_bss))
2174 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002175
2176 bool OFastEnabled = isOptimizationLevelFast(Args);
2177 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2178 // enabled. This alias option is being used to simplify the hasFlag logic.
2179 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2180 options::OPT_fstrict_aliasing;
2181 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002182 options::OPT_fno_strict_aliasing,
2183 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002184 CmdArgs.push_back("-relaxed-aliasing");
Manman Renc451e572013-04-04 21:53:22 +00002185 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2186 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002187 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2188 false))
2189 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002190 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2191 options::OPT_fno_optimize_sibling_calls))
2192 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002193
Eric Christopher006208c2013-04-04 06:29:47 +00002194 // Handle segmented stacks.
2195 if (Args.hasArg(options::OPT_fsplit_stack))
2196 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002197
2198 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2199 // This alias option is being used to simplify the getLastArg logic.
2200 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2201 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002202
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002203 // Handle various floating point optimization flags, mapping them to the
2204 // appropriate LLVM code generation flags. The pattern for all of these is to
2205 // default off the codegen optimizations, and if any flag enables them and no
2206 // flag disables them after the flag enabling them, enable the codegen
2207 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002208 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002209 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002210 options::OPT_ffinite_math_only,
2211 options::OPT_fno_finite_math_only,
2212 options::OPT_fhonor_infinities,
2213 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002214 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2215 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002216 A->getOption().getID() != options::OPT_fhonor_infinities)
2217 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002218 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002219 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002220 options::OPT_ffinite_math_only,
2221 options::OPT_fno_finite_math_only,
2222 options::OPT_fhonor_nans,
2223 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002224 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2225 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002226 A->getOption().getID() != options::OPT_fhonor_nans)
2227 CmdArgs.push_back("-menable-no-nans");
2228
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002229 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2230 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002231 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002232 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002233 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002234 options::OPT_fno_math_errno)) {
2235 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2236 // However, turning *off* -ffast_math merely restores the toolchain default
2237 // (which may be false).
2238 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2239 A->getOption().getID() == options::OPT_ffast_math ||
2240 A->getOption().getID() == options::OPT_Ofast)
2241 MathErrno = false;
2242 else if (A->getOption().getID() == options::OPT_fmath_errno)
2243 MathErrno = true;
2244 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002245 if (MathErrno)
2246 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002247
2248 // There are several flags which require disabling very specific
2249 // optimizations. Any of these being disabled forces us to turn off the
2250 // entire set of LLVM optimizations, so collect them through all the flag
2251 // madness.
2252 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002253 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002254 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002255 options::OPT_funsafe_math_optimizations,
2256 options::OPT_fno_unsafe_math_optimizations,
2257 options::OPT_fassociative_math,
2258 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002259 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2260 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002261 A->getOption().getID() != options::OPT_fno_associative_math)
2262 AssociativeMath = true;
2263 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002264 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002265 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002266 options::OPT_funsafe_math_optimizations,
2267 options::OPT_fno_unsafe_math_optimizations,
2268 options::OPT_freciprocal_math,
2269 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002270 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2271 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002272 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2273 ReciprocalMath = true;
2274 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002275 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002276 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002277 options::OPT_funsafe_math_optimizations,
2278 options::OPT_fno_unsafe_math_optimizations,
2279 options::OPT_fsigned_zeros,
2280 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002281 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2282 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002283 A->getOption().getID() != options::OPT_fsigned_zeros)
2284 SignedZeros = false;
2285 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002286 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002287 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002288 options::OPT_funsafe_math_optimizations,
2289 options::OPT_fno_unsafe_math_optimizations,
2290 options::OPT_ftrapping_math,
2291 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002292 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2293 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002294 A->getOption().getID() != options::OPT_ftrapping_math)
2295 TrappingMath = false;
2296 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2297 !TrappingMath)
2298 CmdArgs.push_back("-menable-unsafe-fp-math");
2299
Lang Hamesaa53b932012-07-06 00:59:19 +00002300
2301 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002302 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002303 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002304 options::OPT_ffp_contract)) {
2305 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002306 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002307 if (Val == "fast" || Val == "on" || Val == "off") {
2308 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2309 } else {
2310 D.Diag(diag::err_drv_unsupported_option_argument)
2311 << A->getOption().getName() << Val;
2312 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002313 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2314 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002315 // If fast-math is set then set the fp-contract mode to fast.
2316 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2317 }
2318 }
2319
Bob Wilson6a039162012-07-19 03:52:53 +00002320 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2321 // and if we find them, tell the frontend to provide the appropriate
2322 // preprocessor macros. This is distinct from enabling any optimizations as
2323 // these options induce language changes which must survive serialization
2324 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002325 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2326 options::OPT_fno_fast_math))
2327 if (!A->getOption().matches(options::OPT_fno_fast_math))
2328 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002329 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2330 if (A->getOption().matches(options::OPT_ffinite_math_only))
2331 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002332
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002333 // Decide whether to use verbose asm. Verbose assembly is the default on
2334 // toolchains which have the integrated assembler on by default.
2335 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2336 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002337 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002338 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002339 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002340
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002341 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2342 CmdArgs.push_back("-mdebug-pass");
2343 CmdArgs.push_back("Structure");
2344 }
2345 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2346 CmdArgs.push_back("-mdebug-pass");
2347 CmdArgs.push_back("Arguments");
2348 }
2349
John McCall8517abc2010-02-19 02:45:38 +00002350 // Enable -mconstructor-aliases except on darwin, where we have to
2351 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002352 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002353 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002354
John McCall7ef5cb32011-03-18 02:56:14 +00002355 // Darwin's kernel doesn't support guard variables; just die if we
2356 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002357 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002358 CmdArgs.push_back("-fforbid-guard-variables");
2359
Douglas Gregordbe39272011-02-01 15:15:22 +00002360 if (Args.hasArg(options::OPT_mms_bitfields)) {
2361 CmdArgs.push_back("-mms-bitfields");
2362 }
John McCall8517abc2010-02-19 02:45:38 +00002363
Daniel Dunbar306945d2009-09-16 06:17:29 +00002364 // This is a coarse approximation of what llvm-gcc actually does, both
2365 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2366 // complicated ways.
2367 bool AsynchronousUnwindTables =
2368 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2369 options::OPT_fno_asynchronous_unwind_tables,
2370 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002371 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002372 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2373 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002374 CmdArgs.push_back("-munwind-tables");
2375
Chandler Carruth05fb5852012-11-21 23:40:23 +00002376 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002377
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002378 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2379 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002380 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002381 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002382
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002383 // FIXME: Handle -mtune=.
2384 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002385
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002386 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002387 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002388 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002389 }
2390
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002391 // Add target specific cpu and features flags.
2392 switch(getToolChain().getTriple().getArch()) {
2393 default:
2394 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002395
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002396 case llvm::Triple::arm:
2397 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002398 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002399 break;
2400
Eric Christopher0b26a612010-03-02 02:41:08 +00002401 case llvm::Triple::mips:
2402 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002403 case llvm::Triple::mips64:
2404 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002405 AddMIPSTargetArgs(Args, CmdArgs);
2406 break;
2407
Hal Finkel8eb59282012-06-11 22:35:19 +00002408 case llvm::Triple::ppc:
2409 case llvm::Triple::ppc64:
2410 AddPPCTargetArgs(Args, CmdArgs);
2411 break;
2412
Tom Stellard6674c702013-04-01 20:56:53 +00002413 case llvm::Triple::r600:
2414 AddR600TargetArgs(Args, CmdArgs);
2415 break;
2416
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002417 case llvm::Triple::sparc:
2418 AddSparcTargetArgs(Args, CmdArgs);
2419 break;
2420
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002421 case llvm::Triple::x86:
2422 case llvm::Triple::x86_64:
2423 AddX86TargetArgs(Args, CmdArgs);
2424 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002425
2426 case llvm::Triple::hexagon:
2427 AddHexagonTargetArgs(Args, CmdArgs);
2428 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002429 }
2430
Tony Linthicum76329bf2011-12-12 21:14:55 +00002431
2432
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002433 // Pass the linker version in use.
2434 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2435 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002436 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002437 }
2438
Eric Christopherb7d97e92013-04-03 01:58:53 +00002439 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002440 CmdArgs.push_back("-momit-leaf-frame-pointer");
2441
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002442 // Explicitly error on some things we know we don't support and can't just
2443 // ignore.
2444 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002445 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2446 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002447 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002448 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002449 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002450 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2451 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002452 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002453 << Unsupported->getOption().getName();
2454 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002455 }
2456
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002457 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002458 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002459 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002460 CmdArgs.push_back("-header-include-file");
2461 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2462 D.CCPrintHeadersFilename : "-");
2463 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002464 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002465 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002466
Chad Rosierbe10f982011-08-02 17:58:04 +00002467 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002468 CmdArgs.push_back("-diagnostic-log-file");
2469 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2470 D.CCLogDiagnosticsFilename : "-");
2471 }
2472
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002473 // Use the last option from "-g" group. "-gline-tables-only"
2474 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002475 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002476 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002477 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002478 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002479 else if (!A->getOption().matches(options::OPT_g0) &&
2480 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002481 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002482 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002483
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002484 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2485 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002486 if (Args.hasArg(options::OPT_gcolumn_info))
2487 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002488
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002489 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2490 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002491 // FIXME: Currently only works on Linux.
2492 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2493 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002494 CmdArgs.push_back("-g");
2495 CmdArgs.push_back("-backend-option");
2496 CmdArgs.push_back("-split-dwarf=Enable");
2497 }
2498
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002499 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2500 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2501
Chris Lattner3c77a352010-06-22 00:03:40 +00002502 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2503
Nick Lewycky207bce32011-04-21 23:44:07 +00002504 if (Args.hasArg(options::OPT_ftest_coverage) ||
2505 Args.hasArg(options::OPT_coverage))
2506 CmdArgs.push_back("-femit-coverage-notes");
2507 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2508 Args.hasArg(options::OPT_coverage))
2509 CmdArgs.push_back("-femit-coverage-data");
2510
Nick Lewycky480cb992011-05-04 20:46:58 +00002511 if (C.getArgs().hasArg(options::OPT_c) ||
2512 C.getArgs().hasArg(options::OPT_S)) {
2513 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002514 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002515 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002516 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2517 if (const char *pwd = ::getenv("PWD")) {
2518 if (llvm::sys::path::is_absolute(pwd)) {
2519 SmallString<128> Pwd(pwd);
2520 llvm::sys::path::append(Pwd, CoverageFilename.str());
2521 CoverageFilename.swap(Pwd);
2522 }
2523 }
2524 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002525 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002526 }
2527 }
2528
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002529 // Pass options for controlling the default header search paths.
2530 if (Args.hasArg(options::OPT_nostdinc)) {
2531 CmdArgs.push_back("-nostdsysteminc");
2532 CmdArgs.push_back("-nobuiltininc");
2533 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002534 if (Args.hasArg(options::OPT_nostdlibinc))
2535 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002536 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2537 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2538 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002539
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002540 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002541 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002542 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002543
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002544 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2545
Ted Kremenekf7639e12012-03-06 20:06:33 +00002546 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002547 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002548 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002549 options::OPT_ccc_arcmt_modify,
2550 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002551 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002552 switch (A->getOption().getID()) {
2553 default:
2554 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002555 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002556 CmdArgs.push_back("-arcmt-check");
2557 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002558 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002559 CmdArgs.push_back("-arcmt-modify");
2560 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002561 case options::OPT_ccc_arcmt_migrate:
2562 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002563 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002564 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002565
2566 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2567 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002568 break;
John McCalld70fb982011-06-15 23:25:17 +00002569 }
2570 }
2571 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002572
Ted Kremenekf7639e12012-03-06 20:06:33 +00002573 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2574 if (ARCMTEnabled) {
2575 D.Diag(diag::err_drv_argument_not_allowed_with)
2576 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2577 }
2578 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002579 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002580
2581 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2582 options::OPT_objcmt_migrate_subscripting)) {
2583 // None specified, means enable them all.
2584 CmdArgs.push_back("-objcmt-migrate-literals");
2585 CmdArgs.push_back("-objcmt-migrate-subscripting");
2586 } else {
2587 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2588 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2589 }
2590 }
2591
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002592 // Add preprocessing options like -I, -D, etc. if we are using the
2593 // preprocessor.
2594 //
2595 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002596 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002597 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002598
Rafael Espindolaa7431922011-07-21 23:40:37 +00002599 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2600 // that "The compiler can only warn and ignore the option if not recognized".
2601 // When building with ccache, it will pass -D options to clang even on
2602 // preprocessed inputs and configure concludes that -fPIC is not supported.
2603 Args.ClaimAllArgs(options::OPT_D);
2604
Daniel Dunbar58f78332009-09-17 06:53:36 +00002605 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002606 // others.
2607 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002608 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002609 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002610 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002611 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002612 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002613 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002614 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002615 }
2616
Chad Rosier86b82082012-12-12 20:06:31 +00002617 // Don't warn about unused -flto. This can happen when we're preprocessing or
2618 // precompiling.
2619 Args.ClaimAllArgs(options::OPT_flto);
2620
Daniel Dunbar945577c2009-10-29 02:24:45 +00002621 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002622 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2623 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002624 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002625 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002626
2627 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2628 // (-ansi is equivalent to -std=c89).
2629 //
2630 // If a std is supplied, only add -trigraphs if it follows the
2631 // option.
2632 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2633 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002634 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002635 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002636 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002637 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002638 else
2639 Std->render(Args, CmdArgs);
2640
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002641 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2642 options::OPT_trigraphs))
2643 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002644 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002645 } else {
2646 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002647 //
2648 // FIXME: Clang doesn't correctly handle -std= when the input language
2649 // doesn't match. For the time being just ignore this for C++ inputs;
2650 // eventually we want to do all the standard defaulting here instead of
2651 // splitting it between the driver and clang -cc1.
2652 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002653 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2654 "-std=", /*Joined=*/true);
2655 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2656 CmdArgs.push_back("-std=c++11");
2657
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002658 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002659 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002660
Chandler Carruthb009b142011-04-23 06:30:43 +00002661 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2662 // '-fconst-strings'; this better indicates its actual behavior.
2663 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2664 false)) {
2665 // For perfect compatibility with GCC, we do this even in the presence of
2666 // '-w'. This flag names something other than a warning for GCC.
2667 CmdArgs.push_back("-fconst-strings");
2668 }
2669
Chandler Carruth61fbf622011-04-23 09:27:53 +00002670 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002671 // during C++ compilation, which it is by default. GCC keeps this define even
2672 // in the presence of '-w', match this behavior bug-for-bug.
2673 if (types::isCXX(InputType) &&
2674 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2675 true)) {
2676 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002677 }
2678
Chandler Carruthe0391482010-05-22 02:21:53 +00002679 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2680 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2681 if (Asm->getOption().matches(options::OPT_fasm))
2682 CmdArgs.push_back("-fgnu-keywords");
2683 else
2684 CmdArgs.push_back("-fno-gnu-keywords");
2685 }
2686
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002687 if (ShouldDisableCFI(Args, getToolChain()))
2688 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002689
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002690 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2691 CmdArgs.push_back("-fno-dwarf-directory-asm");
2692
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002693 if (ShouldDisableAutolink(Args, getToolChain()))
2694 CmdArgs.push_back("-fno-autolink");
2695
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002696 // Add in -fdebug-compilation-dir if necessary.
2697 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002698
Richard Smith9a568822011-11-21 19:36:32 +00002699 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2700 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002701 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002702 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002703 }
2704
Richard Smith9a568822011-11-21 19:36:32 +00002705 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2706 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002707 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002708 }
2709
Richard Smitha3d3bd22013-05-08 02:12:03 +00002710 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2711 CmdArgs.push_back("-fconstexpr-steps");
2712 CmdArgs.push_back(A->getValue());
2713 }
2714
Richard Smithb3a14522013-02-22 01:59:51 +00002715 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2716 CmdArgs.push_back("-fbracket-depth");
2717 CmdArgs.push_back(A->getValue());
2718 }
2719
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002720 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2721 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002722 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002723 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002724 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2725 } else
2726 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002727 }
2728
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002729
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002730 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002731 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002732
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002733 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2734 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002735 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002736 }
David Chisnall5778fce2009-08-31 16:41:57 +00002737
Chris Lattnere23003d2010-01-09 21:54:33 +00002738 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2739 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002740 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002741 }
2742
Chris Lattnerb35583d2010-04-07 20:49:23 +00002743 CmdArgs.push_back("-ferror-limit");
2744 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002745 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002746 else
2747 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002748
Chandler Carrutha77a7272010-05-06 04:55:18 +00002749 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2750 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002751 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002752 }
2753
2754 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2755 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002756 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002757 }
2758
Richard Smithf6f003a2011-12-16 19:06:07 +00002759 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2760 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002761 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002762 }
2763
Daniel Dunbar2c978472009-11-04 06:24:47 +00002764 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002765 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002766 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002767 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002768 } else {
2769 // If -fmessage-length=N was not specified, determine whether this is a
2770 // terminal and, if so, implicitly define -fmessage-length appropriately.
2771 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002772 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002773 }
2774
John McCallb4a99d32013-02-19 01:57:35 +00002775 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2776 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2777 options::OPT_fvisibility_ms_compat)) {
2778 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2779 CmdArgs.push_back("-fvisibility");
2780 CmdArgs.push_back(A->getValue());
2781 } else {
2782 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2783 CmdArgs.push_back("-fvisibility");
2784 CmdArgs.push_back("hidden");
2785 CmdArgs.push_back("-ftype-visibility");
2786 CmdArgs.push_back("default");
2787 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002788 }
2789
Douglas Gregor08329632010-06-15 17:05:35 +00002790 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002791
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002792 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2793
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002794 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002795 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2796 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002797 CmdArgs.push_back("-ffreestanding");
2798
Daniel Dunbare357d562009-12-03 18:42:11 +00002799 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002800 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002801 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002802 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002803 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002804 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002805 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002806 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2807 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002808
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002809 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smith52be6192012-11-05 22:04:41 +00002810 Sanitize.addArgs(Args, CmdArgs);
2811
Will Dietz3676d562012-12-30 20:53:28 +00002812 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2813 options::OPT_fno_sanitize_recover,
2814 true))
2815 CmdArgs.push_back("-fno-sanitize-recover");
2816
Chad Rosierae229d52013-01-29 23:31:22 +00002817 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2818 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2819 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2820 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2821
Eric Christopher459d2712013-02-19 06:16:53 +00002822 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002823 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2824 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2825 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2826 D.Diag(diag::err_drv_argument_only_allowed_with)
2827 << A->getAsString(Args) << "ppc/ppc64";
2828
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002829 if (getToolChain().SupportsProfiling())
2830 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002831
2832 // -flax-vector-conversions is default.
2833 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2834 options::OPT_fno_lax_vector_conversions))
2835 CmdArgs.push_back("-fno-lax-vector-conversions");
2836
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002837 if (Args.getLastArg(options::OPT_fapple_kext))
2838 CmdArgs.push_back("-fapple-kext");
2839
David Blaikie690f21e2012-06-14 18:55:27 +00002840 if (Args.hasFlag(options::OPT_frewrite_includes,
2841 options::OPT_fno_rewrite_includes, false))
2842 CmdArgs.push_back("-frewrite-includes");
2843
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002844 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002845 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002846 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002847 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2848 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002849
2850 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2851 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002852 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002853 }
2854
Bob Wilson14adb362012-02-03 06:27:22 +00002855 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002856
Chandler Carruth6e501032011-03-27 00:04:55 +00002857 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2858 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2859 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2860 options::OPT_fno_wrapv)) {
2861 if (A->getOption().matches(options::OPT_fwrapv))
2862 CmdArgs.push_back("-fwrapv");
2863 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2864 options::OPT_fno_strict_overflow)) {
2865 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2866 CmdArgs.push_back("-fwrapv");
2867 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002868 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002869 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002870
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002871 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2872
Mahesha S6a682be42012-10-27 07:47:56 +00002873
Daniel Dunbar4930e332009-11-17 08:07:36 +00002874 // -stack-protector=0 is default.
2875 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002876 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2877 options::OPT_fstack_protector_all,
2878 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002879 if (A->getOption().matches(options::OPT_fstack_protector))
2880 StackProtectorLevel = 1;
2881 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2882 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002883 } else {
2884 StackProtectorLevel =
2885 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2886 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002887 if (StackProtectorLevel) {
2888 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002889 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002890 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002891
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002892 // --param ssp-buffer-size=
2893 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2894 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002895 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002896 if (Str.startswith("ssp-buffer-size=")) {
2897 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002898 CmdArgs.push_back("-stack-protector-buffer-size");
2899 // FIXME: Verify the argument is a valid integer.
2900 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002901 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002902 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002903 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002904 }
2905
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002906 // Translate -mstackrealign
2907 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2908 false)) {
2909 CmdArgs.push_back("-backend-option");
2910 CmdArgs.push_back("-force-align-stack");
2911 }
2912 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2913 false)) {
2914 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2915 }
2916
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002917 if (Args.hasArg(options::OPT_mstack_alignment)) {
2918 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2919 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002920 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002921 // -mkernel implies -mstrict-align; don't add the redundant option.
2922 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002923 CmdArgs.push_back("-backend-option");
2924 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002925 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002926
Daniel Dunbard18049a2009-04-07 21:16:11 +00002927 // Forward -f options with positive and negative forms; we translate
2928 // these by hand.
2929
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002930 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002931 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002932 CmdArgs.push_back("-fapple-kext");
2933 if (!Args.hasArg(options::OPT_fbuiltin))
2934 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002935 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002936 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002937 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002938 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002939 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002940
Nuno Lopes13c88c72009-12-16 16:59:22 +00002941 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2942 options::OPT_fno_assume_sane_operator_new))
2943 CmdArgs.push_back("-fno-assume-sane-operator-new");
2944
Daniel Dunbar4930e332009-11-17 08:07:36 +00002945 // -fblocks=0 is default.
2946 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002947 getToolChain().IsBlocksDefault()) ||
2948 (Args.hasArg(options::OPT_fgnu_runtime) &&
2949 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2950 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002951 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002952
2953 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2954 !getToolChain().hasBlocksRuntime())
2955 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002956 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002957
Douglas Gregor226173a2012-01-18 15:19:58 +00002958 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2959 // users must also pass -fcxx-modules. The latter flag will disappear once the
2960 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002961 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002962 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2963 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2964 options::OPT_fno_cxx_modules,
2965 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002966 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002967 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002968 HaveModules = true;
2969 }
2970 }
2971
Douglas Gregor35b04d62013-02-07 19:01:24 +00002972 // If a module path was provided, pass it along. Otherwise, use a temporary
2973 // directory.
2974 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2975 A->claim();
2976 if (HaveModules) {
2977 A->render(Args, CmdArgs);
2978 }
2979 } else if (HaveModules) {
2980 SmallString<128> DefaultModuleCache;
2981 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2982 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00002983 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2984 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00002985 const char Arg[] = "-fmodules-cache-path=";
2986 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2987 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00002988 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2989 }
2990
2991 // Pass through all -fmodules-ignore-macro arguments.
2992 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00002993 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
2994 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00002995
John McCalldfea9982010-04-09 19:12:06 +00002996 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002997 if (Args.hasFlag(options::OPT_fno_access_control,
2998 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002999 false))
John McCall3155f572010-04-09 19:03:51 +00003000 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003001
Anders Carlssond470fef2010-11-21 00:09:52 +00003002 // -felide-constructors is the default.
3003 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3004 options::OPT_felide_constructors,
3005 false))
3006 CmdArgs.push_back("-fno-elide-constructors");
3007
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003008 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003009 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003010 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003011 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003012
Richard Smith52be6192012-11-05 22:04:41 +00003013 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003014 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003015 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003016 Args.getLastArg(options::OPT_mkernel,
3017 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003018 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003019 D.Diag(diag::err_drv_argument_not_allowed_with)
3020 << "-fsanitize=vptr" << NoRttiArg;
3021 }
3022 }
3023
Tony Linthicum76329bf2011-12-12 21:14:55 +00003024 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003025 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003026 options::OPT_fno_short_enums,
3027 getToolChain().getTriple().getArch() ==
3028 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003029 CmdArgs.push_back("-fshort-enums");
3030
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003031 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003032 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003033 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003034 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003035
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003036 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003037 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003038 options::OPT_fno_threadsafe_statics))
3039 CmdArgs.push_back("-fno-threadsafe-statics");
3040
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003041 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003042 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3043 options::OPT_fno_use_cxa_atexit,
3044 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003045 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00003046 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
3047 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003048 CmdArgs.push_back("-fno-use-cxa-atexit");
3049
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003050 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003051 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003052 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3053 CmdArgs.push_back("-fms-extensions");
3054
Francois Pichet1b4f1632011-09-17 04:32:15 +00003055 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003056 if (Args.hasFlag(options::OPT_fms_compatibility,
3057 options::OPT_fno_ms_compatibility,
3058 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3059 Args.hasFlag(options::OPT_fms_extensions,
3060 options::OPT_fno_ms_extensions,
3061 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003062 CmdArgs.push_back("-fms-compatibility");
3063
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003064 // -fmsc-version=1300 is default.
3065 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3066 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3067 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003068 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003069 if (msc_ver.empty())
3070 CmdArgs.push_back("-fmsc-version=1300");
3071 else
3072 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3073 }
3074
3075
Eric Christopher5ecce122013-02-18 00:38:31 +00003076 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003077 if (Args.hasFlag(options::OPT_fborland_extensions,
3078 options::OPT_fno_borland_extensions, false))
3079 CmdArgs.push_back("-fborland-extensions");
3080
Francois Pichet02744872011-09-01 16:38:08 +00003081 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3082 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003083 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3084 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003085 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003086 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003087
Chandler Carruthe03aa552010-04-17 20:17:31 +00003088 // -fgnu-keywords default varies depending on language; only pass if
3089 // specified.
3090 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003091 options::OPT_fno_gnu_keywords))
3092 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003093
Rafael Espindola922a6242011-06-02 17:30:53 +00003094 if (Args.hasFlag(options::OPT_fgnu89_inline,
3095 options::OPT_fno_gnu89_inline,
3096 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003097 CmdArgs.push_back("-fgnu89-inline");
3098
Chad Rosier9c76d242012-03-15 22:31:42 +00003099 if (Args.hasArg(options::OPT_fno_inline))
3100 CmdArgs.push_back("-fno-inline");
3101
Chad Rosier64d6be92012-03-06 21:17:19 +00003102 if (Args.hasArg(options::OPT_fno_inline_functions))
3103 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003104
John McCall5fb5df92012-06-20 06:18:46 +00003105 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003106
John McCall5fb5df92012-06-20 06:18:46 +00003107 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3108 // legacy is the default.
3109 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003110 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3111 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003112 objcRuntime.isLegacyDispatchDefaultForArch(
3113 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003114 if (getToolChain().UseObjCMixedDispatch())
3115 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3116 else
3117 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3118 }
3119 }
3120
Nico Weber97bd94b2012-03-09 21:19:44 +00003121 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3122 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00003123 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00003124 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3125 }
3126
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003127 // -fencode-extended-block-signature=1 is default.
3128 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3129 CmdArgs.push_back("-fencode-extended-block-signature");
3130 }
3131
John McCall24fc0de2011-07-06 00:26:06 +00003132 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3133 // NOTE: This logic is duplicated in ToolChains.cpp.
3134 bool ARC = isObjCAutoRefCount(Args);
3135 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003136 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003137
John McCall24fc0de2011-07-06 00:26:06 +00003138 CmdArgs.push_back("-fobjc-arc");
3139
Chandler Carruth491db322011-11-04 07:34:47 +00003140 // FIXME: It seems like this entire block, and several around it should be
3141 // wrapped in isObjC, but for now we just use it here as this is where it
3142 // was being used previously.
3143 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3144 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3145 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3146 else
3147 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3148 }
3149
John McCall24fc0de2011-07-06 00:26:06 +00003150 // Allow the user to enable full exceptions code emission.
3151 // We define off for Objective-CC, on for Objective-C++.
3152 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3153 options::OPT_fno_objc_arc_exceptions,
3154 /*default*/ types::isCXX(InputType)))
3155 CmdArgs.push_back("-fobjc-arc-exceptions");
3156 }
3157
3158 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3159 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003160 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003161 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003162
John McCall24fc0de2011-07-06 00:26:06 +00003163 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3164 // takes precedence.
3165 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3166 if (!GCArg)
3167 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3168 if (GCArg) {
3169 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003170 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003171 << GCArg->getAsString(Args);
3172 } else if (getToolChain().SupportsObjCGC()) {
3173 GCArg->render(Args, CmdArgs);
3174 } else {
3175 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003176 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003177 << GCArg->getAsString(Args);
3178 }
3179 }
3180
John McCallb5f652e2011-06-22 00:53:57 +00003181 // Add exception args.
3182 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003183 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003184
3185 if (getToolChain().UseSjLjExceptions())
3186 CmdArgs.push_back("-fsjlj-exceptions");
3187
3188 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003189 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3190 options::OPT_fno_assume_sane_operator_new))
3191 CmdArgs.push_back("-fno-assume-sane-operator-new");
3192
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003193 // -fconstant-cfstrings is default, and may be subject to argument translation
3194 // on Darwin.
3195 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3196 options::OPT_fno_constant_cfstrings) ||
3197 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3198 options::OPT_mno_constant_cfstrings))
3199 CmdArgs.push_back("-fno-constant-cfstrings");
3200
John Thompsoned4e2952009-11-05 20:14:16 +00003201 // -fshort-wchar default varies depending on platform; only
3202 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003203 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3204 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003205
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003206 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3207 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003208 //
3209 // FIXME: This is gross; that translation should be pulled from the
3210 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003211 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003212 options::OPT_fno_pascal_strings,
3213 false) ||
3214 Args.hasFlag(options::OPT_mpascal_strings,
3215 options::OPT_mno_pascal_strings,
3216 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003217 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003218
Daniel Dunbar096ed292011-10-05 21:04:55 +00003219 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3220 // -fno-pack-struct doesn't apply to -fpack-struct=.
3221 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003222 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003223 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003224 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003225 } else if (Args.hasFlag(options::OPT_fpack_struct,
3226 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003227 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003228 }
3229
Eric Christopher8d56caa2013-02-18 01:16:37 +00003230 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003231 if (!Args.hasArg(options::OPT_fcommon))
3232 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003233 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003234 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003235
Daniel Dunbard18049a2009-04-07 21:16:11 +00003236 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003237 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003238 CmdArgs.push_back("-fno-common");
3239
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003240 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003241 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003242 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003243 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003244 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003245 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3246
Daniel Dunbar6358d682010-10-15 22:30:42 +00003247 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3248 if (!Args.hasFlag(options::OPT_ffor_scope,
3249 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003250 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003251 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3252
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003253 // -fcaret-diagnostics is default.
3254 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3255 options::OPT_fno_caret_diagnostics, true))
3256 CmdArgs.push_back("-fno-caret-diagnostics");
3257
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003258 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003259 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003260 options::OPT_fno_diagnostics_fixit_info))
3261 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003262
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003263 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003264 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003265 options::OPT_fno_diagnostics_show_option))
3266 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003267
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003268 if (const Arg *A =
3269 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3270 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003271 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003272 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003273
Douglas Gregor643c9222011-05-21 17:07:29 +00003274 if (const Arg *A =
3275 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3276 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003277 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003278 }
3279
Chandler Carruthb6766f02011-03-27 01:50:55 +00003280 if (Arg *A = Args.getLastArg(
3281 options::OPT_fdiagnostics_show_note_include_stack,
3282 options::OPT_fno_diagnostics_show_note_include_stack)) {
3283 if (A->getOption().matches(
3284 options::OPT_fdiagnostics_show_note_include_stack))
3285 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3286 else
3287 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3288 }
3289
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003290 // Color diagnostics are the default, unless the terminal doesn't support
3291 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003292 // Support both clang's -f[no-]color-diagnostics and gcc's
3293 // -f[no-]diagnostics-colors[=never|always|auto].
3294 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3295 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3296 it != ie; ++it) {
3297 const Option &O = (*it)->getOption();
3298 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3299 !O.matches(options::OPT_fdiagnostics_color) &&
3300 !O.matches(options::OPT_fno_color_diagnostics) &&
3301 !O.matches(options::OPT_fno_diagnostics_color) &&
3302 !O.matches(options::OPT_fdiagnostics_color_EQ))
3303 continue;
3304
3305 (*it)->claim();
3306 if (O.matches(options::OPT_fcolor_diagnostics) ||
3307 O.matches(options::OPT_fdiagnostics_color)) {
3308 ShowColors = Colors_On;
3309 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3310 O.matches(options::OPT_fno_diagnostics_color)) {
3311 ShowColors = Colors_Off;
3312 } else {
3313 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3314 StringRef value((*it)->getValue());
3315 if (value == "always")
3316 ShowColors = Colors_On;
3317 else if (value == "never")
3318 ShowColors = Colors_Off;
3319 else if (value == "auto")
3320 ShowColors = Colors_Auto;
3321 else
3322 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3323 << ("-fdiagnostics-color=" + value).str();
3324 }
3325 }
3326 if (ShowColors == Colors_On ||
3327 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003328 CmdArgs.push_back("-fcolor-diagnostics");
3329
Daniel Dunbardb097022009-06-08 21:13:54 +00003330 if (!Args.hasFlag(options::OPT_fshow_source_location,
3331 options::OPT_fno_show_source_location))
3332 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003333
Douglas Gregor643c9222011-05-21 17:07:29 +00003334 if (!Args.hasFlag(options::OPT_fshow_column,
3335 options::OPT_fno_show_column,
3336 true))
3337 CmdArgs.push_back("-fno-show-column");
3338
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003339 if (!Args.hasFlag(options::OPT_fspell_checking,
3340 options::OPT_fno_spell_checking))
3341 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003342
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003343
Chad Rosierc8e56e82012-12-05 21:08:21 +00003344 // -fno-asm-blocks is default.
3345 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3346 false))
3347 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003348
Chad Rosier679b0752013-04-24 18:29:59 +00003349 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3350 // This alias option is being used to simplify the hasFlag logic.
3351 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3352 options::OPT_fvectorize;
3353
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003354 // -fvectorize is default.
Chad Rosier679b0752013-04-24 18:29:59 +00003355 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003356 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003357 CmdArgs.push_back("-backend-option");
3358 CmdArgs.push_back("-vectorize-loops");
3359 }
3360
Hal Finkel061f1652012-12-11 19:59:32 +00003361 // -fno-slp-vectorize is default.
3362 if (Args.hasFlag(options::OPT_fslp_vectorize,
3363 options::OPT_fno_slp_vectorize, false)) {
3364 CmdArgs.push_back("-backend-option");
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003365 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003366 }
3367
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003368 // -fno-slp-vectorize-aggressive is default.
3369 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3370 options::OPT_fno_slp_vectorize_aggressive, false)) {
3371 CmdArgs.push_back("-backend-option");
3372 CmdArgs.push_back("-vectorize-slp-aggressive");
3373 }
3374
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003375 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3376 A->render(Args, CmdArgs);
3377
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003378 // -fdollars-in-identifiers default varies depending on platform and
3379 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003380 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003381 options::OPT_fno_dollars_in_identifiers)) {
3382 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003383 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003384 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003385 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003386 }
3387
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003388 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3389 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003390 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003391 options::OPT_fno_unit_at_a_time)) {
3392 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003393 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003394 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003395
Eli Friedman055c9702011-11-02 01:53:16 +00003396 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3397 options::OPT_fno_apple_pragma_pack, false))
3398 CmdArgs.push_back("-fapple-pragma-pack");
3399
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003400 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003401 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003402 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003403#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003404 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003405 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3406 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3407 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3408 CmdArgs.push_back("-fno-builtin-strcat");
3409 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3410 CmdArgs.push_back("-fno-builtin-strcpy");
3411 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003412#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003413
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003414 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003415 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003416 options::OPT_traditional_cpp)) {
3417 if (isa<PreprocessJobAction>(JA))
3418 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003419 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003420 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003421 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003422
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003423 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003424 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003425
3426 // Handle serialized diagnostics.
3427 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3428 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003429 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003430 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003431
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003432 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3433 CmdArgs.push_back("-fretain-comments-from-system-headers");
3434
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003435 // Forward -fcomment-block-commands to -cc1.
3436 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003437 // Forward -fparse-all-comments to -cc1.
3438 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003439
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003440 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3441 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003442 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003443 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3444 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003445 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003446
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003447 // We translate this by hand to the -cc1 argument, since nightly test uses
3448 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003449 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003450 CmdArgs.push_back("-disable-llvm-optzns");
3451 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003452 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003453 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003454
Daniel Dunbard67a3222009-03-30 06:36:42 +00003455 if (Output.getType() == types::TY_Dependencies) {
3456 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003457 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003458 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003459 CmdArgs.push_back(Output.getFilename());
3460 } else {
3461 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003462 }
3463
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003464 for (InputInfoList::const_iterator
3465 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3466 const InputInfo &II = *it;
3467 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003468 if (Args.hasArg(options::OPT_rewrite_objc))
3469 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3470 else
3471 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003472 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003473 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003474 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003475 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003476 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003477
Chris Lattnere9d7d782009-11-03 19:50:27 +00003478 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3479
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003480 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003481
3482 // Optionally embed the -cc1 level arguments into the debug info, for build
3483 // analysis.
3484 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003485 ArgStringList OriginalArgs;
3486 for (ArgList::const_iterator it = Args.begin(),
3487 ie = Args.end(); it != ie; ++it)
3488 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003489
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003490 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003491 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003492 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003493 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003494 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003495 }
3496 CmdArgs.push_back("-dwarf-debug-flags");
3497 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3498 }
3499
Eric Christopherd3804002013-02-22 20:12:52 +00003500 // Add the split debug info name to the command lines here so we
3501 // can propagate it to the backend.
3502 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3503 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003504 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003505 const char *SplitDwarfOut;
3506 if (SplitDwarf) {
3507 CmdArgs.push_back("-split-dwarf-file");
3508 SplitDwarfOut = SplitDebugName(Args, Inputs);
3509 CmdArgs.push_back(SplitDwarfOut);
3510 }
3511
3512 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003513 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003514
Eric Christopherf1545832013-02-22 23:50:16 +00003515 // Handle the debug info splitting at object creation time if we're
3516 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003517 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003518 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003519 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003520
Roman Divacky178e01602011-02-10 16:52:03 +00003521 if (Arg *A = Args.getLastArg(options::OPT_pg))
3522 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003523 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003524 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003525
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003526 // Claim some arguments which clang supports automatically.
3527
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003528 // -fpch-preprocess is used with gcc to add a special marker in the output to
3529 // include the PCH file. Clang's PTH solution is completely transparent, so we
3530 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003531 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003532
Daniel Dunbar17731772009-03-23 19:03:36 +00003533 // Claim some arguments which clang doesn't support, but we don't
3534 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003535 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3536 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003537
Rafael Espindolad95a8122011-03-01 05:25:27 +00003538 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003539 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003540 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003541}
3542
Jim Grosbach576452b2012-02-10 20:37:10 +00003543void ClangAs::AddARMTargetArgs(const ArgList &Args,
3544 ArgStringList &CmdArgs) const {
3545 const Driver &D = getToolChain().getDriver();
3546 llvm::Triple Triple = getToolChain().getTriple();
3547
3548 // Set the CPU based on -march= and -mcpu=.
3549 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003550 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003551
3552 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003553 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003554 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003555
3556 // Honor -mfpmath=.
3557 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003558 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003559}
3560
Benjamin Kramerb164d672013-02-22 20:55:17 +00003561void ClangAs::AddX86TargetArgs(const ArgList &Args,
3562 ArgStringList &CmdArgs) const {
3563 // Set the CPU based on -march=.
3564 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3565 CmdArgs.push_back("-target-cpu");
3566 CmdArgs.push_back(CPUName);
3567 }
3568}
3569
John McCall5fb5df92012-06-20 06:18:46 +00003570/// Add options related to the Objective-C runtime/ABI.
3571///
3572/// Returns true if the runtime is non-fragile.
3573ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3574 ArgStringList &cmdArgs,
3575 RewriteKind rewriteKind) const {
3576 // Look for the controlling runtime option.
3577 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3578 options::OPT_fgnu_runtime,
3579 options::OPT_fobjc_runtime_EQ);
3580
3581 // Just forward -fobjc-runtime= to the frontend. This supercedes
3582 // options about fragility.
3583 if (runtimeArg &&
3584 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3585 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003586 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003587 if (runtime.tryParse(value)) {
3588 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3589 << value;
3590 }
3591
3592 runtimeArg->render(args, cmdArgs);
3593 return runtime;
3594 }
3595
3596 // Otherwise, we'll need the ABI "version". Version numbers are
3597 // slightly confusing for historical reasons:
3598 // 1 - Traditional "fragile" ABI
3599 // 2 - Non-fragile ABI, version 1
3600 // 3 - Non-fragile ABI, version 2
3601 unsigned objcABIVersion = 1;
3602 // If -fobjc-abi-version= is present, use that to set the version.
3603 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003604 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003605 if (value == "1")
3606 objcABIVersion = 1;
3607 else if (value == "2")
3608 objcABIVersion = 2;
3609 else if (value == "3")
3610 objcABIVersion = 3;
3611 else
3612 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3613 << value;
3614 } else {
3615 // Otherwise, determine if we are using the non-fragile ABI.
3616 bool nonFragileABIIsDefault =
3617 (rewriteKind == RK_NonFragile ||
3618 (rewriteKind == RK_None &&
3619 getToolChain().IsObjCNonFragileABIDefault()));
3620 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3621 options::OPT_fno_objc_nonfragile_abi,
3622 nonFragileABIIsDefault)) {
3623 // Determine the non-fragile ABI version to use.
3624#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3625 unsigned nonFragileABIVersion = 1;
3626#else
3627 unsigned nonFragileABIVersion = 2;
3628#endif
3629
3630 if (Arg *abiArg = args.getLastArg(
3631 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003632 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003633 if (value == "1")
3634 nonFragileABIVersion = 1;
3635 else if (value == "2")
3636 nonFragileABIVersion = 2;
3637 else
3638 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3639 << value;
3640 }
3641
3642 objcABIVersion = 1 + nonFragileABIVersion;
3643 } else {
3644 objcABIVersion = 1;
3645 }
3646 }
3647
3648 // We don't actually care about the ABI version other than whether
3649 // it's non-fragile.
3650 bool isNonFragile = objcABIVersion != 1;
3651
3652 // If we have no runtime argument, ask the toolchain for its default runtime.
3653 // However, the rewriter only really supports the Mac runtime, so assume that.
3654 ObjCRuntime runtime;
3655 if (!runtimeArg) {
3656 switch (rewriteKind) {
3657 case RK_None:
3658 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3659 break;
3660 case RK_Fragile:
3661 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3662 break;
3663 case RK_NonFragile:
3664 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3665 break;
3666 }
3667
3668 // -fnext-runtime
3669 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3670 // On Darwin, make this use the default behavior for the toolchain.
3671 if (getToolChain().getTriple().isOSDarwin()) {
3672 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3673
3674 // Otherwise, build for a generic macosx port.
3675 } else {
3676 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3677 }
3678
3679 // -fgnu-runtime
3680 } else {
3681 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003682 // Legacy behaviour is to target the gnustep runtime if we are i
3683 // non-fragile mode or the GCC runtime in fragile mode.
3684 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003685 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003686 else
3687 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003688 }
3689
3690 cmdArgs.push_back(args.MakeArgString(
3691 "-fobjc-runtime=" + runtime.getAsString()));
3692 return runtime;
3693}
3694
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003695void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003696 const InputInfo &Output,
3697 const InputInfoList &Inputs,
3698 const ArgList &Args,
3699 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003700 ArgStringList CmdArgs;
3701
3702 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3703 const InputInfo &Input = Inputs[0];
3704
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003705 // Don't warn about "clang -w -c foo.s"
3706 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003707 // and "clang -emit-llvm -c foo.s"
3708 Args.ClaimAllArgs(options::OPT_emit_llvm);
3709 // and "clang -use-gold-plugin -c foo.s"
3710 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003711
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003712 // Invoke ourselves in -cc1as mode.
3713 //
3714 // FIXME: Implement custom jobs for internal actions.
3715 CmdArgs.push_back("-cc1as");
3716
3717 // Add the "effective" target triple.
3718 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003719 std::string TripleStr =
3720 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003721 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3722
3723 // Set the output mode, we currently only expect to be used as a real
3724 // assembler.
3725 CmdArgs.push_back("-filetype");
3726 CmdArgs.push_back("obj");
3727
Eric Christopher45f2e712012-12-18 00:31:10 +00003728 // Set the main file name, so that debug info works even with
3729 // -save-temps or preprocessed assembly.
3730 CmdArgs.push_back("-main-file-name");
3731 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3732
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003733 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003734 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003735
Jim Grosbach576452b2012-02-10 20:37:10 +00003736 // Add target specific cpu and features flags.
3737 switch(getToolChain().getTriple().getArch()) {
3738 default:
3739 break;
3740
3741 case llvm::Triple::arm:
3742 case llvm::Triple::thumb:
3743 AddARMTargetArgs(Args, CmdArgs);
3744 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003745
3746 case llvm::Triple::x86:
3747 case llvm::Triple::x86_64:
3748 AddX86TargetArgs(Args, CmdArgs);
3749 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003750 }
3751
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003752 // Ignore explicit -force_cpusubtype_ALL option.
3753 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003754
Eric Christopherfc3ee562012-01-10 00:38:01 +00003755 // Determine the original source input.
3756 const Action *SourceAction = &JA;
3757 while (SourceAction->getKind() != Action::InputClass) {
3758 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3759 SourceAction = SourceAction->getInputs()[0];
3760 }
3761
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003762 // Forward -g and handle debug info related flags, assuming we are dealing
3763 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003764 if (SourceAction->getType() == types::TY_Asm ||
3765 SourceAction->getType() == types::TY_PP_Asm) {
3766 Args.ClaimAllArgs(options::OPT_g_Group);
3767 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3768 if (!A->getOption().matches(options::OPT_g0))
3769 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003770
3771 // Add the -fdebug-compilation-dir flag if needed.
3772 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003773
3774 // Set the AT_producer to the clang version when using the integrated
3775 // assembler on assembly source files.
3776 CmdArgs.push_back("-dwarf-debug-producer");
3777 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003778 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003779
3780 // Optionally embed the -cc1as level arguments into the debug info, for build
3781 // analysis.
3782 if (getToolChain().UseDwarfDebugFlags()) {
3783 ArgStringList OriginalArgs;
3784 for (ArgList::const_iterator it = Args.begin(),
3785 ie = Args.end(); it != ie; ++it)
3786 (*it)->render(Args, OriginalArgs);
3787
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003788 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003789 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3790 Flags += Exec;
3791 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3792 Flags += " ";
3793 Flags += OriginalArgs[i];
3794 }
3795 CmdArgs.push_back("-dwarf-debug-flags");
3796 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3797 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003798
3799 // FIXME: Add -static support, once we have it.
3800
3801 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3802 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003803 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003804
3805 assert(Output.isFilename() && "Unexpected lipo output.");
3806 CmdArgs.push_back("-o");
3807 CmdArgs.push_back(Output.getFilename());
3808
Daniel Dunbarb440f562010-08-02 02:38:21 +00003809 assert(Input.isFilename() && "Invalid input.");
3810 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003811
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003812 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003813 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003814
3815 // Handle the debug info splitting at object creation time if we're
3816 // creating an object.
3817 // TODO: Currently only works on linux with newer objcopy.
3818 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3819 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3820 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3821 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003822}
3823
Daniel Dunbara3246a02009-03-18 08:07:30 +00003824void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003825 const InputInfo &Output,
3826 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003827 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003828 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003829 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003830 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003831
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003832 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003833 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003834 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003835 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003836 // Don't forward any -g arguments to assembly steps.
3837 if (isa<AssembleJobAction>(JA) &&
3838 A->getOption().matches(options::OPT_g_Group))
3839 continue;
3840
Daniel Dunbar2da02722009-03-19 07:55:12 +00003841 // It is unfortunate that we have to claim here, as this means
3842 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003843 // platforms using a generic gcc, even if we are just using gcc
3844 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003845 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003846 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003847 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003848 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003849
Daniel Dunbar4e295052010-01-25 22:35:08 +00003850 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003851
3852 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003853 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003854 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003855 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003856
3857 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003858 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003859 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003860 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003861 CmdArgs.push_back("ppc64");
3862 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003863 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003864 }
3865
Daniel Dunbar5716d872009-05-02 21:41:52 +00003866 // Try to force gcc to match the tool chain we want, if we recognize
3867 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003868 //
3869 // FIXME: The triple class should directly provide the information we want
3870 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003871 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003872 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003873 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003874 CmdArgs.push_back("-m64");
3875
Daniel Dunbarb440f562010-08-02 02:38:21 +00003876 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003877 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003878 CmdArgs.push_back(Output.getFilename());
3879 } else {
3880 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003881 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003882 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003883
Tony Linthicum76329bf2011-12-12 21:14:55 +00003884 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3885 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003886
3887 // Only pass -x if gcc will understand it; otherwise hope gcc
3888 // understands the suffix correctly. The main use case this would go
3889 // wrong in is for linker inputs if they happened to have an odd
3890 // suffix; really the only way to get this to happen is a command
3891 // like '-x foobar a.c' which will treat a.c like a linker input.
3892 //
3893 // FIXME: For the linker case specifically, can we safely convert
3894 // inputs into '-Wl,' options?
3895 for (InputInfoList::const_iterator
3896 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3897 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003898
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003899 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003900 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3901 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003902 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003903 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003904 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003905 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003906 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003907 else if (II.getType() == types::TY_ModuleFile)
3908 D.Diag(diag::err_drv_no_module_support)
3909 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003910
Daniel Dunbara3246a02009-03-18 08:07:30 +00003911 if (types::canTypeBeUserSpecified(II.getType())) {
3912 CmdArgs.push_back("-x");
3913 CmdArgs.push_back(types::getTypeName(II.getType()));
3914 }
3915
Daniel Dunbarb440f562010-08-02 02:38:21 +00003916 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003917 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003918 else {
3919 const Arg &A = II.getInputArg();
3920
3921 // Reverse translate some rewritten options.
3922 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3923 CmdArgs.push_back("-lstdc++");
3924 continue;
3925 }
3926
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003927 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003928 A.render(Args, CmdArgs);
3929 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003930 }
3931
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003932 const std::string customGCCName = D.getCCCGenericGCCName();
3933 const char *GCCName;
3934 if (!customGCCName.empty())
3935 GCCName = customGCCName.c_str();
3936 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003937 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003938 } else
3939 GCCName = "gcc";
3940
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003941 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003942 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003943 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003944}
3945
Daniel Dunbar4e295052010-01-25 22:35:08 +00003946void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3947 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003948 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003949}
3950
Daniel Dunbar4e295052010-01-25 22:35:08 +00003951void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3952 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003953 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003954}
3955
Daniel Dunbar4e295052010-01-25 22:35:08 +00003956void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3957 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003958 const Driver &D = getToolChain().getDriver();
3959
Daniel Dunbar4e295052010-01-25 22:35:08 +00003960 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003961 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3962 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003963 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003964 else {
3965 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003967 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003968
Daniel Dunbar4e295052010-01-25 22:35:08 +00003969 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003970 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003971}
3972
Daniel Dunbar4e295052010-01-25 22:35:08 +00003973void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3974 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003975 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003976}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003977
Daniel Dunbar4e295052010-01-25 22:35:08 +00003978void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3979 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003980 // The types are (hopefully) good enough.
3981}
3982
Tony Linthicum76329bf2011-12-12 21:14:55 +00003983// Hexagon tools start.
3984void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3985 ArgStringList &CmdArgs) const {
3986
3987}
3988void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3989 const InputInfo &Output,
3990 const InputInfoList &Inputs,
3991 const ArgList &Args,
3992 const char *LinkingOutput) const {
3993
3994 const Driver &D = getToolChain().getDriver();
3995 ArgStringList CmdArgs;
3996
3997 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003998 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003999 CmdArgs.push_back(Args.MakeArgString(MarchString));
4000
4001 RenderExtraToolArgs(JA, CmdArgs);
4002
4003 if (Output.isFilename()) {
4004 CmdArgs.push_back("-o");
4005 CmdArgs.push_back(Output.getFilename());
4006 } else {
4007 assert(Output.isNothing() && "Unexpected output");
4008 CmdArgs.push_back("-fsyntax-only");
4009 }
4010
Matthew Curtise8f80a12012-12-06 17:49:03 +00004011 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4012 if (!SmallDataThreshold.empty())
4013 CmdArgs.push_back(
4014 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004015
Matthew Curtise5df3812012-12-07 17:23:04 +00004016 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4017 options::OPT_Xassembler);
4018
Tony Linthicum76329bf2011-12-12 21:14:55 +00004019 // Only pass -x if gcc will understand it; otherwise hope gcc
4020 // understands the suffix correctly. The main use case this would go
4021 // wrong in is for linker inputs if they happened to have an odd
4022 // suffix; really the only way to get this to happen is a command
4023 // like '-x foobar a.c' which will treat a.c like a linker input.
4024 //
4025 // FIXME: For the linker case specifically, can we safely convert
4026 // inputs into '-Wl,' options?
4027 for (InputInfoList::const_iterator
4028 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4029 const InputInfo &II = *it;
4030
4031 // Don't try to pass LLVM or AST inputs to a generic gcc.
4032 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4033 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4034 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4035 << getToolChain().getTripleString();
4036 else if (II.getType() == types::TY_AST)
4037 D.Diag(clang::diag::err_drv_no_ast_support)
4038 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004039 else if (II.getType() == types::TY_ModuleFile)
4040 D.Diag(diag::err_drv_no_module_support)
4041 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004042
4043 if (II.isFilename())
4044 CmdArgs.push_back(II.getFilename());
4045 else
4046 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4047 II.getInputArg().render(Args, CmdArgs);
4048 }
4049
4050 const char *GCCName = "hexagon-as";
4051 const char *Exec =
4052 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4053 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4054
4055}
4056void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4057 ArgStringList &CmdArgs) const {
4058 // The types are (hopefully) good enough.
4059}
4060
4061void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4062 const InputInfo &Output,
4063 const InputInfoList &Inputs,
4064 const ArgList &Args,
4065 const char *LinkingOutput) const {
4066
Matthew Curtise689b052012-12-06 15:46:07 +00004067 const toolchains::Hexagon_TC& ToolChain =
4068 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4069 const Driver &D = ToolChain.getDriver();
4070
Tony Linthicum76329bf2011-12-12 21:14:55 +00004071 ArgStringList CmdArgs;
4072
Matthew Curtise689b052012-12-06 15:46:07 +00004073 //----------------------------------------------------------------------------
4074 //
4075 //----------------------------------------------------------------------------
4076 bool hasStaticArg = Args.hasArg(options::OPT_static);
4077 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004078 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004079 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4080 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4081 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4082 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004083
Matthew Curtise689b052012-12-06 15:46:07 +00004084 //----------------------------------------------------------------------------
4085 // Silence warnings for various options
4086 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004087
Matthew Curtise689b052012-12-06 15:46:07 +00004088 Args.ClaimAllArgs(options::OPT_g_Group);
4089 Args.ClaimAllArgs(options::OPT_emit_llvm);
4090 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4091 // handled somewhere else.
4092 Args.ClaimAllArgs(options::OPT_static_libgcc);
4093
4094 //----------------------------------------------------------------------------
4095 //
4096 //----------------------------------------------------------------------------
4097 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4098 e = ToolChain.ExtraOpts.end();
4099 i != e; ++i)
4100 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004101
Matthew Curtisf10a5952012-12-06 14:16:43 +00004102 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4103 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004104
Matthew Curtise689b052012-12-06 15:46:07 +00004105 if (buildingLib) {
4106 CmdArgs.push_back("-shared");
4107 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4108 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004109 }
4110
Matthew Curtise689b052012-12-06 15:46:07 +00004111 if (hasStaticArg)
4112 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004113
Matthew Curtise8f80a12012-12-06 17:49:03 +00004114 if (buildPIE && !buildingLib)
4115 CmdArgs.push_back("-pie");
4116
4117 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4118 if (!SmallDataThreshold.empty()) {
4119 CmdArgs.push_back(
4120 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4121 }
4122
Matthew Curtise689b052012-12-06 15:46:07 +00004123 //----------------------------------------------------------------------------
4124 //
4125 //----------------------------------------------------------------------------
4126 CmdArgs.push_back("-o");
4127 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004128
Matthew Curtise689b052012-12-06 15:46:07 +00004129 const std::string MarchSuffix = "/" + MarchString;
4130 const std::string G0Suffix = "/G0";
4131 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4132 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4133 + "/";
4134 const std::string StartFilesDir = RootDir
4135 + "hexagon/lib"
4136 + (buildingLib
4137 ? MarchG0Suffix : MarchSuffix);
4138
4139 //----------------------------------------------------------------------------
4140 // moslib
4141 //----------------------------------------------------------------------------
4142 std::vector<std::string> oslibs;
4143 bool hasStandalone= false;
4144
4145 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4146 ie = Args.filtered_end(); it != ie; ++it) {
4147 (*it)->claim();
4148 oslibs.push_back((*it)->getValue());
4149 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004150 }
Matthew Curtise689b052012-12-06 15:46:07 +00004151 if (oslibs.empty()) {
4152 oslibs.push_back("standalone");
4153 hasStandalone = true;
4154 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004155
Matthew Curtise689b052012-12-06 15:46:07 +00004156 //----------------------------------------------------------------------------
4157 // Start Files
4158 //----------------------------------------------------------------------------
4159 if (incStdLib && incStartFiles) {
4160
4161 if (!buildingLib) {
4162 if (hasStandalone) {
4163 CmdArgs.push_back(
4164 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4165 }
4166 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4167 }
4168 std::string initObj = useShared ? "/initS.o" : "/init.o";
4169 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4170 }
4171
4172 //----------------------------------------------------------------------------
4173 // Library Search Paths
4174 //----------------------------------------------------------------------------
4175 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4176 for (ToolChain::path_list::const_iterator
4177 i = LibPaths.begin(),
4178 e = LibPaths.end();
4179 i != e;
4180 ++i)
4181 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4182
4183 //----------------------------------------------------------------------------
4184 //
4185 //----------------------------------------------------------------------------
4186 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4187 Args.AddAllArgs(CmdArgs, options::OPT_e);
4188 Args.AddAllArgs(CmdArgs, options::OPT_s);
4189 Args.AddAllArgs(CmdArgs, options::OPT_t);
4190 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4191
4192 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4193
4194 //----------------------------------------------------------------------------
4195 // Libraries
4196 //----------------------------------------------------------------------------
4197 if (incStdLib && incDefLibs) {
4198 if (D.CCCIsCXX) {
4199 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4200 CmdArgs.push_back("-lm");
4201 }
4202
4203 CmdArgs.push_back("--start-group");
4204
4205 if (!buildingLib) {
4206 for(std::vector<std::string>::iterator i = oslibs.begin(),
4207 e = oslibs.end(); i != e; ++i)
4208 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4209 CmdArgs.push_back("-lc");
4210 }
4211 CmdArgs.push_back("-lgcc");
4212
4213 CmdArgs.push_back("--end-group");
4214 }
4215
4216 //----------------------------------------------------------------------------
4217 // End files
4218 //----------------------------------------------------------------------------
4219 if (incStdLib && incStartFiles) {
4220 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4221 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4222 }
4223
4224 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4225 C.addCommand(
4226 new Command(
4227 JA, *this,
4228 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004229}
4230// Hexagon tools end.
4231
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004232llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4233 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4234 // archs which Darwin doesn't use.
4235
4236 // The matching this routine does is fairly pointless, since it is neither the
4237 // complete architecture list, nor a reasonable subset. The problem is that
4238 // historically the driver driver accepts this and also ties its -march=
4239 // handling to the architecture name, so we need to be careful before removing
4240 // support for it.
4241
4242 // This code must be kept in sync with Clang's Darwin specific argument
4243 // translation.
4244
4245 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4246 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4247 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4248 .Case("ppc64", llvm::Triple::ppc64)
4249 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4250 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4251 llvm::Triple::x86)
4252 .Case("x86_64", llvm::Triple::x86_64)
4253 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004254 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4255 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4256 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004257 .Case("r600", llvm::Triple::r600)
4258 .Case("nvptx", llvm::Triple::nvptx)
4259 .Case("nvptx64", llvm::Triple::nvptx64)
4260 .Case("amdil", llvm::Triple::amdil)
4261 .Case("spir", llvm::Triple::spir)
4262 .Default(llvm::Triple::UnknownArch);
4263}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004264
Bob Wilsondecc03e2012-11-23 06:14:39 +00004265const char *Clang::getBaseInputName(const ArgList &Args,
4266 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004267 return Args.MakeArgString(
4268 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004269}
4270
Bob Wilsondecc03e2012-11-23 06:14:39 +00004271const char *Clang::getBaseInputStem(const ArgList &Args,
4272 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004273 const char *Str = getBaseInputName(Args, Inputs);
4274
Chris Lattner906bb902011-01-16 08:14:11 +00004275 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004276 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004277
4278 return Str;
4279}
4280
Bob Wilsondecc03e2012-11-23 06:14:39 +00004281const char *Clang::getDependencyFileName(const ArgList &Args,
4282 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004283 // FIXME: Think about this more.
4284 std::string Res;
4285
4286 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004287 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004288 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004289 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004290 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004291 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004292 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004293}
4294
Daniel Dunbarbe220842009-03-20 16:06:39 +00004295void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004296 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004297 const InputInfoList &Inputs,
4298 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004299 const char *LinkingOutput) const {
4300 ArgStringList CmdArgs;
4301
4302 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4303 const InputInfo &Input = Inputs[0];
4304
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004305 // Determine the original source input.
4306 const Action *SourceAction = &JA;
4307 while (SourceAction->getKind() != Action::InputClass) {
4308 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4309 SourceAction = SourceAction->getInputs()[0];
4310 }
4311
4312 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004313 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004314 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004315 if (Args.hasArg(options::OPT_gstabs))
4316 CmdArgs.push_back("--gstabs");
4317 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004318 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004319 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004320
Daniel Dunbarbe220842009-03-20 16:06:39 +00004321 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004322 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004323
Daniel Dunbar6d484762010-07-22 01:47:22 +00004324 // Use -force_cpusubtype_ALL on x86 by default.
4325 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4326 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004327 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4328 CmdArgs.push_back("-force_cpusubtype_ALL");
4329
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004330 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004331 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004332 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004333 (!getDarwinToolChain().isTargetIPhoneOS() ||
4334 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4335 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004336 CmdArgs.push_back("-static");
4337
Daniel Dunbarbe220842009-03-20 16:06:39 +00004338 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4339 options::OPT_Xassembler);
4340
4341 assert(Output.isFilename() && "Unexpected lipo output.");
4342 CmdArgs.push_back("-o");
4343 CmdArgs.push_back(Output.getFilename());
4344
Daniel Dunbarb440f562010-08-02 02:38:21 +00004345 assert(Input.isFilename() && "Invalid input.");
4346 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004347
4348 // asm_final spec is empty.
4349
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004350 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004351 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004352 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004353}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004354
David Blaikie68e081d2011-12-20 02:48:34 +00004355void darwin::DarwinTool::anchor() {}
4356
Daniel Dunbare9ded432009-09-09 18:36:20 +00004357void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4358 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004359 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004360
Daniel Dunbarc1964212009-03-26 16:23:12 +00004361 // Derived from darwin_arch spec.
4362 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004363 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004364
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004365 // FIXME: Is this needed anymore?
4366 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004367 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004368}
4369
Bill Wendling3b2000f2012-10-02 18:02:50 +00004370bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4371 // We only need to generate a temp path for LTO if we aren't compiling object
4372 // files. When compiling source files, we run 'dsymutil' after linking. We
4373 // don't run 'dsymutil' when compiling object files.
4374 for (InputInfoList::const_iterator
4375 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4376 if (it->getType() != types::TY_Object)
4377 return true;
4378
4379 return false;
4380}
4381
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004382void darwin::Link::AddLinkArgs(Compilation &C,
4383 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004384 ArgStringList &CmdArgs,
4385 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004386 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004387 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004388
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004389 unsigned Version[3] = { 0, 0, 0 };
4390 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4391 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004392 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004393 Version[1], Version[2], HadExtra) ||
4394 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004395 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004396 << A->getAsString(Args);
4397 }
4398
4399 // Newer linkers support -demangle, pass it if supported and not disabled by
4400 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004401 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004402 // Don't pass -demangle to ld_classic.
4403 //
4404 // FIXME: This is a temporary workaround, ld should be handling this.
4405 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4406 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004407 if (getToolChain().getArch() == llvm::Triple::x86) {
4408 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4409 options::OPT_Wl_COMMA),
4410 ie = Args.filtered_end(); it != ie; ++it) {
4411 const Arg *A = *it;
4412 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004413 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004414 UsesLdClassic = true;
4415 }
4416 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004417 if (!UsesLdClassic)
4418 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004419 }
4420
Bill Wendling313b6bf2012-11-16 23:03:00 +00004421 // If we are using LTO, then automatically create a temporary file path for
4422 // the linker to use, so that it's lifetime will extend past a possible
4423 // dsymutil step.
4424 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4425 const char *TmpPath = C.getArgs().MakeArgString(
4426 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4427 C.addTempFile(TmpPath);
4428 CmdArgs.push_back("-object_path_lto");
4429 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004430 }
4431
Daniel Dunbarc1964212009-03-26 16:23:12 +00004432 // Derived from the "link" spec.
4433 Args.AddAllArgs(CmdArgs, options::OPT_static);
4434 if (!Args.hasArg(options::OPT_static))
4435 CmdArgs.push_back("-dynamic");
4436 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4437 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4438 // here. How do we wish to handle such things?
4439 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004440
Daniel Dunbarc1964212009-03-26 16:23:12 +00004441 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004442 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004443 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004444 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004445
4446 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4447 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4448 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4449
4450 Arg *A;
4451 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4452 (A = Args.getLastArg(options::OPT_current__version)) ||
4453 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004454 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004455 << A->getAsString(Args) << "-dynamiclib";
4456
4457 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4458 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4459 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4460 } else {
4461 CmdArgs.push_back("-dylib");
4462
4463 Arg *A;
4464 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4465 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4466 (A = Args.getLastArg(options::OPT_client__name)) ||
4467 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4468 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4469 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004470 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004471 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004472
Daniel Dunbarc1964212009-03-26 16:23:12 +00004473 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4474 "-dylib_compatibility_version");
4475 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4476 "-dylib_current_version");
4477
Daniel Dunbara48823f2010-01-22 02:04:52 +00004478 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004479
4480 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4481 "-dylib_install_name");
4482 }
4483
4484 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4485 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4486 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004487 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004488 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004489 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4490 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4491 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4492 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4493 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4494 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004495 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004496 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4497 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4498 Args.AddAllArgs(CmdArgs, options::OPT_init);
4499
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004500 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004501 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004502
4503 // If we had an explicit -mios-simulator-version-min argument, honor that,
4504 // otherwise use the traditional deployment targets. We can't just check the
4505 // is-sim attribute because existing code follows this path, and the linker
4506 // may not handle the argument.
4507 //
4508 // FIXME: We may be able to remove this, once we can verify no one depends on
4509 // it.
4510 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4511 CmdArgs.push_back("-ios_simulator_version_min");
4512 else if (DarwinTC.isTargetIPhoneOS())
4513 CmdArgs.push_back("-iphoneos_version_min");
4514 else
4515 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004516 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004517
Daniel Dunbarc1964212009-03-26 16:23:12 +00004518 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4519 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4520 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4521 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4522 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004523
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004524 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4525 options::OPT_fno_pie,
4526 options::OPT_fno_PIE)) {
4527 if (A->getOption().matches(options::OPT_fpie) ||
4528 A->getOption().matches(options::OPT_fPIE))
4529 CmdArgs.push_back("-pie");
4530 else
4531 CmdArgs.push_back("-no_pie");
4532 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004533
4534 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4535 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4536 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4537 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4538 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4539 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4540 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4541 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4542 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4543 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4544 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4545 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4546 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4547 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4548 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4549 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004550
Daniel Dunbar84384642011-05-02 21:03:47 +00004551 // Give --sysroot= preference, over the Apple specific behavior to also use
4552 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004553 StringRef sysroot = C.getSysRoot();
4554 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004555 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004556 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004557 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4558 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004559 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004560 }
4561
Daniel Dunbarc1964212009-03-26 16:23:12 +00004562 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4563 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4564 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4565 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4566 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004567 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004568 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4569 Args.AddAllArgs(CmdArgs, options::OPT_y);
4570 Args.AddLastArg(CmdArgs, options::OPT_w);
4571 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4572 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4573 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4574 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4575 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4576 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4577 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4578 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4579 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4580 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4581 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4582 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4583}
4584
4585void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004586 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004587 const InputInfoList &Inputs,
4588 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004589 const char *LinkingOutput) const {
4590 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004591
Daniel Dunbarc1964212009-03-26 16:23:12 +00004592 // The logic here is derived from gcc's behavior; most of which
4593 // comes from specs (starting with link_command). Consult gcc for
4594 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004595 ArgStringList CmdArgs;
4596
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004597 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4598 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4599 options::OPT_ccc_arcmt_migrate)) {
4600 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4601 (*I)->claim();
4602 const char *Exec =
4603 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4604 CmdArgs.push_back(Output.getFilename());
4605 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4606 return;
4607 }
4608
Daniel Dunbarc1964212009-03-26 16:23:12 +00004609 // I'm not sure why this particular decomposition exists in gcc, but
4610 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004611 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004612
Daniel Dunbarc1964212009-03-26 16:23:12 +00004613 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4614 Args.AddAllArgs(CmdArgs, options::OPT_s);
4615 Args.AddAllArgs(CmdArgs, options::OPT_t);
4616 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4617 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004618 Args.AddLastArg(CmdArgs, options::OPT_e);
4619 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4620 Args.AddAllArgs(CmdArgs, options::OPT_r);
4621
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004622 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4623 // members of static archive libraries which implement Objective-C classes or
4624 // categories.
4625 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4626 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004627
Bill Wendling58979742012-12-10 21:48:41 +00004628 if (Args.hasArg(options::OPT_rdynamic))
4629 CmdArgs.push_back("-export_dynamic");
4630
Daniel Dunbarc1964212009-03-26 16:23:12 +00004631 CmdArgs.push_back("-o");
4632 CmdArgs.push_back(Output.getFilename());
4633
Chad Rosier06fd3c62012-05-16 23:45:12 +00004634 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004635 !Args.hasArg(options::OPT_nostartfiles)) {
4636 // Derived from startfile spec.
4637 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004638 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004639 if (getDarwinToolChain().isTargetIOSSimulator()) {
4640 // The simulator doesn't have a versioned crt1 file.
4641 CmdArgs.push_back("-ldylib1.o");
4642 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004643 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4644 CmdArgs.push_back("-ldylib1.o");
4645 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004646 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004647 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004648 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004649 CmdArgs.push_back("-ldylib1.10.5.o");
4650 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004651 } else {
4652 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004653 if (!Args.hasArg(options::OPT_static)) {
4654 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004655 if (getDarwinToolChain().isTargetIOSSimulator()) {
4656 // The simulator doesn't have a versioned crt1 file.
4657 CmdArgs.push_back("-lbundle1.o");
4658 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004659 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4660 CmdArgs.push_back("-lbundle1.o");
4661 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004662 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004663 CmdArgs.push_back("-lbundle1.o");
4664 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004665 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004666 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004667 if (Args.hasArg(options::OPT_pg) &&
4668 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004669 if (Args.hasArg(options::OPT_static) ||
4670 Args.hasArg(options::OPT_object) ||
4671 Args.hasArg(options::OPT_preload)) {
4672 CmdArgs.push_back("-lgcrt0.o");
4673 } else {
4674 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004675
Daniel Dunbarc1964212009-03-26 16:23:12 +00004676 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004677 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004678 // By default on OS X 10.8 and later, we don't link with a crt1.o
4679 // file and the linker knows to use _main as the entry point. But,
4680 // when compiling with -pg, we need to link with the gcrt1.o file,
4681 // so pass the -no_new_main option to tell the linker to use the
4682 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004683 if (getDarwinToolChain().isTargetMacOS() &&
4684 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4685 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004686 } else {
4687 if (Args.hasArg(options::OPT_static) ||
4688 Args.hasArg(options::OPT_object) ||
4689 Args.hasArg(options::OPT_preload)) {
4690 CmdArgs.push_back("-lcrt0.o");
4691 } else {
4692 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004693 if (getDarwinToolChain().isTargetIOSSimulator()) {
4694 // The simulator doesn't have a versioned crt1 file.
4695 CmdArgs.push_back("-lcrt1.o");
4696 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004697 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4698 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004699 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004700 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004701 } else {
4702 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4703 CmdArgs.push_back("-lcrt1.o");
4704 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4705 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004706 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004707 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004708
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004709 // darwin_crt2 spec is empty.
4710 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004711 }
4712 }
4713 }
4714 }
4715
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004716 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4717 Args.hasArg(options::OPT_shared_libgcc) &&
4718 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004719 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004720 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004721 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004722 }
4723 }
4724
4725 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004726
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004727 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004728 // If we're building a dynamic lib with -fsanitize=address,
4729 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004730 // of them as dynamic_lookup. Linking executables is handled in
4731 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004732 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004733 if (Args.hasArg(options::OPT_dynamiclib) ||
4734 Args.hasArg(options::OPT_bundle)) {
4735 CmdArgs.push_back("-undefined");
4736 CmdArgs.push_back("dynamic_lookup");
4737 }
4738 }
4739
Daniel Dunbarc1964212009-03-26 16:23:12 +00004740 if (Args.hasArg(options::OPT_fopenmp))
4741 // This is more complicated in gcc...
4742 CmdArgs.push_back("-lgomp");
4743
Douglas Gregor9295df02012-05-15 21:00:27 +00004744 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4745
Bob Wilson16d93952012-05-15 18:57:39 +00004746 if (isObjCRuntimeLinked(Args) &&
4747 !Args.hasArg(options::OPT_nostdlib) &&
4748 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004749 // Avoid linking compatibility stubs on i386 mac.
4750 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004751 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004752 // If we don't have ARC or subscripting runtime support, link in the
4753 // runtime stubs. We have to do this *before* adding any of the normal
4754 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004755 ObjCRuntime runtime =
4756 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004757 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004758 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004759 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004760 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004761 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004762 CmdArgs.push_back("-framework");
4763 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004764 // Link libobj.
4765 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004766 }
John McCall31168b02011-06-15 23:02:42 +00004767
Daniel Dunbarc1964212009-03-26 16:23:12 +00004768 if (LinkingOutput) {
4769 CmdArgs.push_back("-arch_multiple");
4770 CmdArgs.push_back("-final_output");
4771 CmdArgs.push_back(LinkingOutput);
4772 }
4773
Daniel Dunbarc1964212009-03-26 16:23:12 +00004774 if (Args.hasArg(options::OPT_fnested_functions))
4775 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004776
Daniel Dunbarc1964212009-03-26 16:23:12 +00004777 if (!Args.hasArg(options::OPT_nostdlib) &&
4778 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004779 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004780 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004781
Daniel Dunbarc1964212009-03-26 16:23:12 +00004782 // link_ssp spec is empty.
4783
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004784 // Let the tool chain choose which runtime library to link.
4785 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004786 }
4787
Chad Rosier06fd3c62012-05-16 23:45:12 +00004788 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004789 !Args.hasArg(options::OPT_nostartfiles)) {
4790 // endfile_spec is empty.
4791 }
4792
4793 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4794 Args.AddAllArgs(CmdArgs, options::OPT_F);
4795
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004796 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004797 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004798 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004799}
4800
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004801void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004802 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004803 const InputInfoList &Inputs,
4804 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004805 const char *LinkingOutput) const {
4806 ArgStringList CmdArgs;
4807
4808 CmdArgs.push_back("-create");
4809 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004810
4811 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004812 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004813
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004814 for (InputInfoList::const_iterator
4815 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4816 const InputInfo &II = *it;
4817 assert(II.isFilename() && "Unexpected lipo input.");
4818 CmdArgs.push_back(II.getFilename());
4819 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004820 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004821 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004822 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004823}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004824
Daniel Dunbar88299622010-06-04 18:28:36 +00004825void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004826 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004827 const InputInfoList &Inputs,
4828 const ArgList &Args,
4829 const char *LinkingOutput) const {
4830 ArgStringList CmdArgs;
4831
Daniel Dunbareb86b042011-05-09 17:23:16 +00004832 CmdArgs.push_back("-o");
4833 CmdArgs.push_back(Output.getFilename());
4834
Daniel Dunbar88299622010-06-04 18:28:36 +00004835 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4836 const InputInfo &Input = Inputs[0];
4837 assert(Input.isFilename() && "Unexpected dsymutil input.");
4838 CmdArgs.push_back(Input.getFilename());
4839
Daniel Dunbar88299622010-06-04 18:28:36 +00004840 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004841 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004842 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004843}
4844
Eric Christopher551ef452011-08-23 17:56:55 +00004845void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004846 const InputInfo &Output,
4847 const InputInfoList &Inputs,
4848 const ArgList &Args,
4849 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004850 ArgStringList CmdArgs;
4851 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004852 CmdArgs.push_back("--debug-info");
4853 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004854 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004855
4856 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4857 const InputInfo &Input = Inputs[0];
4858 assert(Input.isFilename() && "Unexpected verify input");
4859
4860 // Grabbing the output of the earlier dsymutil run.
4861 CmdArgs.push_back(Input.getFilename());
4862
4863 const char *Exec =
4864 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4865 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4866}
4867
David Chisnallf571cde2012-02-15 13:39:01 +00004868void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4869 const InputInfo &Output,
4870 const InputInfoList &Inputs,
4871 const ArgList &Args,
4872 const char *LinkingOutput) const {
4873 ArgStringList CmdArgs;
4874
4875 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4876 options::OPT_Xassembler);
4877
4878 CmdArgs.push_back("-o");
4879 CmdArgs.push_back(Output.getFilename());
4880
4881 for (InputInfoList::const_iterator
4882 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4883 const InputInfo &II = *it;
4884 CmdArgs.push_back(II.getFilename());
4885 }
4886
4887 const char *Exec =
4888 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4889 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4890}
4891
4892
4893void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4894 const InputInfo &Output,
4895 const InputInfoList &Inputs,
4896 const ArgList &Args,
4897 const char *LinkingOutput) const {
4898 // FIXME: Find a real GCC, don't hard-code versions here
4899 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4900 const llvm::Triple &T = getToolChain().getTriple();
4901 std::string LibPath = "/usr/lib/";
4902 llvm::Triple::ArchType Arch = T.getArch();
4903 switch (Arch) {
4904 case llvm::Triple::x86:
4905 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4906 T.getOSName()).str() + "/4.5.2/";
4907 break;
4908 case llvm::Triple::x86_64:
4909 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4910 T.getOSName()).str();
4911 GCCLibPath += "/4.5.2/amd64/";
4912 LibPath += "amd64/";
4913 break;
4914 default:
4915 assert(0 && "Unsupported architecture");
4916 }
4917
4918 ArgStringList CmdArgs;
4919
David Chisnall272a0712012-02-29 15:06:12 +00004920 // Demangle C++ names in errors
4921 CmdArgs.push_back("-C");
4922
David Chisnallf571cde2012-02-15 13:39:01 +00004923 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4924 (!Args.hasArg(options::OPT_shared))) {
4925 CmdArgs.push_back("-e");
4926 CmdArgs.push_back("_start");
4927 }
4928
4929 if (Args.hasArg(options::OPT_static)) {
4930 CmdArgs.push_back("-Bstatic");
4931 CmdArgs.push_back("-dn");
4932 } else {
4933 CmdArgs.push_back("-Bdynamic");
4934 if (Args.hasArg(options::OPT_shared)) {
4935 CmdArgs.push_back("-shared");
4936 } else {
4937 CmdArgs.push_back("--dynamic-linker");
4938 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4939 }
4940 }
4941
4942 if (Output.isFilename()) {
4943 CmdArgs.push_back("-o");
4944 CmdArgs.push_back(Output.getFilename());
4945 } else {
4946 assert(Output.isNothing() && "Invalid output.");
4947 }
4948
4949 if (!Args.hasArg(options::OPT_nostdlib) &&
4950 !Args.hasArg(options::OPT_nostartfiles)) {
4951 if (!Args.hasArg(options::OPT_shared)) {
4952 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4953 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004954 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004955 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4956 } else {
4957 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004958 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4959 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004960 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004961 if (getToolChain().getDriver().CCCIsCXX)
4962 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004963 }
4964
4965 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4966
4967 Args.AddAllArgs(CmdArgs, options::OPT_L);
4968 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4969 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004970 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004971
4972 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4973
4974 if (!Args.hasArg(options::OPT_nostdlib) &&
4975 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004976 if (getToolChain().getDriver().CCCIsCXX)
4977 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004978 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004979 if (!Args.hasArg(options::OPT_shared)) {
4980 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004981 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004982 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004983 }
David Chisnallf571cde2012-02-15 13:39:01 +00004984 }
4985
4986 if (!Args.hasArg(options::OPT_nostdlib) &&
4987 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004988 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004989 }
David Chisnall96de9932012-02-16 16:00:47 +00004990 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004991
4992 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4993
4994 const char *Exec =
4995 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4996 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4997}
4998
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004999void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005000 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005001 const InputInfoList &Inputs,
5002 const ArgList &Args,
5003 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005004 ArgStringList CmdArgs;
5005
5006 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5007 options::OPT_Xassembler);
5008
5009 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005010 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005011
5012 for (InputInfoList::const_iterator
5013 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5014 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005015 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005016 }
5017
5018 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005019 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005020 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005021}
5022
5023void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005024 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005025 const InputInfoList &Inputs,
5026 const ArgList &Args,
5027 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005028 ArgStringList CmdArgs;
5029
5030 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005031 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005032 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005033 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005034 }
5035
5036 if (Args.hasArg(options::OPT_static)) {
5037 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005038 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005039 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005040// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005041 CmdArgs.push_back("-Bdynamic");
5042 if (Args.hasArg(options::OPT_shared)) {
5043 CmdArgs.push_back("-shared");
5044 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005045 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005046 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5047 }
5048 }
5049
Daniel Dunbarb440f562010-08-02 02:38:21 +00005050 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005051 CmdArgs.push_back("-o");
5052 CmdArgs.push_back(Output.getFilename());
5053 } else {
5054 assert(Output.isNothing() && "Invalid output.");
5055 }
5056
5057 if (!Args.hasArg(options::OPT_nostdlib) &&
5058 !Args.hasArg(options::OPT_nostartfiles)) {
5059 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005060 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005061 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005062 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005063 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005064 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005065 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005066 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005067 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005068 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005069 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005070 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005071 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005072 }
5073
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005074 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5075 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005076 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005077
5078 Args.AddAllArgs(CmdArgs, options::OPT_L);
5079 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5080 Args.AddAllArgs(CmdArgs, options::OPT_e);
5081
Daniel Dunbar54423b22010-09-17 00:24:54 +00005082 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005083
5084 if (!Args.hasArg(options::OPT_nostdlib) &&
5085 !Args.hasArg(options::OPT_nodefaultlibs)) {
5086 // FIXME: For some reason GCC passes -lgcc before adding
5087 // the default system libraries. Just mimic this for now.
5088 CmdArgs.push_back("-lgcc");
5089
5090 if (Args.hasArg(options::OPT_pthread))
5091 CmdArgs.push_back("-pthread");
5092 if (!Args.hasArg(options::OPT_shared))
5093 CmdArgs.push_back("-lc");
5094 CmdArgs.push_back("-lgcc");
5095 }
5096
5097 if (!Args.hasArg(options::OPT_nostdlib) &&
5098 !Args.hasArg(options::OPT_nostartfiles)) {
5099 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005101 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005102 }
5103
Bill Wendling08760582011-06-27 19:15:03 +00005104 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005105
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005106 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005107 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005108 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005109}
5110
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005111void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005112 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005113 const InputInfoList &Inputs,
5114 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005115 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005116 ArgStringList CmdArgs;
5117
5118 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5119 options::OPT_Xassembler);
5120
5121 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005122 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005123
5124 for (InputInfoList::const_iterator
5125 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5126 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005127 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005128 }
5129
5130 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005131 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005132 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005133}
5134
5135void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005136 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005137 const InputInfoList &Inputs,
5138 const ArgList &Args,
5139 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005140 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005141 ArgStringList CmdArgs;
5142
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005143 // Silence warning for "clang -g foo.o -o foo"
5144 Args.ClaimAllArgs(options::OPT_g_Group);
5145 // and "clang -emit-llvm foo.o -o foo"
5146 Args.ClaimAllArgs(options::OPT_emit_llvm);
5147 // and for "clang -w foo.o -o foo". Other warning options are already
5148 // handled somewhere else.
5149 Args.ClaimAllArgs(options::OPT_w);
5150
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005151 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005152 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005153 CmdArgs.push_back("-e");
5154 CmdArgs.push_back("__start");
5155 }
5156
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005157 if (Args.hasArg(options::OPT_static)) {
5158 CmdArgs.push_back("-Bstatic");
5159 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005160 if (Args.hasArg(options::OPT_rdynamic))
5161 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005162 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005163 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005164 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005165 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005166 } else {
5167 CmdArgs.push_back("-dynamic-linker");
5168 CmdArgs.push_back("/usr/libexec/ld.so");
5169 }
5170 }
5171
Rafael Espindola044f7832013-06-05 04:28:55 +00005172 if (Args.hasArg(options::OPT_nopie))
5173 CmdArgs.push_back("-nopie");
5174
Daniel Dunbarb440f562010-08-02 02:38:21 +00005175 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005176 CmdArgs.push_back("-o");
5177 CmdArgs.push_back(Output.getFilename());
5178 } else {
5179 assert(Output.isNothing() && "Invalid output.");
5180 }
5181
5182 if (!Args.hasArg(options::OPT_nostdlib) &&
5183 !Args.hasArg(options::OPT_nostartfiles)) {
5184 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005185 if (Args.hasArg(options::OPT_pg))
5186 CmdArgs.push_back(Args.MakeArgString(
5187 getToolChain().GetFilePath("gcrt0.o")));
5188 else
5189 CmdArgs.push_back(Args.MakeArgString(
5190 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005191 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005192 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005193 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005194 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005195 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005196 }
5197 }
5198
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005199 std::string Triple = getToolChain().getTripleString();
5200 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005201 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005202 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005203 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005204
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005205 Args.AddAllArgs(CmdArgs, options::OPT_L);
5206 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5207 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005208 Args.AddAllArgs(CmdArgs, options::OPT_s);
5209 Args.AddAllArgs(CmdArgs, options::OPT_t);
5210 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5211 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005212
Daniel Dunbar54423b22010-09-17 00:24:54 +00005213 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005214
5215 if (!Args.hasArg(options::OPT_nostdlib) &&
5216 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005217 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005218 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005219 if (Args.hasArg(options::OPT_pg))
5220 CmdArgs.push_back("-lm_p");
5221 else
5222 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005223 }
5224
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005225 // FIXME: For some reason GCC passes -lgcc before adding
5226 // the default system libraries. Just mimic this for now.
5227 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005228
Eric Christopher17674ec2012-09-13 06:32:34 +00005229 if (Args.hasArg(options::OPT_pthread)) {
5230 if (!Args.hasArg(options::OPT_shared) &&
5231 Args.hasArg(options::OPT_pg))
5232 CmdArgs.push_back("-lpthread_p");
5233 else
5234 CmdArgs.push_back("-lpthread");
5235 }
5236
Chandler Carruth45661652011-12-17 22:32:42 +00005237 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005238 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005239 CmdArgs.push_back("-lc_p");
5240 else
5241 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005242 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005243
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005244 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005245 }
5246
5247 if (!Args.hasArg(options::OPT_nostdlib) &&
5248 !Args.hasArg(options::OPT_nostartfiles)) {
5249 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005250 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005251 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005252 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005253 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005254 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005255 }
5256
5257 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005258 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005259 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005260}
Ed Schoutene33194b2009-04-02 19:13:12 +00005261
Eli Friedman9fa28852012-08-08 23:57:20 +00005262void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5263 const InputInfo &Output,
5264 const InputInfoList &Inputs,
5265 const ArgList &Args,
5266 const char *LinkingOutput) const {
5267 ArgStringList CmdArgs;
5268
5269 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5270 options::OPT_Xassembler);
5271
5272 CmdArgs.push_back("-o");
5273 CmdArgs.push_back(Output.getFilename());
5274
5275 for (InputInfoList::const_iterator
5276 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5277 const InputInfo &II = *it;
5278 CmdArgs.push_back(II.getFilename());
5279 }
5280
5281 const char *Exec =
5282 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5283 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5284}
5285
5286void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5287 const InputInfo &Output,
5288 const InputInfoList &Inputs,
5289 const ArgList &Args,
5290 const char *LinkingOutput) const {
5291 const Driver &D = getToolChain().getDriver();
5292 ArgStringList CmdArgs;
5293
5294 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5295 (!Args.hasArg(options::OPT_shared))) {
5296 CmdArgs.push_back("-e");
5297 CmdArgs.push_back("__start");
5298 }
5299
5300 if (Args.hasArg(options::OPT_static)) {
5301 CmdArgs.push_back("-Bstatic");
5302 } else {
5303 if (Args.hasArg(options::OPT_rdynamic))
5304 CmdArgs.push_back("-export-dynamic");
5305 CmdArgs.push_back("--eh-frame-hdr");
5306 CmdArgs.push_back("-Bdynamic");
5307 if (Args.hasArg(options::OPT_shared)) {
5308 CmdArgs.push_back("-shared");
5309 } else {
5310 CmdArgs.push_back("-dynamic-linker");
5311 CmdArgs.push_back("/usr/libexec/ld.so");
5312 }
5313 }
5314
5315 if (Output.isFilename()) {
5316 CmdArgs.push_back("-o");
5317 CmdArgs.push_back(Output.getFilename());
5318 } else {
5319 assert(Output.isNothing() && "Invalid output.");
5320 }
5321
5322 if (!Args.hasArg(options::OPT_nostdlib) &&
5323 !Args.hasArg(options::OPT_nostartfiles)) {
5324 if (!Args.hasArg(options::OPT_shared)) {
5325 if (Args.hasArg(options::OPT_pg))
5326 CmdArgs.push_back(Args.MakeArgString(
5327 getToolChain().GetFilePath("gcrt0.o")));
5328 else
5329 CmdArgs.push_back(Args.MakeArgString(
5330 getToolChain().GetFilePath("crt0.o")));
5331 CmdArgs.push_back(Args.MakeArgString(
5332 getToolChain().GetFilePath("crtbegin.o")));
5333 } else {
5334 CmdArgs.push_back(Args.MakeArgString(
5335 getToolChain().GetFilePath("crtbeginS.o")));
5336 }
5337 }
5338
5339 Args.AddAllArgs(CmdArgs, options::OPT_L);
5340 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5341 Args.AddAllArgs(CmdArgs, options::OPT_e);
5342
5343 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5344
5345 if (!Args.hasArg(options::OPT_nostdlib) &&
5346 !Args.hasArg(options::OPT_nodefaultlibs)) {
5347 if (D.CCCIsCXX) {
5348 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5349 if (Args.hasArg(options::OPT_pg))
5350 CmdArgs.push_back("-lm_p");
5351 else
5352 CmdArgs.push_back("-lm");
5353 }
5354
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005355 if (Args.hasArg(options::OPT_pthread)) {
5356 if (!Args.hasArg(options::OPT_shared) &&
5357 Args.hasArg(options::OPT_pg))
5358 CmdArgs.push_back("-lpthread_p");
5359 else
5360 CmdArgs.push_back("-lpthread");
5361 }
5362
Eli Friedman9fa28852012-08-08 23:57:20 +00005363 if (!Args.hasArg(options::OPT_shared)) {
5364 if (Args.hasArg(options::OPT_pg))
5365 CmdArgs.push_back("-lc_p");
5366 else
5367 CmdArgs.push_back("-lc");
5368 }
5369
5370 std::string myarch = "-lclang_rt.";
5371 const llvm::Triple &T = getToolChain().getTriple();
5372 llvm::Triple::ArchType Arch = T.getArch();
5373 switch (Arch) {
5374 case llvm::Triple::arm:
5375 myarch += ("arm");
5376 break;
5377 case llvm::Triple::x86:
5378 myarch += ("i386");
5379 break;
5380 case llvm::Triple::x86_64:
5381 myarch += ("amd64");
5382 break;
5383 default:
5384 assert(0 && "Unsupported architecture");
5385 }
5386 CmdArgs.push_back(Args.MakeArgString(myarch));
5387 }
5388
5389 if (!Args.hasArg(options::OPT_nostdlib) &&
5390 !Args.hasArg(options::OPT_nostartfiles)) {
5391 if (!Args.hasArg(options::OPT_shared))
5392 CmdArgs.push_back(Args.MakeArgString(
5393 getToolChain().GetFilePath("crtend.o")));
5394 else
5395 CmdArgs.push_back(Args.MakeArgString(
5396 getToolChain().GetFilePath("crtendS.o")));
5397 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005398
5399 const char *Exec =
5400 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5401 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005402}
5403
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005404void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005405 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005406 const InputInfoList &Inputs,
5407 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005408 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005409 ArgStringList CmdArgs;
5410
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005411 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5412 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005413 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005414 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005415 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005416 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005417 else if (getToolChain().getArch() == llvm::Triple::mips ||
5418 getToolChain().getArch() == llvm::Triple::mipsel ||
5419 getToolChain().getArch() == llvm::Triple::mips64 ||
5420 getToolChain().getArch() == llvm::Triple::mips64el) {
5421 StringRef CPUName;
5422 StringRef ABIName;
5423 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005424
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005425 CmdArgs.push_back("-march");
5426 CmdArgs.push_back(CPUName.data());
5427
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005428 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005429 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005430
5431 if (getToolChain().getArch() == llvm::Triple::mips ||
5432 getToolChain().getArch() == llvm::Triple::mips64)
5433 CmdArgs.push_back("-EB");
5434 else
5435 CmdArgs.push_back("-EL");
5436
5437 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5438 options::OPT_fpic, options::OPT_fno_pic,
5439 options::OPT_fPIE, options::OPT_fno_PIE,
5440 options::OPT_fpie, options::OPT_fno_pie);
5441 if (LastPICArg &&
5442 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5443 LastPICArg->getOption().matches(options::OPT_fpic) ||
5444 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5445 LastPICArg->getOption().matches(options::OPT_fpie))) {
5446 CmdArgs.push_back("-KPIC");
5447 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005448 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5449 getToolChain().getArch() == llvm::Triple::thumb) {
5450 CmdArgs.push_back("-mfpu=softvfp");
5451 switch(getToolChain().getTriple().getEnvironment()) {
5452 case llvm::Triple::GNUEABI:
5453 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005454 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005455 break;
5456
5457 default:
5458 CmdArgs.push_back("-matpcs");
5459 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005460 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005461
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005462 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5463 options::OPT_Xassembler);
5464
5465 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005466 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005467
5468 for (InputInfoList::const_iterator
5469 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5470 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005471 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005472 }
5473
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005474 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005475 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005476 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005477}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005478
5479void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005480 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005481 const InputInfoList &Inputs,
5482 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005483 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005484 const toolchains::FreeBSD& ToolChain =
5485 static_cast<const toolchains::FreeBSD&>(getToolChain());
5486 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005487 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005488
5489 // Silence warning for "clang -g foo.o -o foo"
5490 Args.ClaimAllArgs(options::OPT_g_Group);
5491 // and "clang -emit-llvm foo.o -o foo"
5492 Args.ClaimAllArgs(options::OPT_emit_llvm);
5493 // and for "clang -w foo.o -o foo". Other warning options are already
5494 // handled somewhere else.
5495 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005496
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005497 if (!D.SysRoot.empty())
5498 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5499
Roman Divackyafe2f232012-08-28 15:09:03 +00005500 if (Args.hasArg(options::OPT_pie))
5501 CmdArgs.push_back("-pie");
5502
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005503 if (Args.hasArg(options::OPT_static)) {
5504 CmdArgs.push_back("-Bstatic");
5505 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005506 if (Args.hasArg(options::OPT_rdynamic))
5507 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005508 CmdArgs.push_back("--eh-frame-hdr");
5509 if (Args.hasArg(options::OPT_shared)) {
5510 CmdArgs.push_back("-Bshareable");
5511 } else {
5512 CmdArgs.push_back("-dynamic-linker");
5513 CmdArgs.push_back("/libexec/ld-elf.so.1");
5514 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005515 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5516 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005517 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5518 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5519 CmdArgs.push_back("--hash-style=both");
5520 }
5521 }
5522 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005523 }
5524
5525 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5526 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005527 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005528 CmdArgs.push_back("-m");
5529 CmdArgs.push_back("elf_i386_fbsd");
5530 }
5531
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005532 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005533 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005534 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005535 }
5536
Daniel Dunbarb440f562010-08-02 02:38:21 +00005537 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005538 CmdArgs.push_back("-o");
5539 CmdArgs.push_back(Output.getFilename());
5540 } else {
5541 assert(Output.isNothing() && "Invalid output.");
5542 }
5543
5544 if (!Args.hasArg(options::OPT_nostdlib) &&
5545 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005546 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005547 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005548 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005549 crt1 = "gcrt1.o";
5550 else if (Args.hasArg(options::OPT_pie))
5551 crt1 = "Scrt1.o";
5552 else
5553 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005554 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005555 if (crt1)
5556 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5557
5558 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5559
5560 const char *crtbegin = NULL;
5561 if (Args.hasArg(options::OPT_static))
5562 crtbegin = "crtbeginT.o";
5563 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5564 crtbegin = "crtbeginS.o";
5565 else
5566 crtbegin = "crtbegin.o";
5567
5568 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005569 }
5570
5571 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005572 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005573 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5574 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005575 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005576 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5577 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005578 Args.AddAllArgs(CmdArgs, options::OPT_s);
5579 Args.AddAllArgs(CmdArgs, options::OPT_t);
5580 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5581 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005582
Roman Divackyafe2f232012-08-28 15:09:03 +00005583 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005584
5585 if (!Args.hasArg(options::OPT_nostdlib) &&
5586 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005587 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005588 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005589 if (Args.hasArg(options::OPT_pg))
5590 CmdArgs.push_back("-lm_p");
5591 else
5592 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005593 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005594 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5595 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005596 if (Args.hasArg(options::OPT_pg))
5597 CmdArgs.push_back("-lgcc_p");
5598 else
5599 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005600 if (Args.hasArg(options::OPT_static)) {
5601 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005602 } else if (Args.hasArg(options::OPT_pg)) {
5603 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005604 } else {
5605 CmdArgs.push_back("--as-needed");
5606 CmdArgs.push_back("-lgcc_s");
5607 CmdArgs.push_back("--no-as-needed");
5608 }
5609
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005610 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005611 if (Args.hasArg(options::OPT_pg))
5612 CmdArgs.push_back("-lpthread_p");
5613 else
5614 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005615 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005616
Roman Divacky66f22762011-02-10 16:59:40 +00005617 if (Args.hasArg(options::OPT_pg)) {
5618 if (Args.hasArg(options::OPT_shared))
5619 CmdArgs.push_back("-lc");
5620 else
5621 CmdArgs.push_back("-lc_p");
5622 CmdArgs.push_back("-lgcc_p");
5623 } else {
5624 CmdArgs.push_back("-lc");
5625 CmdArgs.push_back("-lgcc");
5626 }
5627
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005628 if (Args.hasArg(options::OPT_static)) {
5629 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005630 } else if (Args.hasArg(options::OPT_pg)) {
5631 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005632 } else {
5633 CmdArgs.push_back("--as-needed");
5634 CmdArgs.push_back("-lgcc_s");
5635 CmdArgs.push_back("--no-as-needed");
5636 }
5637 }
5638
5639 if (!Args.hasArg(options::OPT_nostdlib) &&
5640 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005641 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005642 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005643 else
5644 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005645 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005646 }
5647
Roman Divackyafe2f232012-08-28 15:09:03 +00005648 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005649
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005650 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005651 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005652 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005653}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005654
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005655void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5656 const InputInfo &Output,
5657 const InputInfoList &Inputs,
5658 const ArgList &Args,
5659 const char *LinkingOutput) const {
5660 ArgStringList CmdArgs;
5661
5662 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5663 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005664 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005665 CmdArgs.push_back("--32");
5666
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005667 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005668 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005669 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005670 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005671 CmdArgs.push_back("-EL");
5672
5673 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5674 options::OPT_Xassembler);
5675
5676 CmdArgs.push_back("-o");
5677 CmdArgs.push_back(Output.getFilename());
5678
5679 for (InputInfoList::const_iterator
5680 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5681 const InputInfo &II = *it;
5682 CmdArgs.push_back(II.getFilename());
5683 }
5684
David Chisnallddbd68f2011-09-27 22:03:18 +00005685 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005686 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5687}
5688
5689void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5690 const InputInfo &Output,
5691 const InputInfoList &Inputs,
5692 const ArgList &Args,
5693 const char *LinkingOutput) const {
5694 const Driver &D = getToolChain().getDriver();
5695 ArgStringList CmdArgs;
5696
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005697 if (!D.SysRoot.empty())
5698 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5699
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005700 if (Args.hasArg(options::OPT_static)) {
5701 CmdArgs.push_back("-Bstatic");
5702 } else {
5703 if (Args.hasArg(options::OPT_rdynamic))
5704 CmdArgs.push_back("-export-dynamic");
5705 CmdArgs.push_back("--eh-frame-hdr");
5706 if (Args.hasArg(options::OPT_shared)) {
5707 CmdArgs.push_back("-Bshareable");
5708 } else {
5709 CmdArgs.push_back("-dynamic-linker");
5710 CmdArgs.push_back("/libexec/ld.elf_so");
5711 }
5712 }
5713
5714 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5715 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005716 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005717 CmdArgs.push_back("-m");
5718 CmdArgs.push_back("elf_i386");
5719 }
5720
5721 if (Output.isFilename()) {
5722 CmdArgs.push_back("-o");
5723 CmdArgs.push_back(Output.getFilename());
5724 } else {
5725 assert(Output.isNothing() && "Invalid output.");
5726 }
5727
5728 if (!Args.hasArg(options::OPT_nostdlib) &&
5729 !Args.hasArg(options::OPT_nostartfiles)) {
5730 if (!Args.hasArg(options::OPT_shared)) {
5731 CmdArgs.push_back(Args.MakeArgString(
5732 getToolChain().GetFilePath("crt0.o")));
5733 CmdArgs.push_back(Args.MakeArgString(
5734 getToolChain().GetFilePath("crti.o")));
5735 CmdArgs.push_back(Args.MakeArgString(
5736 getToolChain().GetFilePath("crtbegin.o")));
5737 } else {
5738 CmdArgs.push_back(Args.MakeArgString(
5739 getToolChain().GetFilePath("crti.o")));
5740 CmdArgs.push_back(Args.MakeArgString(
5741 getToolChain().GetFilePath("crtbeginS.o")));
5742 }
5743 }
5744
5745 Args.AddAllArgs(CmdArgs, options::OPT_L);
5746 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5747 Args.AddAllArgs(CmdArgs, options::OPT_e);
5748 Args.AddAllArgs(CmdArgs, options::OPT_s);
5749 Args.AddAllArgs(CmdArgs, options::OPT_t);
5750 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5751 Args.AddAllArgs(CmdArgs, options::OPT_r);
5752
5753 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5754
5755 if (!Args.hasArg(options::OPT_nostdlib) &&
5756 !Args.hasArg(options::OPT_nodefaultlibs)) {
5757 if (D.CCCIsCXX) {
5758 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5759 CmdArgs.push_back("-lm");
5760 }
5761 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5762 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005763 if (Args.hasArg(options::OPT_static)) {
5764 CmdArgs.push_back("-lgcc_eh");
5765 } else {
5766 CmdArgs.push_back("--as-needed");
5767 CmdArgs.push_back("-lgcc_s");
5768 CmdArgs.push_back("--no-as-needed");
5769 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005770 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005771
5772 if (Args.hasArg(options::OPT_pthread))
5773 CmdArgs.push_back("-lpthread");
5774 CmdArgs.push_back("-lc");
5775
5776 CmdArgs.push_back("-lgcc");
5777 if (Args.hasArg(options::OPT_static)) {
5778 CmdArgs.push_back("-lgcc_eh");
5779 } else {
5780 CmdArgs.push_back("--as-needed");
5781 CmdArgs.push_back("-lgcc_s");
5782 CmdArgs.push_back("--no-as-needed");
5783 }
5784 }
5785
5786 if (!Args.hasArg(options::OPT_nostdlib) &&
5787 !Args.hasArg(options::OPT_nostartfiles)) {
5788 if (!Args.hasArg(options::OPT_shared))
5789 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5790 "crtend.o")));
5791 else
5792 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5793 "crtendS.o")));
5794 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5795 "crtn.o")));
5796 }
5797
Bill Wendling08760582011-06-27 19:15:03 +00005798 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005799
David Chisnallddbd68f2011-09-27 22:03:18 +00005800 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005801 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5802}
5803
Thomas Schwinge4e555262013-03-28 19:04:25 +00005804void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5805 const InputInfo &Output,
5806 const InputInfoList &Inputs,
5807 const ArgList &Args,
5808 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005809 ArgStringList CmdArgs;
5810
5811 // Add --32/--64 to make sure we get the format we want.
5812 // This is incomplete
5813 if (getToolChain().getArch() == llvm::Triple::x86) {
5814 CmdArgs.push_back("--32");
5815 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5816 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005817 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5818 CmdArgs.push_back("-a32");
5819 CmdArgs.push_back("-mppc");
5820 CmdArgs.push_back("-many");
5821 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5822 CmdArgs.push_back("-a64");
5823 CmdArgs.push_back("-mppc64");
5824 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005825 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005826 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005827 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5828 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005829
5830 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5831 getToolChain().getTriple());
5832 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005833
5834 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5835 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5836 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005837 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5838 getToolChain().getArch() == llvm::Triple::mipsel ||
5839 getToolChain().getArch() == llvm::Triple::mips64 ||
5840 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005841 StringRef CPUName;
5842 StringRef ABIName;
5843 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005844
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005845 CmdArgs.push_back("-march");
5846 CmdArgs.push_back(CPUName.data());
5847
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005848 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005849 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005850
5851 if (getToolChain().getArch() == llvm::Triple::mips ||
5852 getToolChain().getArch() == llvm::Triple::mips64)
5853 CmdArgs.push_back("-EB");
5854 else
5855 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005856
Simon Atanasyan036d16d2013-04-30 07:47:13 +00005857 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5858 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5859 options::OPT_mno_micromips);
5860 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5861 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5862
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005863 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5864 options::OPT_fpic, options::OPT_fno_pic,
5865 options::OPT_fPIE, options::OPT_fno_PIE,
5866 options::OPT_fpie, options::OPT_fno_pie);
5867 if (LastPICArg &&
5868 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5869 LastPICArg->getOption().matches(options::OPT_fpic) ||
5870 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5871 LastPICArg->getOption().matches(options::OPT_fpie))) {
5872 CmdArgs.push_back("-KPIC");
5873 }
Ulrich Weigand47445072013-05-06 16:26:41 +00005874 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
5875 // At the moment we always produce z10 code.
5876 CmdArgs.push_back("-march=z10");
Rafael Espindola92b00932010-08-10 00:25:48 +00005877 }
5878
5879 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5880 options::OPT_Xassembler);
5881
5882 CmdArgs.push_back("-o");
5883 CmdArgs.push_back(Output.getFilename());
5884
5885 for (InputInfoList::const_iterator
5886 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5887 const InputInfo &II = *it;
5888 CmdArgs.push_back(II.getFilename());
5889 }
5890
5891 const char *Exec =
5892 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5893 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00005894
5895 // Handle the debug info splitting at object creation time if we're
5896 // creating an object.
5897 // TODO: Currently only works on linux with newer objcopy.
5898 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
5899 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
5900 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5901 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00005902}
5903
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005904static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5905 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005906 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005907 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5908 Args.hasArg(options::OPT_static);
Rafael Espindolacc354322011-10-17 21:39:04 +00005909 if (!D.CCCIsCXX)
5910 CmdArgs.push_back("-lgcc");
5911
Logan Chien3d3373c2012-11-19 12:04:11 +00005912 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005913 if (D.CCCIsCXX)
5914 CmdArgs.push_back("-lgcc");
5915 } else {
5916 if (!D.CCCIsCXX)
5917 CmdArgs.push_back("--as-needed");
5918 CmdArgs.push_back("-lgcc_s");
5919 if (!D.CCCIsCXX)
5920 CmdArgs.push_back("--no-as-needed");
5921 }
5922
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005923 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005924 CmdArgs.push_back("-lgcc_eh");
5925 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5926 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005927
5928 // According to Android ABI, we have to link with libdl if we are
5929 // linking with non-static libgcc.
5930 //
5931 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5932 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5933 if (isAndroid && !StaticLibgcc)
5934 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005935}
5936
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005937static bool hasMipsN32ABIArg(const ArgList &Args) {
5938 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005939 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005940}
5941
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00005942static StringRef getLinuxDynamicLinker(const ArgList &Args,
5943 const toolchains::Linux &ToolChain) {
5944 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
5945 return "/system/bin/linker";
5946 else if (ToolChain.getArch() == llvm::Triple::x86)
5947 return "/lib/ld-linux.so.2";
5948 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5949 return "/lib/ld-linux-aarch64.so.1";
5950 else if (ToolChain.getArch() == llvm::Triple::arm ||
5951 ToolChain.getArch() == llvm::Triple::thumb) {
5952 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5953 return "/lib/ld-linux-armhf.so.3";
5954 else
5955 return "/lib/ld-linux.so.3";
5956 } else if (ToolChain.getArch() == llvm::Triple::mips ||
5957 ToolChain.getArch() == llvm::Triple::mipsel)
5958 return "/lib/ld.so.1";
5959 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5960 ToolChain.getArch() == llvm::Triple::mips64el) {
5961 if (hasMipsN32ABIArg(Args))
5962 return "/lib32/ld.so.1";
5963 else
5964 return "/lib64/ld.so.1";
5965 } else if (ToolChain.getArch() == llvm::Triple::ppc)
5966 return "/lib/ld.so.1";
5967 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
5968 ToolChain.getArch() == llvm::Triple::systemz)
5969 return "/lib64/ld64.so.1";
5970 else
5971 return "/lib64/ld-linux-x86-64.so.2";
5972}
5973
Thomas Schwinge4e555262013-03-28 19:04:25 +00005974void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5975 const InputInfo &Output,
5976 const InputInfoList &Inputs,
5977 const ArgList &Args,
5978 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005979 const toolchains::Linux& ToolChain =
5980 static_cast<const toolchains::Linux&>(getToolChain());
5981 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005982 const bool isAndroid =
5983 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005984 SanitizerArgs Sanitize(getToolChain(), Args);
5985 const bool IsPIE =
5986 !Args.hasArg(options::OPT_shared) &&
5987 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005988
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005989 ArgStringList CmdArgs;
5990
Rafael Espindolad1002f62010-11-15 18:28:16 +00005991 // Silence warning for "clang -g foo.o -o foo"
5992 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005993 // and "clang -emit-llvm foo.o -o foo"
5994 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005995 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005996 // handled somewhere else.
5997 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005998
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005999 if (!D.SysRoot.empty())
6000 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006001
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006002 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006003 CmdArgs.push_back("-pie");
6004
Rafael Espindola1c76c592010-11-07 22:57:16 +00006005 if (Args.hasArg(options::OPT_rdynamic))
6006 CmdArgs.push_back("-export-dynamic");
6007
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006008 if (Args.hasArg(options::OPT_s))
6009 CmdArgs.push_back("-s");
6010
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006011 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6012 e = ToolChain.ExtraOpts.end();
6013 i != e; ++i)
6014 CmdArgs.push_back(i->c_str());
6015
6016 if (!Args.hasArg(options::OPT_static)) {
6017 CmdArgs.push_back("--eh-frame-hdr");
6018 }
6019
6020 CmdArgs.push_back("-m");
6021 if (ToolChain.getArch() == llvm::Triple::x86)
6022 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006023 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6024 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006025 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006026 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006027 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006028 else if (ToolChain.getArch() == llvm::Triple::ppc)
6029 CmdArgs.push_back("elf32ppclinux");
6030 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6031 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006032 else if (ToolChain.getArch() == llvm::Triple::mips)
6033 CmdArgs.push_back("elf32btsmip");
6034 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6035 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006036 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6037 if (hasMipsN32ABIArg(Args))
6038 CmdArgs.push_back("elf32btsmipn32");
6039 else
6040 CmdArgs.push_back("elf64btsmip");
6041 }
6042 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6043 if (hasMipsN32ABIArg(Args))
6044 CmdArgs.push_back("elf32ltsmipn32");
6045 else
6046 CmdArgs.push_back("elf64ltsmip");
6047 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006048 else if (ToolChain.getArch() == llvm::Triple::systemz)
6049 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006050 else
6051 CmdArgs.push_back("elf_x86_64");
6052
6053 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006054 if (ToolChain.getArch() == llvm::Triple::arm
6055 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006056 CmdArgs.push_back("-Bstatic");
6057 else
6058 CmdArgs.push_back("-static");
6059 } else if (Args.hasArg(options::OPT_shared)) {
6060 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006061 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006062 CmdArgs.push_back("-Bsymbolic");
6063 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006064 }
6065
6066 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006067 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006068 (!Args.hasArg(options::OPT_static) &&
6069 !Args.hasArg(options::OPT_shared))) {
6070 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006071 CmdArgs.push_back(Args.MakeArgString(
6072 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006073 }
6074
6075 CmdArgs.push_back("-o");
6076 CmdArgs.push_back(Output.getFilename());
6077
Rafael Espindola81937ec2010-12-01 01:52:43 +00006078 if (!Args.hasArg(options::OPT_nostdlib) &&
6079 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006080 if (!isAndroid) {
6081 const char *crt1 = NULL;
6082 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006083 if (Args.hasArg(options::OPT_pg))
6084 crt1 = "gcrt1.o";
6085 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006086 crt1 = "Scrt1.o";
6087 else
6088 crt1 = "crt1.o";
6089 }
6090 if (crt1)
6091 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006092
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006093 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6094 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006095
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006096 const char *crtbegin;
6097 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006098 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006099 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006100 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006101 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006102 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006103 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006104 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006105 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006106
6107 // Add crtfastmath.o if available and fast math is enabled.
6108 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006109 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006110
6111 Args.AddAllArgs(CmdArgs, options::OPT_L);
6112
6113 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6114
Roman Divackyee8188a2011-03-01 17:53:14 +00006115 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6116 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006117 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006118
Rafael Espindola9446d762012-04-09 23:53:34 +00006119 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6120 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6121 // forward.
6122 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6123 CmdArgs.push_back("-plugin");
6124 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6125 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006126
6127 // Try to pass driver level flags relevant to LTO code generation down to
6128 // the plugin.
6129
6130 // Handle architecture-specific flags for selecting CPU variants.
6131 if (ToolChain.getArch() == llvm::Triple::x86 ||
6132 ToolChain.getArch() == llvm::Triple::x86_64)
6133 CmdArgs.push_back(
6134 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6135 getX86TargetCPU(Args, ToolChain.getTriple())));
6136 else if (ToolChain.getArch() == llvm::Triple::arm ||
6137 ToolChain.getArch() == llvm::Triple::thumb)
6138 CmdArgs.push_back(
6139 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6140 getARMTargetCPU(Args, ToolChain.getTriple())));
6141
6142 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6143 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00006144 }
6145
Chandler Carruth953fb082013-01-13 11:46:33 +00006146
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006147 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6148 CmdArgs.push_back("--no-demangle");
6149
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006150 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6151
Eric Christopher04997782012-11-29 18:51:05 +00006152 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006153 if (Sanitize.needsUbsanRt())
Richard Smithcff3cde2013-03-20 23:49:07 +00006154 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6155 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006156 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006157 if (Sanitize.needsAsanRt())
6158 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6159 if (Sanitize.needsTsanRt())
6160 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006161 if (Sanitize.needsMsanRt())
6162 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006163 if (Sanitize.needsLsanRt())
6164 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006165
Chandler Carruth94a32012012-05-14 18:31:18 +00006166 if (D.CCCIsCXX &&
6167 !Args.hasArg(options::OPT_nostdlib) &&
6168 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006169 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6170 !Args.hasArg(options::OPT_static);
6171 if (OnlyLibstdcxxStatic)
6172 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006173 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006174 if (OnlyLibstdcxxStatic)
6175 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006176 CmdArgs.push_back("-lm");
6177 }
6178
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006179 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006180 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6181 if (Args.hasArg(options::OPT_static))
6182 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006183
Chandler Carruth01538002013-01-17 13:19:29 +00006184 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6185 if (OpenMP) {
6186 CmdArgs.push_back("-lgomp");
6187
6188 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6189 // librt. Most modern Linux platfroms require it, but some may not.
6190 CmdArgs.push_back("-lrt");
6191 }
6192
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006193 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006194
Chandler Carruth94a32012012-05-14 18:31:18 +00006195 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006196 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006197 CmdArgs.push_back("-lpthread");
6198
6199 CmdArgs.push_back("-lc");
6200
6201 if (Args.hasArg(options::OPT_static))
6202 CmdArgs.push_back("--end-group");
6203 else
6204 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6205 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006206
Rafael Espindola81937ec2010-12-01 01:52:43 +00006207 if (!Args.hasArg(options::OPT_nostartfiles)) {
6208 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006209 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006210 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006211 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006212 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006213 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006214 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006215
Rafael Espindola81937ec2010-12-01 01:52:43 +00006216 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006217 if (!isAndroid)
6218 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006219 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006220 }
6221
Bill Wendling08760582011-06-27 19:15:03 +00006222 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006223
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006224 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6225}
Rafael Espindola92b00932010-08-10 00:25:48 +00006226
Chris Lattner3e2ee142010-07-07 16:01:42 +00006227void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006228 const InputInfo &Output,
6229 const InputInfoList &Inputs,
6230 const ArgList &Args,
6231 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006232 ArgStringList CmdArgs;
6233
6234 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6235 options::OPT_Xassembler);
6236
6237 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006238 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006239
6240 for (InputInfoList::const_iterator
6241 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6242 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006243 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006244 }
6245
6246 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006247 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006248 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006249}
6250
6251void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006252 const InputInfo &Output,
6253 const InputInfoList &Inputs,
6254 const ArgList &Args,
6255 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006256 const Driver &D = getToolChain().getDriver();
6257 ArgStringList CmdArgs;
6258
Daniel Dunbarb440f562010-08-02 02:38:21 +00006259 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006260 CmdArgs.push_back("-o");
6261 CmdArgs.push_back(Output.getFilename());
6262 } else {
6263 assert(Output.isNothing() && "Invalid output.");
6264 }
6265
6266 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006267 !Args.hasArg(options::OPT_nostartfiles)) {
6268 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6269 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6270 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6271 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6272 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006273
6274 Args.AddAllArgs(CmdArgs, options::OPT_L);
6275 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6276 Args.AddAllArgs(CmdArgs, options::OPT_e);
6277
Daniel Dunbar54423b22010-09-17 00:24:54 +00006278 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006279
Eli Friedman83de5132011-12-08 23:54:21 +00006280 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6281
Chris Lattner3e2ee142010-07-07 16:01:42 +00006282 if (!Args.hasArg(options::OPT_nostdlib) &&
6283 !Args.hasArg(options::OPT_nodefaultlibs)) {
6284 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006285 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006286 CmdArgs.push_back("-lm");
6287 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006288 }
6289
6290 if (!Args.hasArg(options::OPT_nostdlib) &&
6291 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006292 if (Args.hasArg(options::OPT_pthread))
6293 CmdArgs.push_back("-lpthread");
6294 CmdArgs.push_back("-lc");
6295 CmdArgs.push_back("-lCompilerRT-Generic");
6296 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6297 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006298 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006299 }
6300
Eli Friedman83de5132011-12-08 23:54:21 +00006301 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006302 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006303}
6304
Daniel Dunbarcc912342009-05-02 18:28:39 +00006305/// DragonFly Tools
6306
6307// For now, DragonFly Assemble does just about the same as for
6308// FreeBSD, but this may change soon.
6309void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006310 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006311 const InputInfoList &Inputs,
6312 const ArgList &Args,
6313 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006314 ArgStringList CmdArgs;
6315
6316 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6317 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006318 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006319 CmdArgs.push_back("--32");
6320
6321 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6322 options::OPT_Xassembler);
6323
6324 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006325 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006326
6327 for (InputInfoList::const_iterator
6328 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6329 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006330 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006331 }
6332
6333 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006334 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006335 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006336}
6337
6338void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006339 const InputInfo &Output,
6340 const InputInfoList &Inputs,
6341 const ArgList &Args,
6342 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006343 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006344 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006345 ArgStringList CmdArgs;
6346
John McCall65b8da02013-04-11 22:55:55 +00006347 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6348 UseGCC47 = false;
6349
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006350 if (!D.SysRoot.empty())
6351 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6352
John McCall65b8da02013-04-11 22:55:55 +00006353 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006354 if (Args.hasArg(options::OPT_static)) {
6355 CmdArgs.push_back("-Bstatic");
6356 } else {
John McCall65b8da02013-04-11 22:55:55 +00006357 if (Args.hasArg(options::OPT_rdynamic))
6358 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006359 if (Args.hasArg(options::OPT_shared))
6360 CmdArgs.push_back("-Bshareable");
6361 else {
6362 CmdArgs.push_back("-dynamic-linker");
6363 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6364 }
John McCall65b8da02013-04-11 22:55:55 +00006365 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006366 }
6367
6368 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6369 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006370 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006371 CmdArgs.push_back("-m");
6372 CmdArgs.push_back("elf_i386");
6373 }
6374
Daniel Dunbarb440f562010-08-02 02:38:21 +00006375 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006376 CmdArgs.push_back("-o");
6377 CmdArgs.push_back(Output.getFilename());
6378 } else {
6379 assert(Output.isNothing() && "Invalid output.");
6380 }
6381
6382 if (!Args.hasArg(options::OPT_nostdlib) &&
6383 !Args.hasArg(options::OPT_nostartfiles)) {
6384 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006385 if (Args.hasArg(options::OPT_pg))
6386 CmdArgs.push_back(Args.MakeArgString(
6387 getToolChain().GetFilePath("gcrt1.o")));
6388 else {
6389 if (Args.hasArg(options::OPT_pie))
6390 CmdArgs.push_back(Args.MakeArgString(
6391 getToolChain().GetFilePath("Scrt1.o")));
6392 else
6393 CmdArgs.push_back(Args.MakeArgString(
6394 getToolChain().GetFilePath("crt1.o")));
6395 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006396 }
John McCall65b8da02013-04-11 22:55:55 +00006397 CmdArgs.push_back(Args.MakeArgString(
6398 getToolChain().GetFilePath("crti.o")));
6399 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6400 CmdArgs.push_back(Args.MakeArgString(
6401 getToolChain().GetFilePath("crtbeginS.o")));
6402 else
6403 CmdArgs.push_back(Args.MakeArgString(
6404 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006405 }
6406
6407 Args.AddAllArgs(CmdArgs, options::OPT_L);
6408 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6409 Args.AddAllArgs(CmdArgs, options::OPT_e);
6410
Daniel Dunbar54423b22010-09-17 00:24:54 +00006411 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006412
6413 if (!Args.hasArg(options::OPT_nostdlib) &&
6414 !Args.hasArg(options::OPT_nodefaultlibs)) {
6415 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6416 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006417 if (UseGCC47)
6418 CmdArgs.push_back("-L/usr/lib/gcc47");
6419 else
6420 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006421
6422 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006423 if (UseGCC47) {
6424 CmdArgs.push_back("-rpath");
6425 CmdArgs.push_back("/usr/lib/gcc47");
6426 } else {
6427 CmdArgs.push_back("-rpath");
6428 CmdArgs.push_back("/usr/lib/gcc44");
6429 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006430 }
6431
Rafael Espindola38360b32010-07-20 12:59:03 +00006432 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006433 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006434 CmdArgs.push_back("-lm");
6435 }
6436
Daniel Dunbarcc912342009-05-02 18:28:39 +00006437 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006438 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006439
6440 if (!Args.hasArg(options::OPT_nolibc)) {
6441 CmdArgs.push_back("-lc");
6442 }
6443
John McCall65b8da02013-04-11 22:55:55 +00006444 if (UseGCC47) {
6445 if (Args.hasArg(options::OPT_static) ||
6446 Args.hasArg(options::OPT_static_libgcc)) {
6447 CmdArgs.push_back("-lgcc");
6448 CmdArgs.push_back("-lgcc_eh");
6449 } else {
6450 if (Args.hasArg(options::OPT_shared_libgcc)) {
6451 CmdArgs.push_back("-lgcc_pic");
6452 if (!Args.hasArg(options::OPT_shared))
6453 CmdArgs.push_back("-lgcc");
6454 } else {
6455 CmdArgs.push_back("-lgcc");
6456 CmdArgs.push_back("--as-needed");
6457 CmdArgs.push_back("-lgcc_pic");
6458 CmdArgs.push_back("--no-as-needed");
6459 }
6460 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006461 } else {
John McCall65b8da02013-04-11 22:55:55 +00006462 if (Args.hasArg(options::OPT_shared)) {
6463 CmdArgs.push_back("-lgcc_pic");
6464 } else {
6465 CmdArgs.push_back("-lgcc");
6466 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006467 }
6468 }
6469
6470 if (!Args.hasArg(options::OPT_nostdlib) &&
6471 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006472 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006473 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006474 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006475 else
6476 CmdArgs.push_back(Args.MakeArgString(
6477 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006478 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006479 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006480 }
6481
Bill Wendling08760582011-06-27 19:15:03 +00006482 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006483
Daniel Dunbarcc912342009-05-02 18:28:39 +00006484 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006485 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006486 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006487}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006488
6489void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6490 const InputInfo &Output,
6491 const InputInfoList &Inputs,
6492 const ArgList &Args,
6493 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006494 ArgStringList CmdArgs;
6495
6496 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006497 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6498 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006499 } else {
6500 assert(Output.isNothing() && "Invalid output.");
6501 }
6502
6503 if (!Args.hasArg(options::OPT_nostdlib) &&
6504 !Args.hasArg(options::OPT_nostartfiles)) {
6505 CmdArgs.push_back("-defaultlib:libcmt");
6506 }
6507
6508 CmdArgs.push_back("-nologo");
6509
Michael J. Spencere2f49362012-06-18 16:56:04 +00006510 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6511
6512 // Add filenames immediately.
6513 for (InputInfoList::const_iterator
6514 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6515 if (it->isFilename())
6516 CmdArgs.push_back(it->getFilename());
6517 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006518
6519 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006520 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006521 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6522}