blob: 40aebd4d1004ad0ba40f31e286613bef296fa18e [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
Chad Rosiera35d5a32013-04-26 20:49:50 +000010#include <sys/stat.h>
11#include <unistd.h>
Daniel Dunbar1a093d22009-03-18 06:00:36 +000012#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000013#include "InputInfo.h"
14#include "SanitizerArgs.h"
15#include "ToolChains.h"
16#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000017#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000019#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000020#include "clang/Driver/ArgList.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000021#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000022#include "clang/Driver/Driver.h"
23#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000026#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000027#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000028#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000029#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000032#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000033#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000034#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000035#include "llvm/Support/Host.h"
36#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/raw_ostream.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000038
Daniel Dunbar1a093d22009-03-18 06:00:36 +000039using namespace clang::driver;
40using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000042
Daniel Dunbar64198ef2009-09-10 01:21:05 +000043/// CheckPreprocessingOptions - Perform some validation of preprocessing
44/// arguments that is shared with gcc.
45static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
46 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000047 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000048 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000049 << A->getAsString(Args) << "-E";
50}
51
Daniel Dunbar4eadb602009-09-10 01:21:12 +000052/// CheckCodeGenerationOptions - Perform some validation of code generation
53/// arguments that is shared with gcc.
54static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
55 // In gcc, only ARM checks this, but it seems reasonable to check universally.
56 if (Args.hasArg(options::OPT_static))
57 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
58 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000059 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000060 << A->getAsString(Args) << "-static";
61}
62
Chris Lattnerbf2803f2010-03-29 17:55:58 +000063// Quote target names for inclusion in GNU Make dependency files.
64// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000065static void QuoteTarget(StringRef Target,
66 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000067 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
68 switch (Target[i]) {
69 case ' ':
70 case '\t':
71 // Escape the preceding backslashes
72 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
73 Res.push_back('\\');
74
75 // Escape the space/tab
76 Res.push_back('\\');
77 break;
78 case '$':
79 Res.push_back('$');
80 break;
81 case '#':
82 Res.push_back('\\');
83 break;
84 default:
85 break;
86 }
87
88 Res.push_back(Target[i]);
89 }
90}
91
Bill Wendlingc0938f32012-03-12 22:10:06 +000092static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000093 ArgStringList &CmdArgs,
94 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000095 const char *EnvVar) {
96 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +000097 bool CombinedArg = false;
98
Bill Wendling281ca292012-03-12 21:22:35 +000099 if (!DirList)
100 return; // Nothing to do.
101
Chad Rosier616e8a52012-10-30 21:42:09 +0000102 StringRef Name(ArgName);
103 if (Name.equals("-I") || Name.equals("-L"))
104 CombinedArg = true;
105
Bill Wendling281ca292012-03-12 21:22:35 +0000106 StringRef Dirs(DirList);
107 if (Dirs.empty()) // Empty string should not add '.'.
108 return;
109
110 StringRef::size_type Delim;
111 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
112 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000113 if (CombinedArg) {
114 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
115 } else {
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 }
Bill Wendling281ca292012-03-12 21:22:35 +0000119 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000120 if (CombinedArg) {
121 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
122 } else {
123 CmdArgs.push_back(ArgName);
124 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
125 }
Bill Wendling281ca292012-03-12 21:22:35 +0000126 }
Nico Weber89355782012-03-19 15:00:03 +0000127 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000128 }
129
130 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000131 if (CombinedArg) {
132 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
133 } else {
134 CmdArgs.push_back(ArgName);
135 CmdArgs.push_back(".");
136 }
Bill Wendling281ca292012-03-12 21:22:35 +0000137 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000138 if (CombinedArg) {
139 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
140 } else {
141 CmdArgs.push_back(ArgName);
142 CmdArgs.push_back(Args.MakeArgString(Dirs));
143 }
Bill Wendling281ca292012-03-12 21:22:35 +0000144 }
145}
146
Daniel Dunbar54423b22010-09-17 00:24:54 +0000147static void AddLinkerInputs(const ToolChain &TC,
148 const InputInfoList &Inputs, const ArgList &Args,
149 ArgStringList &CmdArgs) {
150 const Driver &D = TC.getDriver();
151
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000152 // Add extra linker input arguments which are not treated as inputs
153 // (constructed via -Xarch_).
154 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
155
Daniel Dunbar54423b22010-09-17 00:24:54 +0000156 for (InputInfoList::const_iterator
157 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
158 const InputInfo &II = *it;
159
160 if (!TC.HasNativeLLVMSupport()) {
161 // Don't try to pass LLVM inputs unless we have native support.
162 if (II.getType() == types::TY_LLVM_IR ||
163 II.getType() == types::TY_LTO_IR ||
164 II.getType() == types::TY_LLVM_BC ||
165 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000166 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167 << TC.getTripleString();
168 }
169
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000170 // Add filenames immediately.
171 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000172 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000173 continue;
174 }
175
176 // Otherwise, this is a linker input argument.
177 const Arg &A = II.getInputArg();
178
179 // Handle reserved library options.
180 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000181 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000182 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
183 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000184 } else
185 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000186 }
Bill Wendling281ca292012-03-12 21:22:35 +0000187
188 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000189 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000190}
191
John McCall31168b02011-06-15 23:02:42 +0000192/// \brief Determine whether Objective-C automated reference counting is
193/// enabled.
194static bool isObjCAutoRefCount(const ArgList &Args) {
195 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
196}
197
Ted Kremeneke65b0862012-03-06 20:05:56 +0000198/// \brief Determine whether we are linking the ObjC runtime.
199static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000200 if (isObjCAutoRefCount(Args)) {
201 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000202 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000203 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000204 return Args.hasArg(options::OPT_fobjc_link_runtime);
205}
206
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000207static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000208 ArgStringList &CmdArgs,
209 llvm::Triple Triple) {
210 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
211 Args.hasArg(options::OPT_fprofile_generate) ||
212 Args.hasArg(options::OPT_fcreate_profile) ||
213 Args.hasArg(options::OPT_coverage)))
214 return;
215
216 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
217 // the link line. We cannot do the same thing because unlike gcov there is a
218 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
219 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000220 std::string ProfileRT =
221 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000222
Bill Wendling08760582011-06-27 19:15:03 +0000223 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000224}
225
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000226static bool forwardToGCC(const Option &O) {
227 return !O.hasFlag(options::NoForward) &&
228 !O.hasFlag(options::DriverOption) &&
229 !O.hasFlag(options::LinkerInput);
230}
231
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000232void Clang::AddPreprocessingOptions(Compilation &C,
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)
450 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
451 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
452 .Cases("arm920", "arm920t", "arm922t", "v4t")
453 .Cases("arm940t", "ep9312","v4t")
454 .Cases("arm10tdmi", "arm1020t", "v5")
455 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
456 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
457 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
458 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
459 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
460 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000461 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
462 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000463 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000464 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000465 .Case("cortex-m3", "v7m")
466 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000467 .Case("cortex-a9-mp", "v7f")
468 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000469 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000470}
471
Benjamin Kramer09811c72012-06-26 22:20:06 +0000472/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
473//
474// FIXME: tblgen this.
475static std::string getARMTargetCPU(const ArgList &Args,
476 const llvm::Triple &Triple) {
477 // FIXME: Warn on inconsistent use of -mcpu and -march.
478
479 // If we have -mcpu=, use that.
480 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000481 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000482 // Handle -mcpu=native.
483 if (MCPU == "native")
484 return llvm::sys::getHostCPUName();
485 else
486 return MCPU;
487 }
488
489 StringRef MArch;
490 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
491 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000492 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000493 } else {
494 // Otherwise, use the Arch from the triple.
495 MArch = Triple.getArchName();
496 }
497
498 // Handle -march=native.
499 std::string NativeMArch;
500 if (MArch == "native") {
501 std::string CPU = llvm::sys::getHostCPUName();
502 if (CPU != "generic") {
503 // Translate the native cpu into the architecture. The switch below will
504 // then chose the minimum cpu for that arch.
505 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
506 MArch = NativeMArch;
507 }
508 }
509
510 return llvm::StringSwitch<const char *>(MArch)
511 .Cases("armv2", "armv2a","arm2")
512 .Case("armv3", "arm6")
513 .Case("armv3m", "arm7m")
514 .Cases("armv4", "armv4t", "arm7tdmi")
515 .Cases("armv5", "armv5t", "arm10tdmi")
516 .Cases("armv5e", "armv5te", "arm1022e")
517 .Case("armv5tej", "arm926ej-s")
518 .Cases("armv6", "armv6k", "arm1136jf-s")
519 .Case("armv6j", "arm1136j-s")
520 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
521 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000522 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000523 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000524 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000525 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
526 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000527 .Cases("armv7r", "armv7-r", "cortex-r4")
528 .Cases("armv7m", "armv7-m", "cortex-m3")
529 .Case("ep9312", "ep9312")
530 .Case("iwmmxt", "iwmmxt")
531 .Case("xscale", "xscale")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000532 // If all else failed, return the most base CPU LLVM supports.
533 .Default("arm7tdmi");
534}
535
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000536// FIXME: Move to target hook.
537static bool isSignedCharDefault(const llvm::Triple &Triple) {
538 switch (Triple.getArch()) {
539 default:
540 return true;
541
Tim Northover9bb857a2013-01-31 12:13:10 +0000542 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000543 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000544 case llvm::Triple::ppc:
545 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000546 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000547 return true;
548 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000549 }
550}
551
Chad Rosiercfbfc582012-04-04 20:51:35 +0000552// Handle -mfpu=.
553//
554// FIXME: Centralize feature selection, defaulting shouldn't be also in the
555// frontend target.
556static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
557 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000558 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000559
560 // Set the target features based on the FPU.
561 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
562 // Disable any default FPU support.
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("-vfp2");
565 CmdArgs.push_back("-target-feature");
566 CmdArgs.push_back("-vfp3");
567 CmdArgs.push_back("-target-feature");
568 CmdArgs.push_back("-neon");
569 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("+vfp3");
572 CmdArgs.push_back("-target-feature");
573 CmdArgs.push_back("+d16");
574 CmdArgs.push_back("-target-feature");
575 CmdArgs.push_back("-neon");
576 } else if (FPU == "vfp") {
577 CmdArgs.push_back("-target-feature");
578 CmdArgs.push_back("+vfp2");
579 CmdArgs.push_back("-target-feature");
580 CmdArgs.push_back("-neon");
581 } else if (FPU == "vfp3" || FPU == "vfpv3") {
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("+vfp3");
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neon");
586 } else if (FPU == "neon") {
587 CmdArgs.push_back("-target-feature");
588 CmdArgs.push_back("+neon");
589 } else
590 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
591}
592
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000593// Handle -mfpmath=.
594static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000595 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000596 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000597
598 // Set the target features based on the FPMath.
599 if (FPMath == "neon") {
600 CmdArgs.push_back("-target-feature");
601 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000602
Bob Wilsonf643afc2013-03-04 22:37:46 +0000603 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
604 CPU != "cortex-a8" && CPU != "cortex-a9" &&
605 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000606 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
607
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000608 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
609 FPMath == "vfp4") {
610 CmdArgs.push_back("-target-feature");
611 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000612
613 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000614 } else
615 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
616}
617
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000618// Select the float ABI as determined by -msoft-float, -mhard-float, and
619// -mfloat-abi=.
620static StringRef getARMFloatABI(const Driver &D,
621 const ArgList &Args,
622 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000623 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000624 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
625 options::OPT_mhard_float,
626 options::OPT_mfloat_abi_EQ)) {
627 if (A->getOption().matches(options::OPT_msoft_float))
628 FloatABI = "soft";
629 else if (A->getOption().matches(options::OPT_mhard_float))
630 FloatABI = "hard";
631 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000632 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000634 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000635 << A->getAsString(Args);
636 FloatABI = "soft";
637 }
638 }
639 }
640
641 // If unspecified, choose the default based on the platform.
642 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000643 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000644 case llvm::Triple::Darwin:
645 case llvm::Triple::MacOSX:
646 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000647 // Darwin defaults to "softfp" for v6 and v7.
648 //
649 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000651 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000652 if (StringRef(ArchName).startswith("v6") ||
653 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000654 FloatABI = "softfp";
655 else
656 FloatABI = "soft";
657 break;
658 }
659
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000660 case llvm::Triple::FreeBSD:
661 // FreeBSD defaults to soft float
662 FloatABI = "soft";
663 break;
664
Daniel Dunbar78485922009-09-10 23:00:09 +0000665 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000666 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000667 case llvm::Triple::GNUEABIHF:
668 FloatABI = "hard";
669 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000670 case llvm::Triple::GNUEABI:
671 FloatABI = "softfp";
672 break;
673 case llvm::Triple::EABI:
674 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
675 FloatABI = "softfp";
676 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000677 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000678 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000679 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000680 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000681 FloatABI = "softfp";
682 else
683 FloatABI = "soft";
684 break;
685 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000686 default:
687 // Assume "soft", but warn the user we are guessing.
688 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000689 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000690 break;
691 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000692 }
693 }
694
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000695 return FloatABI;
696}
697
698
699void Clang::AddARMTargetArgs(const ArgList &Args,
700 ArgStringList &CmdArgs,
701 bool KernelOrKext) const {
702 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000703 // Get the effective triple, which takes into account the deployment target.
704 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
705 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000706 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000707
708 // Select the ABI to use.
709 //
710 // FIXME: Support -meabi.
711 const char *ABIName = 0;
712 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000713 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000714 } else if (Triple.isOSDarwin()) {
715 // The backend is hardwired to assume AAPCS for M-class processors, ensure
716 // the frontend matches that.
717 if (StringRef(CPUName).startswith("cortex-m")) {
718 ABIName = "aapcs";
719 } else {
720 ABIName = "apcs-gnu";
721 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000722 } else {
723 // Select the default based on the platform.
724 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000725 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000726 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000727 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000728 ABIName = "aapcs-linux";
729 break;
730 case llvm::Triple::EABI:
731 ABIName = "aapcs";
732 break;
733 default:
734 ABIName = "apcs-gnu";
735 }
736 }
737 CmdArgs.push_back("-target-abi");
738 CmdArgs.push_back(ABIName);
739
740 // Set the CPU based on -march= and -mcpu=.
741 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000742 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000743
744 // Determine floating point ABI from the options & target defaults.
745 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000746 if (FloatABI == "soft") {
747 // Floating point operations and argument passing are soft.
748 //
749 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000750 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000751 CmdArgs.push_back("-mfloat-abi");
752 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000753 } else if (FloatABI == "softfp") {
754 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000755 CmdArgs.push_back("-mfloat-abi");
756 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000757 } else {
758 // Floating point operations and argument passing are hard.
759 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000760 CmdArgs.push_back("-mfloat-abi");
761 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000762 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000763
764 // Set appropriate target features for floating point mode.
765 //
766 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
767 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
768 // stripped out by the ARM target.
769
770 // Use software floating point operations?
771 if (FloatABI == "soft") {
772 CmdArgs.push_back("-target-feature");
773 CmdArgs.push_back("+soft-float");
774 }
775
776 // Use software floating point argument passing?
777 if (FloatABI != "hard") {
778 CmdArgs.push_back("-target-feature");
779 CmdArgs.push_back("+soft-float-abi");
780 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000781
782 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000783 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000784 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000785
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000786 // Honor -mfpmath=.
787 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000788 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000789
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000790 // Setting -msoft-float effectively disables NEON because of the GCC
791 // implementation, although the same isn't true of VFP or VFP3.
792 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000793 CmdArgs.push_back("-target-feature");
794 CmdArgs.push_back("-neon");
795 }
796
797 // Kernel code has more strict alignment requirements.
798 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000799 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
800 CmdArgs.push_back("-backend-option");
801 CmdArgs.push_back("-arm-long-calls");
802 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000803
Daniel Dunbar12100e22011-03-22 16:48:17 +0000804 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000805 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000806
807 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000808 CmdArgs.push_back("-backend-option");
809 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000810 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000811
812 // Setting -mno-global-merge disables the codegen global merge pass. Setting
813 // -mglobal-merge has no effect as the pass is enabled by default.
814 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
815 options::OPT_mno_global_merge)) {
816 if (A->getOption().matches(options::OPT_mno_global_merge))
817 CmdArgs.push_back("-mno-global-merge");
818 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000819
Bob Wilson9c8af452013-04-11 18:53:25 +0000820 if (!Args.hasFlag(options::OPT_mimplicit_float,
821 options::OPT_mno_implicit_float,
822 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000823 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000824}
825
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000826// Translate MIPS CPU name alias option to CPU name.
827static StringRef getMipsCPUFromAlias(const Arg &A) {
828 if (A.getOption().matches(options::OPT_mips32))
829 return "mips32";
830 if (A.getOption().matches(options::OPT_mips32r2))
831 return "mips32r2";
832 if (A.getOption().matches(options::OPT_mips64))
833 return "mips64";
834 if (A.getOption().matches(options::OPT_mips64r2))
835 return "mips64r2";
836 llvm_unreachable("Unexpected option");
837 return "";
838}
839
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000840// Get CPU and ABI names. They are not independent
841// so we have to calculate them together.
842static void getMipsCPUAndABI(const ArgList &Args,
843 const ToolChain &TC,
844 StringRef &CPUName,
845 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000846 const char *DefMips32CPU = "mips32";
847 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000848
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000849 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000850 options::OPT_mcpu_EQ,
851 options::OPT_mips_CPUs_Group)) {
852 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
853 CPUName = getMipsCPUFromAlias(*A);
854 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000855 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000856 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000857
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000858 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000859 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000860 // Convert a GNU style Mips ABI name to the name
861 // accepted by LLVM Mips backend.
862 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
863 .Case("32", "o32")
864 .Case("64", "n64")
865 .Default(ABIName);
866 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000867
868 // Setup default CPU and ABI names.
869 if (CPUName.empty() && ABIName.empty()) {
870 switch (TC.getTriple().getArch()) {
871 default:
872 llvm_unreachable("Unexpected triple arch name");
873 case llvm::Triple::mips:
874 case llvm::Triple::mipsel:
875 CPUName = DefMips32CPU;
876 break;
877 case llvm::Triple::mips64:
878 case llvm::Triple::mips64el:
879 CPUName = DefMips64CPU;
880 break;
881 }
882 }
883
884 if (!ABIName.empty()) {
885 // Deduce CPU name from ABI name.
886 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000887 .Cases("32", "o32", "eabi", DefMips32CPU)
888 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000889 .Default("");
890 }
891 else if (!CPUName.empty()) {
892 // Deduce ABI name from CPU name.
893 ABIName = llvm::StringSwitch<const char *>(CPUName)
894 .Cases("mips32", "mips32r2", "o32")
895 .Cases("mips64", "mips64r2", "n64")
896 .Default("");
897 }
898
899 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000900}
901
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000902// Convert ABI name to the GNU tools acceptable variant.
903static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
904 return llvm::StringSwitch<llvm::StringRef>(ABI)
905 .Case("o32", "32")
906 .Case("n64", "64")
907 .Default(ABI);
908}
909
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000910// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
911// and -mfloat-abi=.
912static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000913 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000914 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 options::OPT_mhard_float,
916 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000917 if (A->getOption().matches(options::OPT_msoft_float))
918 FloatABI = "soft";
919 else if (A->getOption().matches(options::OPT_mhard_float))
920 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000921 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000922 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000923 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000924 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000925 FloatABI = "hard";
926 }
927 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000928 }
929
930 // If unspecified, choose the default based on the platform.
931 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000932 // Assume "hard", because it's a default value used by gcc.
933 // When we start to recognize specific target MIPS processors,
934 // we will be able to select the default more correctly.
935 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000936 }
937
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000938 return FloatABI;
939}
940
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000941static void AddTargetFeature(const ArgList &Args,
942 ArgStringList &CmdArgs,
943 OptSpecifier OnOpt,
944 OptSpecifier OffOpt,
945 StringRef FeatureName) {
946 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
947 CmdArgs.push_back("-target-feature");
948 if (A->getOption().matches(OnOpt))
949 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
950 else
951 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
952 }
953}
954
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000955void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000956 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000957 const Driver &D = getToolChain().getDriver();
958 StringRef CPUName;
959 StringRef ABIName;
960 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
961
962 CmdArgs.push_back("-target-cpu");
963 CmdArgs.push_back(CPUName.data());
964
965 CmdArgs.push_back("-target-abi");
966 CmdArgs.push_back(ABIName.data());
967
968 StringRef FloatABI = getMipsFloatABI(D, Args);
969
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000970 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
971
972 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000973 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000974 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000975 CmdArgs.push_back("-mfloat-abi");
976 CmdArgs.push_back("soft");
977
978 // FIXME: Note, this is a hack. We need to pass the selected float
979 // mode to the MipsTargetInfoBase to define appropriate macros there.
980 // Now it is the only method.
981 CmdArgs.push_back("-target-feature");
982 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000983
984 if (FloatABI == "hard" && IsMips16) {
985 CmdArgs.push_back("-mllvm");
986 CmdArgs.push_back("-mips16-hard-float");
987 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000988 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000989 else {
990 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000991 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000992 CmdArgs.push_back("-mfloat-abi");
993 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000994 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000995
Simon Atanasyan82eec3a2013-04-14 14:07:36 +0000996 AddTargetFeature(Args, CmdArgs,
997 options::OPT_msingle_float, options::OPT_mdouble_float,
998 "single-float");
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000999 AddTargetFeature(Args, CmdArgs,
1000 options::OPT_mips16, options::OPT_mno_mips16,
1001 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001002 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan60777612013-04-14 14:07:51 +00001003 options::OPT_mmicromips, options::OPT_mno_micromips,
1004 "micromips");
1005 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001006 options::OPT_mdsp, options::OPT_mno_dsp,
1007 "dsp");
1008 AddTargetFeature(Args, CmdArgs,
1009 options::OPT_mdspr2, options::OPT_mno_dspr2,
1010 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001011
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001012 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1013 if (A->getOption().matches(options::OPT_mxgot)) {
1014 CmdArgs.push_back("-mllvm");
1015 CmdArgs.push_back("-mxgot");
1016 }
1017 }
1018
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001019 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001020 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001021 CmdArgs.push_back("-mllvm");
1022 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1023 A->claim();
1024 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001025}
1026
Hal Finkel8eb59282012-06-11 22:35:19 +00001027/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1028static std::string getPPCTargetCPU(const ArgList &Args) {
1029 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001030 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001031
1032 if (CPUName == "native") {
1033 std::string CPU = llvm::sys::getHostCPUName();
1034 if (!CPU.empty() && CPU != "generic")
1035 return CPU;
1036 else
1037 return "";
1038 }
1039
1040 return llvm::StringSwitch<const char *>(CPUName)
1041 .Case("common", "generic")
1042 .Case("440", "440")
1043 .Case("440fp", "440")
1044 .Case("450", "450")
1045 .Case("601", "601")
1046 .Case("602", "602")
1047 .Case("603", "603")
1048 .Case("603e", "603e")
1049 .Case("603ev", "603ev")
1050 .Case("604", "604")
1051 .Case("604e", "604e")
1052 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001053 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001054 .Case("G3", "g3")
1055 .Case("7400", "7400")
1056 .Case("G4", "g4")
1057 .Case("7450", "7450")
1058 .Case("G4+", "g4+")
1059 .Case("750", "750")
1060 .Case("970", "970")
1061 .Case("G5", "g5")
1062 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001063 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001064 .Case("e500mc", "e500mc")
1065 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001066 .Case("power3", "pwr3")
1067 .Case("power4", "pwr4")
1068 .Case("power5", "pwr5")
1069 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001070 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001071 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001072 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001073 .Case("pwr3", "pwr3")
1074 .Case("pwr4", "pwr4")
1075 .Case("pwr5", "pwr5")
1076 .Case("pwr5x", "pwr5x")
1077 .Case("pwr6", "pwr6")
1078 .Case("pwr6x", "pwr6x")
1079 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001080 .Case("powerpc", "ppc")
1081 .Case("powerpc64", "ppc64")
1082 .Default("");
1083 }
1084
1085 return "";
1086}
1087
1088void Clang::AddPPCTargetArgs(const ArgList &Args,
1089 ArgStringList &CmdArgs) const {
1090 std::string TargetCPUName = getPPCTargetCPU(Args);
1091
1092 // LLVM may default to generating code for the native CPU,
1093 // but, like gcc, we default to a more generic option for
1094 // each architecture. (except on Darwin)
1095 llvm::Triple Triple = getToolChain().getTriple();
1096 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1097 if (Triple.getArch() == llvm::Triple::ppc64)
1098 TargetCPUName = "ppc64";
1099 else
1100 TargetCPUName = "ppc";
1101 }
1102
1103 if (!TargetCPUName.empty()) {
1104 CmdArgs.push_back("-target-cpu");
1105 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1106 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001107
1108 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001109 AddTargetFeature(Args, CmdArgs,
1110 options::OPT_faltivec, options::OPT_fno_altivec,
1111 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001112
Hal Finkel7d458592013-03-30 13:47:44 +00001113 AddTargetFeature(Args, CmdArgs,
1114 options::OPT_mfprnd, options::OPT_mno_fprnd,
1115 "fprnd");
1116
Hal Finkel279ca4d2013-03-28 08:38:53 +00001117 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1118 AddTargetFeature(Args, CmdArgs,
1119 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1120 "mfocrf");
1121
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001122 AddTargetFeature(Args, CmdArgs,
1123 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1124 "popcntd");
1125
Hal Finkel279ca4d2013-03-28 08:38:53 +00001126 // It is really only possible to turn qpx off because turning qpx on is tied
1127 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001128 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1129 CmdArgs.push_back("-target-feature");
1130 CmdArgs.push_back("-qpx");
1131 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001132}
1133
Tom Stellard6674c702013-04-01 20:56:53 +00001134/// Get the (LLVM) name of the R600 gpu we are targeting.
1135static std::string getR600TargetGPU(const ArgList &Args) {
1136 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1137 std::string GPUName = A->getValue();
1138 return llvm::StringSwitch<const char *>(GPUName)
1139 .Cases("rv610", "rv620", "rv630", "r600")
1140 .Cases("rv635", "rs780", "rs880", "r600")
1141 .Case("rv740", "rv770")
1142 .Case("palm", "cedar")
1143 .Cases("sumo", "sumo2", "redwood")
1144 .Case("hemlock", "cypress")
1145 .Case("aruba", "cayman")
1146 .Default(GPUName.c_str());
1147 }
1148 return "";
1149}
1150
1151void Clang::AddR600TargetArgs(const ArgList &Args,
1152 ArgStringList &CmdArgs) const {
1153 std::string TargetGPUName = getR600TargetGPU(Args);
1154 CmdArgs.push_back("-target-cpu");
1155 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1156}
1157
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001158void Clang::AddSparcTargetArgs(const ArgList &Args,
1159 ArgStringList &CmdArgs) const {
1160 const Driver &D = getToolChain().getDriver();
1161
1162 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001163 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001164 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001165 }
1166
1167 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001168 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001169 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1170 options::OPT_mhard_float)) {
1171 if (A->getOption().matches(options::OPT_msoft_float))
1172 FloatABI = "soft";
1173 else if (A->getOption().matches(options::OPT_mhard_float))
1174 FloatABI = "hard";
1175 }
1176
1177 // If unspecified, choose the default based on the platform.
1178 if (FloatABI.empty()) {
1179 switch (getToolChain().getTriple().getOS()) {
1180 default:
1181 // Assume "soft", but warn the user we are guessing.
1182 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001183 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001184 break;
1185 }
1186 }
1187
1188 if (FloatABI == "soft") {
1189 // Floating point operations and argument passing are soft.
1190 //
1191 // FIXME: This changes CPP defines, we need -target-soft-float.
1192 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001193 CmdArgs.push_back("-target-feature");
1194 CmdArgs.push_back("+soft-float");
1195 } else {
1196 assert(FloatABI == "hard" && "Invalid float abi!");
1197 CmdArgs.push_back("-mhard-float");
1198 }
1199}
1200
Chandler Carruth953fb082013-01-13 11:46:33 +00001201static const char *getX86TargetCPU(const ArgList &Args,
1202 const llvm::Triple &Triple) {
1203 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1204 if (StringRef(A->getValue()) != "native")
1205 return A->getValue();
1206
1207 // FIXME: Reject attempts to use -march=native unless the target matches
1208 // the host.
1209 //
1210 // FIXME: We should also incorporate the detected target features for use
1211 // with -native.
1212 std::string CPU = llvm::sys::getHostCPUName();
1213 if (!CPU.empty() && CPU != "generic")
1214 return Args.MakeArgString(CPU);
1215 }
1216
1217 // Select the default CPU if none was given (or detection failed).
1218
1219 if (Triple.getArch() != llvm::Triple::x86_64 &&
1220 Triple.getArch() != llvm::Triple::x86)
1221 return 0; // This routine is only handling x86 targets.
1222
1223 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1224
1225 // FIXME: Need target hooks.
1226 if (Triple.isOSDarwin())
1227 return Is64Bit ? "core2" : "yonah";
1228
1229 // Everything else goes to x86-64 in 64-bit mode.
1230 if (Is64Bit)
1231 return "x86-64";
1232
1233 if (Triple.getOSName().startswith("haiku"))
1234 return "i586";
1235 if (Triple.getOSName().startswith("openbsd"))
1236 return "i486";
1237 if (Triple.getOSName().startswith("bitrig"))
1238 return "i686";
1239 if (Triple.getOSName().startswith("freebsd"))
1240 return "i486";
1241 if (Triple.getOSName().startswith("netbsd"))
1242 return "i486";
1243 // All x86 devices running Android have core2 as their common
1244 // denominator. This makes a better choice than pentium4.
1245 if (Triple.getEnvironment() == llvm::Triple::Android)
1246 return "core2";
1247
1248 // Fallback to p4.
1249 return "pentium4";
1250}
1251
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001252void Clang::AddX86TargetArgs(const ArgList &Args,
1253 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001254 if (!Args.hasFlag(options::OPT_mred_zone,
1255 options::OPT_mno_red_zone,
1256 true) ||
1257 Args.hasArg(options::OPT_mkernel) ||
1258 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001259 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001260
Bob Wilson2616e2e2013-02-10 16:01:41 +00001261 // Default to avoid implicit floating-point for kernel/kext code, but allow
1262 // that to be overridden with -mno-soft-float.
1263 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1264 Args.hasArg(options::OPT_fapple_kext));
1265 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1266 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001267 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001268 options::OPT_mno_implicit_float)) {
1269 const Option &O = A->getOption();
1270 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1271 O.matches(options::OPT_msoft_float));
1272 }
1273 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001274 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001275
Chandler Carruth953fb082013-01-13 11:46:33 +00001276 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001277 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001278 CmdArgs.push_back(CPUName);
1279 }
1280
Eli Friedmanad811f02011-07-02 00:34:19 +00001281 // The required algorithm here is slightly strange: the options are applied
1282 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1283 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1284 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1285 // former correctly, but not the latter; handle directly-overridden
1286 // attributes here.
1287 llvm::StringMap<unsigned> PrevFeature;
1288 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001289 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1290 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001291 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001292 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001293
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001294 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001295 assert(Name.startswith("m") && "Invalid feature name.");
1296 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001297
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001298 bool IsNegative = Name.startswith("no-");
1299 if (IsNegative)
1300 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001301
Eli Friedmanad811f02011-07-02 00:34:19 +00001302 unsigned& Prev = PrevFeature[Name];
1303 if (Prev)
1304 Features[Prev - 1] = 0;
1305 Prev = Features.size() + 1;
1306 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1307 }
1308 for (unsigned i = 0; i < Features.size(); i++) {
1309 if (Features[i]) {
1310 CmdArgs.push_back("-target-feature");
1311 CmdArgs.push_back(Features[i]);
1312 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001313 }
1314}
1315
Matthew Curtise8f80a12012-12-06 17:49:03 +00001316static inline bool HasPICArg(const ArgList &Args) {
1317 return Args.hasArg(options::OPT_fPIC)
1318 || Args.hasArg(options::OPT_fpic);
1319}
1320
1321static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1322 return Args.getLastArg(options::OPT_G,
1323 options::OPT_G_EQ,
1324 options::OPT_msmall_data_threshold_EQ);
1325}
1326
1327static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1328 std::string value;
1329 if (HasPICArg(Args))
1330 value = "0";
1331 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1332 value = A->getValue();
1333 A->claim();
1334 }
1335 return value;
1336}
1337
Tony Linthicum76329bf2011-12-12 21:14:55 +00001338void Clang::AddHexagonTargetArgs(const ArgList &Args,
1339 ArgStringList &CmdArgs) const {
1340 llvm::Triple Triple = getToolChain().getTriple();
1341
1342 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001343 CmdArgs.push_back(Args.MakeArgString(
1344 "hexagon"
1345 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001346 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001347 CmdArgs.push_back("-mqdsp6-compat");
1348 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001349
Matthew Curtise8f80a12012-12-06 17:49:03 +00001350 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1351 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001352 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001353 CmdArgs.push_back(Args.MakeArgString(
1354 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001355 }
1356
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001357 if (!Args.hasArg(options::OPT_fno_short_enums))
1358 CmdArgs.push_back("-fshort-enums");
1359 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1360 CmdArgs.push_back ("-mllvm");
1361 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1362 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001363 CmdArgs.push_back ("-mllvm");
1364 CmdArgs.push_back ("-machine-sink-split=0");
1365}
1366
Eric Christopher84fbdb42011-08-19 00:30:14 +00001367static bool
John McCall5fb5df92012-06-20 06:18:46 +00001368shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001369 const llvm::Triple &Triple) {
1370 // We use the zero-cost exception tables for Objective-C if the non-fragile
1371 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1372 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001373 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001374 return true;
1375
Bob Wilson6524dd32011-10-14 05:03:44 +00001376 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001377 return false;
1378
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001379 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001380 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001381 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001382}
1383
Anders Carlssone96ab552011-02-28 02:27:16 +00001384/// addExceptionArgs - Adds exception related arguments to the driver command
1385/// arguments. There's a master flag, -fexceptions and also language specific
1386/// flags to enable/disable C++ and Objective-C exceptions.
1387/// This makes it possible to for example disable C++ exceptions but enable
1388/// Objective-C exceptions.
1389static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1390 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001391 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001392 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001393 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001394 if (KernelOrKext) {
1395 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1396 // arguments now to avoid warnings about unused arguments.
1397 Args.ClaimAllArgs(options::OPT_fexceptions);
1398 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1399 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1400 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1401 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1402 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001403 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001404 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001405
1406 // Exceptions are enabled by default.
1407 bool ExceptionsEnabled = true;
1408
1409 // This keeps track of whether exceptions were explicitly turned on or off.
1410 bool DidHaveExplicitExceptionFlag = false;
1411
Rafael Espindola00a66572009-10-01 13:33:33 +00001412 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1413 options::OPT_fno_exceptions)) {
1414 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001415 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001416 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001417 ExceptionsEnabled = false;
1418
1419 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001420 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001421
Anders Carlssone96ab552011-02-28 02:27:16 +00001422 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001423
Anders Carlssone96ab552011-02-28 02:27:16 +00001424 // Exception tables and cleanups can be enabled with -fexceptions even if the
1425 // language itself doesn't support exceptions.
1426 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1427 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001428
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001429 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1430 // is not necessarily sensible, but follows GCC.
1431 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001432 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001433 options::OPT_fno_objc_exceptions,
1434 true)) {
1435 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001436
Eric Christopher84fbdb42011-08-19 00:30:14 +00001437 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001438 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001439 }
1440
1441 if (types::isCXX(InputType)) {
1442 bool CXXExceptionsEnabled = ExceptionsEnabled;
1443
Eric Christopher84fbdb42011-08-19 00:30:14 +00001444 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1445 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001446 options::OPT_fexceptions,
1447 options::OPT_fno_exceptions)) {
1448 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1449 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001450 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001451 CXXExceptionsEnabled = false;
1452 }
1453
1454 if (CXXExceptionsEnabled) {
1455 CmdArgs.push_back("-fcxx-exceptions");
1456
1457 ShouldUseExceptionTables = true;
1458 }
1459 }
1460
1461 if (ShouldUseExceptionTables)
1462 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001463}
1464
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001465static bool ShouldDisableAutolink(const ArgList &Args,
1466 const ToolChain &TC) {
1467 bool Default = true;
1468 if (TC.getTriple().isOSDarwin()) {
1469 // The native darwin assembler doesn't support the linker_option directives,
1470 // so we disable them if we think the .s file will be passed to it.
1471 Default = TC.useIntegratedAs();
1472 }
1473 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1474 Default);
1475}
1476
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001477static bool ShouldDisableCFI(const ArgList &Args,
1478 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001479 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001480 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001481 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001482 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001483 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001484 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001485 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001486 options::OPT_fno_dwarf2_cfi_asm,
1487 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001488}
1489
Ted Kremenek62093662013-03-12 17:02:12 +00001490static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1491 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001492 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1493 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001494 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001495 return !UseDwarfDirectory;
1496}
1497
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001498/// \brief Check whether the given input tree contains any compilation actions.
1499static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001500 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001501 return true;
1502
1503 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1504 if (ContainsCompileAction(*it))
1505 return true;
1506
1507 return false;
1508}
1509
1510/// \brief Check if -relax-all should be passed to the internal assembler.
1511/// This is done by default when compiling non-assembler source with -O0.
1512static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1513 bool RelaxDefault = true;
1514
1515 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1516 RelaxDefault = A->getOption().matches(options::OPT_O0);
1517
1518 if (RelaxDefault) {
1519 RelaxDefault = false;
1520 for (ActionList::const_iterator it = C.getActions().begin(),
1521 ie = C.getActions().end(); it != ie; ++it) {
1522 if (ContainsCompileAction(*it)) {
1523 RelaxDefault = true;
1524 break;
1525 }
1526 }
1527 }
1528
1529 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1530 RelaxDefault);
1531}
1532
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001533SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001534 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1535 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001536 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1537 // at least once (possibly, disabled further).
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001538 const Driver &D = TC.getDriver();
Richard Smith52be6192012-11-05 22:04:41 +00001539 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001540 unsigned Add, Remove;
1541 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001542 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001543 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001544 Kind |= Add;
1545 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001546 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001547 }
1548
Chad Rosierae229d52013-01-29 23:31:22 +00001549 UbsanTrapOnError =
1550 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1551 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1552 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1553
1554 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1555 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1556 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1557 D.Diag(diag::err_drv_argument_not_allowed_with)
1558 << "-fcatch-undefined-behavior"
1559 << "-fno-sanitize-undefined-trap-on-error";
1560 }
1561
1562 // Warn about undefined sanitizer options that require runtime support.
1563 if (UbsanTrapOnError && notAllowedWithTrap()) {
1564 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1565 D.Diag(diag::err_drv_argument_not_allowed_with)
1566 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1567 << "-fcatch-undefined-behavior";
1568 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1569 options::OPT_fno_sanitize_undefined_trap_on_error,
1570 false))
1571 D.Diag(diag::err_drv_argument_not_allowed_with)
1572 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1573 << "-fsanitize-undefined-trap-on-error";
1574 }
1575
Richard Smith52be6192012-11-05 22:04:41 +00001576 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001577 bool NeedsAsan = needsAsanRt();
1578 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001579 bool NeedsMsan = needsMsanRt();
Richard Smith06d87f12012-12-01 01:02:45 +00001580 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001581 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001582 << lastArgumentForKind(D, Args, NeedsAsanRt)
1583 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001584 if (NeedsAsan && NeedsMsan)
1585 D.Diag(diag::err_drv_argument_not_allowed_with)
1586 << lastArgumentForKind(D, Args, NeedsAsanRt)
1587 << lastArgumentForKind(D, Args, NeedsMsanRt);
1588 if (NeedsTsan && NeedsMsan)
1589 D.Diag(diag::err_drv_argument_not_allowed_with)
1590 << lastArgumentForKind(D, Args, NeedsTsanRt)
1591 << lastArgumentForKind(D, Args, NeedsMsanRt);
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001592
1593 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001594 // explicitly contain -fsanitize=address (probably, turned off later in the
1595 // command line).
1596 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1597 D.Diag(diag::warn_drv_unused_sanitizer)
1598 << lastArgumentForKind(D, Args, AddressFull)
1599 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001600
1601 // Parse -f(no-)sanitize-blacklist options.
1602 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1603 options::OPT_fno_sanitize_blacklist)) {
1604 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1605 std::string BLPath = BLArg->getValue();
1606 bool BLExists = false;
1607 if (!llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1608 BlacklistFile = BLPath;
1609 else
1610 D.Diag(diag::err_drv_no_such_file) << BLPath;
1611 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001612 } else {
1613 // If no -fsanitize-blacklist option is specified, try to look up for
1614 // blacklist in the resource directory.
1615 std::string BLPath;
1616 bool BLExists = false;
1617 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
1618 !llvm::sys::fs::exists(BLPath, BLExists) && BLExists)
1619 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001620 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001621
1622 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001623 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001624 MsanTrackOrigins =
1625 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1626 options::OPT_fno_sanitize_memory_track_origins,
1627 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001628
1629 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov7e434072013-04-09 07:27:44 +00001630 if (NeedsAsan) {
1631 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1632 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov29524a92013-01-20 13:12:12 +00001633 AsanZeroBaseShadow =
Alexey Samsonov7e434072013-04-09 07:27:44 +00001634 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1635 options::OPT_fno_sanitize_address_zero_base_shadow,
1636 ZeroBaseShadowDefault);
1637 // Zero-base shadow is a requirement on Android.
1638 if (IsAndroid && !AsanZeroBaseShadow) {
1639 D.Diag(diag::err_drv_argument_not_allowed_with)
1640 << "-fno-sanitize-address-zero-base-shadow"
1641 << lastArgumentForKind(D, Args, Address);
1642 }
1643 }
Richard Smith52be6192012-11-05 22:04:41 +00001644}
1645
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001646static void addSanitizerRTLinkFlagsLinux(
1647 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001648 const StringRef Sanitizer, bool BeforeLibStdCXX,
1649 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001650 // Sanitizer runtime is located in the Linux library directory and
1651 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1652 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1653 llvm::sys::path::append(
1654 LibSanitizer, "lib", "linux",
1655 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001656
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001657 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1658 // etc.) so that the linker picks custom versions of the global 'operator
1659 // new' and 'operator delete' symbols. We take the extreme (but simple)
1660 // strategy of inserting it at the front of the link command. It also
1661 // needs to be forced to end up in the executable, so wrap it in
1662 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001663 SmallVector<const char *, 3> LibSanitizerArgs;
1664 LibSanitizerArgs.push_back("-whole-archive");
1665 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1666 LibSanitizerArgs.push_back("-no-whole-archive");
1667
1668 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1669 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1670
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001671 CmdArgs.push_back("-lpthread");
1672 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001673
1674 // If possible, use a dynamic symbols file to export the symbols from the
1675 // runtime library. If we can't do so, use -export-dynamic instead to export
1676 // all symbols from the binary.
1677 if (ExportSymbols) {
1678 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1679 CmdArgs.push_back(
1680 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1681 else
1682 CmdArgs.push_back("-export-dynamic");
1683 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001684}
1685
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001686/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1687/// This needs to be called before we add the C run-time (malloc, etc).
1688static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001689 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001690 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001691 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1692 llvm::sys::path::append(LibAsan, "lib", "linux",
1693 (Twine("libclang_rt.asan-") +
1694 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001695 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001696 } else {
1697 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001698 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001699 }
1700 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001701}
1702
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001703/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1704/// This needs to be called before we add the C run-time (malloc, etc).
1705static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1706 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001707 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001708 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001709 }
1710}
1711
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001712/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1713/// This needs to be called before we add the C run-time (malloc, etc).
1714static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1715 ArgStringList &CmdArgs) {
1716 if (!Args.hasArg(options::OPT_shared)) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001717 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001718 }
1719}
1720
Richard Smithe30752c2012-10-09 19:52:38 +00001721/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1722/// (Linux).
1723static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001724 ArgStringList &CmdArgs, bool IsCXX,
1725 bool HasOtherSanitizerRt) {
1726 if (Args.hasArg(options::OPT_shared))
1727 return;
1728
1729 // Need a copy of sanitizer_common. This could come from another sanitizer
1730 // runtime; if we're not including one, include our own copy.
1731 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001732 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001733
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001734 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001735
1736 // Only include the bits of the runtime which need a C++ ABI library if
1737 // we're linking in C++ mode.
1738 if (IsCXX)
1739 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001740}
1741
Rafael Espindola224dd632011-12-14 21:02:23 +00001742static bool shouldUseFramePointer(const ArgList &Args,
1743 const llvm::Triple &Triple) {
1744 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1745 options::OPT_fomit_frame_pointer))
1746 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1747
Rafael Espindola00b29182011-12-14 21:50:24 +00001748 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001749 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1750 Triple.getArch() == llvm::Triple::x86) &&
1751 Triple.getOS() == llvm::Triple::Linux) {
1752 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1753 if (!A->getOption().matches(options::OPT_O0))
1754 return false;
1755 }
1756
1757 return true;
1758}
1759
Eric Christopherb7d97e92013-04-03 01:58:53 +00001760static bool shouldUseLeafFramePointer(const ArgList &Args,
1761 const llvm::Triple &Triple) {
1762 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1763 options::OPT_momit_leaf_frame_pointer))
1764 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1765
1766 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1767 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1768 Triple.getArch() == llvm::Triple::x86) &&
1769 Triple.getOS() == llvm::Triple::Linux) {
1770 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1771 if (!A->getOption().matches(options::OPT_O0))
1772 return false;
1773 }
1774
1775 return true;
1776}
1777
Chad Rosier1675c0e2013-04-27 01:14:43 +00001778// FIXME: This is a temporary hack until I can find a fix that works for all
1779// platforms.
1780#define MAXPATHLEN 4096
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001781/// If the PWD environment variable is set, add a CC1 option to specify the
1782/// debug compilation directory.
1783static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001784 struct stat StatPWDBuf, StatDotBuf;
1785
1786 const char *pwd;
1787 if ((pwd = ::getenv("PWD")) != 0 &&
1788 llvm::sys::path::is_absolute(pwd) &&
1789 stat(pwd, &StatPWDBuf) == 0 &&
1790 stat(".", &StatDotBuf) == 0 &&
1791 StatPWDBuf.st_ino == StatDotBuf.st_ino &&
1792 StatPWDBuf.st_dev == StatDotBuf.st_dev) {
1793 CmdArgs.push_back("-fdebug-compilation-dir");
1794 CmdArgs.push_back(Args.MakeArgString(pwd));
1795 return;
1796 }
1797 // Fall back to using getcwd.
Chad Rosier1675c0e2013-04-27 01:14:43 +00001798 char *cwd;
1799 if (pwd && ::getcwd(cwd, MAXPATHLEN)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001800 CmdArgs.push_back("-fdebug-compilation-dir");
1801 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001802 }
1803}
1804
Eric Christopherd3804002013-02-22 20:12:52 +00001805static const char *SplitDebugName(const ArgList &Args,
1806 const InputInfoList &Inputs) {
1807 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1808 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1809 SmallString<128> T(FinalOutput->getValue());
1810 llvm::sys::path::replace_extension(T, "dwo");
1811 return Args.MakeArgString(T);
1812 } else {
1813 // Use the compilation dir.
1814 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1815 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1816 llvm::sys::path::replace_extension(F, "dwo");
1817 T += F;
1818 return Args.MakeArgString(F);
1819 }
1820}
1821
1822static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1823 const Tool &T, const JobAction &JA,
1824 const ArgList &Args, const InputInfo &Output,
1825 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001826 ArgStringList ExtractArgs;
1827 ExtractArgs.push_back("--extract-dwo");
1828
1829 ArgStringList StripArgs;
1830 StripArgs.push_back("--strip-dwo");
1831
1832 // Grabbing the output of the earlier compile step.
1833 StripArgs.push_back(Output.getFilename());
1834 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001835 ExtractArgs.push_back(OutFile);
1836
1837 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001838 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001839
1840 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001841 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001842
1843 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001844 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001845}
1846
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001847static bool isOptimizationLevelFast(const ArgList &Args) {
1848 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1849 if (A->getOption().matches(options::OPT_Ofast))
1850 return true;
1851 return false;
1852}
1853
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001854void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001855 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001856 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001857 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001858 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001859 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1860 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001861 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001862 ArgStringList CmdArgs;
1863
Daniel Dunbare521a892009-03-31 20:53:55 +00001864 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1865
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001866 // Invoke ourselves in -cc1 mode.
1867 //
1868 // FIXME: Implement custom jobs for internal actions.
1869 CmdArgs.push_back("-cc1");
1870
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001871 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001872 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001873 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001874 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001875
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001876 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001877 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001878
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001879 if (isa<AnalyzeJobAction>(JA)) {
1880 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1881 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001882 } else if (isa<MigrateJobAction>(JA)) {
1883 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001884 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001885 if (Output.getType() == types::TY_Dependencies)
1886 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001887 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001888 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001889 if (Args.hasArg(options::OPT_rewrite_objc) &&
1890 !Args.hasArg(options::OPT_g_Group))
1891 CmdArgs.push_back("-P");
1892 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001893 } else if (isa<AssembleJobAction>(JA)) {
1894 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001895
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001896 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001897 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001898
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001899 // When using an integrated assembler, translate -Wa, and -Xassembler
1900 // options.
1901 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1902 options::OPT_Xassembler),
1903 ie = Args.filtered_end(); it != ie; ++it) {
1904 const Arg *A = *it;
1905 A->claim();
1906
1907 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001908 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001909
1910 if (Value == "-force_cpusubtype_ALL") {
1911 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001912 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001913 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001914 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001915 CmdArgs.push_back("-mllvm");
1916 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001917 } else if (Value == "--noexecstack") {
1918 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001919 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001920 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001921 << A->getOption().getName() << Value;
1922 }
1923 }
1924 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001925
1926 // Also ignore explicit -force_cpusubtype_ALL option.
1927 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001928 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001929 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001930 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001931
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001932 if (JA.getType() == types::TY_Nothing)
1933 CmdArgs.push_back("-fsyntax-only");
1934 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001935 CmdArgs.push_back("-emit-pch");
1936 else
1937 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001938 } else {
1939 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001940
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001941 if (JA.getType() == types::TY_Nothing) {
1942 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001943 } else if (JA.getType() == types::TY_LLVM_IR ||
1944 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001945 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001946 } else if (JA.getType() == types::TY_LLVM_BC ||
1947 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001948 CmdArgs.push_back("-emit-llvm-bc");
1949 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001950 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001951 } else if (JA.getType() == types::TY_AST) {
1952 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00001953 } else if (JA.getType() == types::TY_ModuleFile) {
1954 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001955 } else if (JA.getType() == types::TY_RewrittenObjC) {
1956 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001957 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001958 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1959 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001960 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001961 } else {
1962 assert(JA.getType() == types::TY_PP_Asm &&
1963 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001964 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001965 }
1966
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001967 // The make clang go fast button.
1968 CmdArgs.push_back("-disable-free");
1969
John McCallbb79b5f2010-02-13 03:50:24 +00001970 // Disable the verification pass in -asserts builds.
1971#ifdef NDEBUG
1972 CmdArgs.push_back("-disable-llvm-verifier");
1973#endif
1974
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001975 // Set the main file name, so that debug info works even with
1976 // -save-temps.
1977 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00001978 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001979
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001980 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00001981 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001982 if (Args.hasArg(options::OPT_static))
1983 CmdArgs.push_back("-static-define");
1984
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001985 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001986 // Enable region store model by default.
1987 CmdArgs.push_back("-analyzer-store=region");
1988
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001989 // Treat blocks as analysis entry points.
1990 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1991
Ted Kremenek49c79792011-03-24 00:28:47 +00001992 CmdArgs.push_back("-analyzer-eagerly-assume");
1993
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001994 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001995 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001996 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001997
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001998 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1999 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002000
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002001 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002002 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002003
2004 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002005
Jordan Rose10ad0812013-04-05 17:55:07 +00002006 if (types::isCXX(Inputs[0].getType()))
2007 CmdArgs.push_back("-analyzer-checker=cplusplus");
2008
Ted Kremenek37e96522012-01-26 02:27:38 +00002009 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002010 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2011 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2012 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2013 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2014 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2015 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002016 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002017
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002018 // Set the output format. The default is plist, for (lame) historical
2019 // reasons.
2020 CmdArgs.push_back("-analyzer-output");
2021 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002022 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002023 else
2024 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002025
Ted Kremenekfe449a22010-03-22 22:32:05 +00002026 // Disable the presentation of standard compiler warnings when
2027 // using --analyze. We only want to show static analyzer diagnostics
2028 // or frontend errors.
2029 CmdArgs.push_back("-w");
2030
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002031 // Add -Xanalyzer arguments when running as analyzer.
2032 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002033 }
2034
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002035 CheckCodeGenerationOptions(D, Args);
2036
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002037 bool PIE = getToolChain().isPIEDefault();
2038 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002039 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002040
Alexey Samsonov090301e2013-04-09 12:28:19 +00002041 // For the PIC and PIE flag options, this logic is different from the
2042 // legacy logic in very old versions of GCC, as that logic was just
2043 // a bug no one had ever fixed. This logic is both more rational and
2044 // consistent with GCC's new logic now that the bugs are fixed. The last
2045 // argument relating to either PIC or PIE wins, and no other argument is
2046 // used. If the last argument is any flavor of the '-fno-...' arguments,
2047 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2048 // at the same level.
2049 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2050 options::OPT_fpic, options::OPT_fno_pic,
2051 options::OPT_fPIE, options::OPT_fno_PIE,
2052 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002053 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2054 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002055 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002056 if (LastPICArg) {
2057 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002058 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2059 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2060 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2061 PIC = PIE || O.matches(options::OPT_fPIC) ||
2062 O.matches(options::OPT_fpic);
2063 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2064 O.matches(options::OPT_fPIC);
2065 } else {
2066 PIE = PIC = false;
2067 }
2068 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002069 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002070
2071 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2072 // specified while enabling PIC enabled level 1 PIC, just force it back to
2073 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2074 // informal testing).
2075 if (PIC && getToolChain().getTriple().isOSDarwin())
2076 IsPICLevelTwo |= getToolChain().isPICDefault();
2077
Chandler Carruthc0c04552012-04-08 16:40:35 +00002078 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2079 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002080 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002081 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002082 (Triple.getOS() != llvm::Triple::IOS ||
2083 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002084 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002085 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002086 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002087
Chandler Carruth76a943b2012-11-19 03:52:03 +00002088 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2089 // This is a very special mode. It trumps the other modes, almost no one
2090 // uses it, and it isn't even valid on any OS but Darwin.
2091 if (!getToolChain().getTriple().isOSDarwin())
2092 D.Diag(diag::err_drv_unsupported_opt_for_target)
2093 << A->getSpelling() << getToolChain().getTriple().str();
2094
2095 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2096
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002097 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002098 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002099
Chandler Carruth76a943b2012-11-19 03:52:03 +00002100 // Only a forced PIC mode can cause the actual compile to have PIC defines
2101 // etc., no flags are sufficient. This behavior was selected to closely
2102 // match that of llvm-gcc and Apple GCC before that.
2103 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2104 CmdArgs.push_back("-pic-level");
2105 CmdArgs.push_back("2");
2106 }
2107 } else {
2108 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2109 // handled in Clang's IRGen by the -pie-level flag.
2110 CmdArgs.push_back("-mrelocation-model");
2111 CmdArgs.push_back(PIC ? "pic" : "static");
2112
2113 if (PIC) {
2114 CmdArgs.push_back("-pic-level");
2115 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2116 if (PIE) {
2117 CmdArgs.push_back("-pie-level");
2118 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2119 }
2120 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002121 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002122
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002123 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2124 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002125 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002126
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002127 // LLVM Code Generator Options.
2128
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002129 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2130 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002131 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002132 }
2133
Roman Divacky65b88cd2011-03-01 17:40:53 +00002134 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2135 CmdArgs.push_back("-mrtd");
2136
Rafael Espindola224dd632011-12-14 21:02:23 +00002137 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002138 CmdArgs.push_back("-mdisable-fp-elim");
2139 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2140 options::OPT_fno_zero_initialized_in_bss))
2141 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002142
2143 bool OFastEnabled = isOptimizationLevelFast(Args);
2144 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2145 // enabled. This alias option is being used to simplify the hasFlag logic.
2146 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2147 options::OPT_fstrict_aliasing;
2148 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002149 options::OPT_fno_strict_aliasing,
2150 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002151 CmdArgs.push_back("-relaxed-aliasing");
Manman Renc451e572013-04-04 21:53:22 +00002152 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2153 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002154 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2155 false))
2156 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002157 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2158 options::OPT_fno_optimize_sibling_calls))
2159 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002160
Eric Christopher006208c2013-04-04 06:29:47 +00002161 // Handle segmented stacks.
2162 if (Args.hasArg(options::OPT_fsplit_stack))
2163 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002164
2165 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2166 // This alias option is being used to simplify the getLastArg logic.
2167 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2168 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002169
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002170 // Handle various floating point optimization flags, mapping them to the
2171 // appropriate LLVM code generation flags. The pattern for all of these is to
2172 // default off the codegen optimizations, and if any flag enables them and no
2173 // flag disables them after the flag enabling them, enable the codegen
2174 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002175 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002176 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002177 options::OPT_ffinite_math_only,
2178 options::OPT_fno_finite_math_only,
2179 options::OPT_fhonor_infinities,
2180 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002181 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2182 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002183 A->getOption().getID() != options::OPT_fhonor_infinities)
2184 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002185 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002186 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002187 options::OPT_ffinite_math_only,
2188 options::OPT_fno_finite_math_only,
2189 options::OPT_fhonor_nans,
2190 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002191 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2192 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002193 A->getOption().getID() != options::OPT_fhonor_nans)
2194 CmdArgs.push_back("-menable-no-nans");
2195
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002196 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2197 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002198 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002199 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002200 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00002201 options::OPT_fno_math_errno))
2202 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
2203 if (MathErrno)
2204 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002205
2206 // There are several flags which require disabling very specific
2207 // optimizations. Any of these being disabled forces us to turn off the
2208 // entire set of LLVM optimizations, so collect them through all the flag
2209 // madness.
2210 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002211 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002212 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002213 options::OPT_funsafe_math_optimizations,
2214 options::OPT_fno_unsafe_math_optimizations,
2215 options::OPT_fassociative_math,
2216 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002217 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2218 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002219 A->getOption().getID() != options::OPT_fno_associative_math)
2220 AssociativeMath = true;
2221 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002222 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002223 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002224 options::OPT_funsafe_math_optimizations,
2225 options::OPT_fno_unsafe_math_optimizations,
2226 options::OPT_freciprocal_math,
2227 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002228 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2229 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002230 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2231 ReciprocalMath = true;
2232 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002233 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002234 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002235 options::OPT_funsafe_math_optimizations,
2236 options::OPT_fno_unsafe_math_optimizations,
2237 options::OPT_fsigned_zeros,
2238 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002239 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2240 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002241 A->getOption().getID() != options::OPT_fsigned_zeros)
2242 SignedZeros = false;
2243 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002244 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002245 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002246 options::OPT_funsafe_math_optimizations,
2247 options::OPT_fno_unsafe_math_optimizations,
2248 options::OPT_ftrapping_math,
2249 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002250 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2251 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002252 A->getOption().getID() != options::OPT_ftrapping_math)
2253 TrappingMath = false;
2254 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2255 !TrappingMath)
2256 CmdArgs.push_back("-menable-unsafe-fp-math");
2257
Lang Hamesaa53b932012-07-06 00:59:19 +00002258
2259 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002261 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002262 options::OPT_ffp_contract)) {
2263 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002264 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002265 if (Val == "fast" || Val == "on" || Val == "off") {
2266 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2267 } else {
2268 D.Diag(diag::err_drv_unsupported_option_argument)
2269 << A->getOption().getName() << Val;
2270 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002271 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2272 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002273 // If fast-math is set then set the fp-contract mode to fast.
2274 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2275 }
2276 }
2277
Bob Wilson6a039162012-07-19 03:52:53 +00002278 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2279 // and if we find them, tell the frontend to provide the appropriate
2280 // preprocessor macros. This is distinct from enabling any optimizations as
2281 // these options induce language changes which must survive serialization
2282 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002283 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2284 options::OPT_fno_fast_math))
2285 if (!A->getOption().matches(options::OPT_fno_fast_math))
2286 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002287 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2288 if (A->getOption().matches(options::OPT_ffinite_math_only))
2289 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002290
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002291 // Decide whether to use verbose asm. Verbose assembly is the default on
2292 // toolchains which have the integrated assembler on by default.
2293 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2294 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002295 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002296 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002297 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002298
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002299 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2300 CmdArgs.push_back("-mdebug-pass");
2301 CmdArgs.push_back("Structure");
2302 }
2303 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2304 CmdArgs.push_back("-mdebug-pass");
2305 CmdArgs.push_back("Arguments");
2306 }
2307
John McCall8517abc2010-02-19 02:45:38 +00002308 // Enable -mconstructor-aliases except on darwin, where we have to
2309 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002310 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002311 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002312
John McCall7ef5cb32011-03-18 02:56:14 +00002313 // Darwin's kernel doesn't support guard variables; just die if we
2314 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002315 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002316 CmdArgs.push_back("-fforbid-guard-variables");
2317
Douglas Gregordbe39272011-02-01 15:15:22 +00002318 if (Args.hasArg(options::OPT_mms_bitfields)) {
2319 CmdArgs.push_back("-mms-bitfields");
2320 }
John McCall8517abc2010-02-19 02:45:38 +00002321
Daniel Dunbar306945d2009-09-16 06:17:29 +00002322 // This is a coarse approximation of what llvm-gcc actually does, both
2323 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2324 // complicated ways.
2325 bool AsynchronousUnwindTables =
2326 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2327 options::OPT_fno_asynchronous_unwind_tables,
2328 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002329 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002330 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2331 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002332 CmdArgs.push_back("-munwind-tables");
2333
Chandler Carruth05fb5852012-11-21 23:40:23 +00002334 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002335
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002336 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2337 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002338 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002339 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002340
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002341 // FIXME: Handle -mtune=.
2342 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002343
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002344 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002345 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002346 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002347 }
2348
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002349 // Add target specific cpu and features flags.
2350 switch(getToolChain().getTriple().getArch()) {
2351 default:
2352 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002353
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002354 case llvm::Triple::arm:
2355 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002356 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002357 break;
2358
Eric Christopher0b26a612010-03-02 02:41:08 +00002359 case llvm::Triple::mips:
2360 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002361 case llvm::Triple::mips64:
2362 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002363 AddMIPSTargetArgs(Args, CmdArgs);
2364 break;
2365
Hal Finkel8eb59282012-06-11 22:35:19 +00002366 case llvm::Triple::ppc:
2367 case llvm::Triple::ppc64:
2368 AddPPCTargetArgs(Args, CmdArgs);
2369 break;
2370
Tom Stellard6674c702013-04-01 20:56:53 +00002371 case llvm::Triple::r600:
2372 AddR600TargetArgs(Args, CmdArgs);
2373 break;
2374
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002375 case llvm::Triple::sparc:
2376 AddSparcTargetArgs(Args, CmdArgs);
2377 break;
2378
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002379 case llvm::Triple::x86:
2380 case llvm::Triple::x86_64:
2381 AddX86TargetArgs(Args, CmdArgs);
2382 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002383
2384 case llvm::Triple::hexagon:
2385 AddHexagonTargetArgs(Args, CmdArgs);
2386 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002387 }
2388
Tony Linthicum76329bf2011-12-12 21:14:55 +00002389
2390
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002391 // Pass the linker version in use.
2392 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2393 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002394 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002395 }
2396
Eric Christopherb7d97e92013-04-03 01:58:53 +00002397 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002398 CmdArgs.push_back("-momit-leaf-frame-pointer");
2399
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002400 // Explicitly error on some things we know we don't support and can't just
2401 // ignore.
2402 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002403 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2404 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002405 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002406 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002407 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002408 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2409 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002410 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002411 << Unsupported->getOption().getName();
2412 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002413 }
2414
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002415 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002416 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002417 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002418 CmdArgs.push_back("-header-include-file");
2419 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2420 D.CCPrintHeadersFilename : "-");
2421 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002422 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002423 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002424
Chad Rosierbe10f982011-08-02 17:58:04 +00002425 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002426 CmdArgs.push_back("-diagnostic-log-file");
2427 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2428 D.CCLogDiagnosticsFilename : "-");
2429 }
2430
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002431 // Use the last option from "-g" group. "-gline-tables-only"
2432 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002433 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002434 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002435 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002436 CmdArgs.push_back("-gline-tables-only");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002437 else if (!A->getOption().matches(options::OPT_g0) &&
2438 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002439 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002440 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002441
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002442 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2443 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002444 if (Args.hasArg(options::OPT_gcolumn_info))
2445 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002446
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002447 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2448 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002449 // FIXME: Currently only works on Linux.
2450 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2451 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002452 CmdArgs.push_back("-g");
2453 CmdArgs.push_back("-backend-option");
2454 CmdArgs.push_back("-split-dwarf=Enable");
2455 }
2456
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002457 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2458 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2459
Chris Lattner3c77a352010-06-22 00:03:40 +00002460 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2461
Nick Lewycky207bce32011-04-21 23:44:07 +00002462 if (Args.hasArg(options::OPT_ftest_coverage) ||
2463 Args.hasArg(options::OPT_coverage))
2464 CmdArgs.push_back("-femit-coverage-notes");
2465 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2466 Args.hasArg(options::OPT_coverage))
2467 CmdArgs.push_back("-femit-coverage-data");
2468
Nick Lewycky480cb992011-05-04 20:46:58 +00002469 if (C.getArgs().hasArg(options::OPT_c) ||
2470 C.getArgs().hasArg(options::OPT_S)) {
2471 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002472 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002473 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002474 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2475 if (const char *pwd = ::getenv("PWD")) {
2476 if (llvm::sys::path::is_absolute(pwd)) {
2477 SmallString<128> Pwd(pwd);
2478 llvm::sys::path::append(Pwd, CoverageFilename.str());
2479 CoverageFilename.swap(Pwd);
2480 }
2481 }
2482 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002483 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002484 }
2485 }
2486
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002487 // Pass options for controlling the default header search paths.
2488 if (Args.hasArg(options::OPT_nostdinc)) {
2489 CmdArgs.push_back("-nostdsysteminc");
2490 CmdArgs.push_back("-nobuiltininc");
2491 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002492 if (Args.hasArg(options::OPT_nostdlibinc))
2493 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002494 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2495 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2496 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002497
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002498 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002499 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002500 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002501
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002502 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2503
Ted Kremenekf7639e12012-03-06 20:06:33 +00002504 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002505 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002506 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002507 options::OPT_ccc_arcmt_modify,
2508 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002509 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002510 switch (A->getOption().getID()) {
2511 default:
2512 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002513 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002514 CmdArgs.push_back("-arcmt-check");
2515 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002516 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002517 CmdArgs.push_back("-arcmt-modify");
2518 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002519 case options::OPT_ccc_arcmt_migrate:
2520 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002521 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002522 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002523
2524 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2525 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002526 break;
John McCalld70fb982011-06-15 23:25:17 +00002527 }
2528 }
2529 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002530
Ted Kremenekf7639e12012-03-06 20:06:33 +00002531 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2532 if (ARCMTEnabled) {
2533 D.Diag(diag::err_drv_argument_not_allowed_with)
2534 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2535 }
2536 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002537 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002538
2539 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2540 options::OPT_objcmt_migrate_subscripting)) {
2541 // None specified, means enable them all.
2542 CmdArgs.push_back("-objcmt-migrate-literals");
2543 CmdArgs.push_back("-objcmt-migrate-subscripting");
2544 } else {
2545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2547 }
2548 }
2549
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002550 // Add preprocessing options like -I, -D, etc. if we are using the
2551 // preprocessor.
2552 //
2553 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002554 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002555 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002556
Rafael Espindolaa7431922011-07-21 23:40:37 +00002557 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2558 // that "The compiler can only warn and ignore the option if not recognized".
2559 // When building with ccache, it will pass -D options to clang even on
2560 // preprocessed inputs and configure concludes that -fPIC is not supported.
2561 Args.ClaimAllArgs(options::OPT_D);
2562
Daniel Dunbar58f78332009-09-17 06:53:36 +00002563 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002564 // others.
2565 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002566 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002567 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002568 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002569 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002570 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002571 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002572 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002573 }
2574
Chad Rosier86b82082012-12-12 20:06:31 +00002575 // Don't warn about unused -flto. This can happen when we're preprocessing or
2576 // precompiling.
2577 Args.ClaimAllArgs(options::OPT_flto);
2578
Daniel Dunbar945577c2009-10-29 02:24:45 +00002579 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002580 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2581 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002582 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002583 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002584
2585 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2586 // (-ansi is equivalent to -std=c89).
2587 //
2588 // If a std is supplied, only add -trigraphs if it follows the
2589 // option.
2590 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2591 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002592 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002593 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002594 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002595 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002596 else
2597 Std->render(Args, CmdArgs);
2598
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002599 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2600 options::OPT_trigraphs))
2601 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002602 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002603 } else {
2604 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002605 //
2606 // FIXME: Clang doesn't correctly handle -std= when the input language
2607 // doesn't match. For the time being just ignore this for C++ inputs;
2608 // eventually we want to do all the standard defaulting here instead of
2609 // splitting it between the driver and clang -cc1.
2610 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002611 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2612 "-std=", /*Joined=*/true);
2613 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2614 CmdArgs.push_back("-std=c++11");
2615
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002616 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002617 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002618
Chandler Carruthb009b142011-04-23 06:30:43 +00002619 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2620 // '-fconst-strings'; this better indicates its actual behavior.
2621 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2622 false)) {
2623 // For perfect compatibility with GCC, we do this even in the presence of
2624 // '-w'. This flag names something other than a warning for GCC.
2625 CmdArgs.push_back("-fconst-strings");
2626 }
2627
Chandler Carruth61fbf622011-04-23 09:27:53 +00002628 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002629 // during C++ compilation, which it is by default. GCC keeps this define even
2630 // in the presence of '-w', match this behavior bug-for-bug.
2631 if (types::isCXX(InputType) &&
2632 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2633 true)) {
2634 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002635 }
2636
Chandler Carruthe0391482010-05-22 02:21:53 +00002637 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2638 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2639 if (Asm->getOption().matches(options::OPT_fasm))
2640 CmdArgs.push_back("-fgnu-keywords");
2641 else
2642 CmdArgs.push_back("-fno-gnu-keywords");
2643 }
2644
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002645 if (ShouldDisableCFI(Args, getToolChain()))
2646 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002647
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002648 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2649 CmdArgs.push_back("-fno-dwarf-directory-asm");
2650
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002651 if (ShouldDisableAutolink(Args, getToolChain()))
2652 CmdArgs.push_back("-fno-autolink");
2653
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002654 // Add in -fdebug-compilation-dir if necessary.
2655 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002656
Richard Smith9a568822011-11-21 19:36:32 +00002657 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2658 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002659 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002660 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002661 }
2662
Richard Smith9a568822011-11-21 19:36:32 +00002663 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2664 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002665 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002666 }
2667
Richard Smithb3a14522013-02-22 01:59:51 +00002668 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2669 CmdArgs.push_back("-fbracket-depth");
2670 CmdArgs.push_back(A->getValue());
2671 }
2672
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002673 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2674 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002675 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002676 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002677 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2678 } else
2679 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002680 }
2681
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002682
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002683 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002684 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002685
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002686 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2687 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002688 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002689 }
David Chisnall5778fce2009-08-31 16:41:57 +00002690
Chris Lattnere23003d2010-01-09 21:54:33 +00002691 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2692 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002693 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002694 }
2695
Chris Lattnerb35583d2010-04-07 20:49:23 +00002696 CmdArgs.push_back("-ferror-limit");
2697 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002698 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002699 else
2700 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002701
Chandler Carrutha77a7272010-05-06 04:55:18 +00002702 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2703 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002704 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002705 }
2706
2707 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2708 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002709 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002710 }
2711
Richard Smithf6f003a2011-12-16 19:06:07 +00002712 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2713 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002714 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002715 }
2716
Daniel Dunbar2c978472009-11-04 06:24:47 +00002717 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002718 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002719 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002720 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002721 } else {
2722 // If -fmessage-length=N was not specified, determine whether this is a
2723 // terminal and, if so, implicitly define -fmessage-length appropriately.
2724 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002725 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002726 }
2727
John McCallb4a99d32013-02-19 01:57:35 +00002728 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2729 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2730 options::OPT_fvisibility_ms_compat)) {
2731 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2732 CmdArgs.push_back("-fvisibility");
2733 CmdArgs.push_back(A->getValue());
2734 } else {
2735 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2736 CmdArgs.push_back("-fvisibility");
2737 CmdArgs.push_back("hidden");
2738 CmdArgs.push_back("-ftype-visibility");
2739 CmdArgs.push_back("default");
2740 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002741 }
2742
Douglas Gregor08329632010-06-15 17:05:35 +00002743 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002744
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002745 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2746
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002747 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002748 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2749 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002750 CmdArgs.push_back("-ffreestanding");
2751
Daniel Dunbare357d562009-12-03 18:42:11 +00002752 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002753 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002754 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002755 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002756 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002757 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002758 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002759 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2760 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002761
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002762 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smith52be6192012-11-05 22:04:41 +00002763 Sanitize.addArgs(Args, CmdArgs);
2764
Will Dietz3676d562012-12-30 20:53:28 +00002765 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2766 options::OPT_fno_sanitize_recover,
2767 true))
2768 CmdArgs.push_back("-fno-sanitize-recover");
2769
Chad Rosierae229d52013-01-29 23:31:22 +00002770 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2771 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2772 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2773 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2774
Eric Christopher459d2712013-02-19 06:16:53 +00002775 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002776 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2777 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2778 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2779 D.Diag(diag::err_drv_argument_only_allowed_with)
2780 << A->getAsString(Args) << "ppc/ppc64";
2781
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002782 if (getToolChain().SupportsProfiling())
2783 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002784
2785 // -flax-vector-conversions is default.
2786 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2787 options::OPT_fno_lax_vector_conversions))
2788 CmdArgs.push_back("-fno-lax-vector-conversions");
2789
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002790 if (Args.getLastArg(options::OPT_fapple_kext))
2791 CmdArgs.push_back("-fapple-kext");
2792
David Blaikie690f21e2012-06-14 18:55:27 +00002793 if (Args.hasFlag(options::OPT_frewrite_includes,
2794 options::OPT_fno_rewrite_includes, false))
2795 CmdArgs.push_back("-frewrite-includes");
2796
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002797 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002798 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002799 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002800 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2801 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002802
2803 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2804 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002805 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002806 }
2807
Bob Wilson14adb362012-02-03 06:27:22 +00002808 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002809
Chandler Carruth6e501032011-03-27 00:04:55 +00002810 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2811 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2812 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2813 options::OPT_fno_wrapv)) {
2814 if (A->getOption().matches(options::OPT_fwrapv))
2815 CmdArgs.push_back("-fwrapv");
2816 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2817 options::OPT_fno_strict_overflow)) {
2818 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2819 CmdArgs.push_back("-fwrapv");
2820 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002821 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002822 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002824 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2825
Mahesha S6a682be42012-10-27 07:47:56 +00002826
Daniel Dunbar4930e332009-11-17 08:07:36 +00002827 // -stack-protector=0 is default.
2828 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002829 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2830 options::OPT_fstack_protector_all,
2831 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002832 if (A->getOption().matches(options::OPT_fstack_protector))
2833 StackProtectorLevel = 1;
2834 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2835 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002836 } else {
2837 StackProtectorLevel =
2838 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2839 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002840 if (StackProtectorLevel) {
2841 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002842 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002843 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002844
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002845 // --param ssp-buffer-size=
2846 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2847 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002848 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002849 if (Str.startswith("ssp-buffer-size=")) {
2850 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002851 CmdArgs.push_back("-stack-protector-buffer-size");
2852 // FIXME: Verify the argument is a valid integer.
2853 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002854 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002855 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002856 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002857 }
2858
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002859 // Translate -mstackrealign
2860 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2861 false)) {
2862 CmdArgs.push_back("-backend-option");
2863 CmdArgs.push_back("-force-align-stack");
2864 }
2865 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2866 false)) {
2867 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2868 }
2869
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002870 if (Args.hasArg(options::OPT_mstack_alignment)) {
2871 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2872 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002873 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002874 // -mkernel implies -mstrict-align; don't add the redundant option.
2875 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002876 CmdArgs.push_back("-backend-option");
2877 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002878 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002879
Daniel Dunbard18049a2009-04-07 21:16:11 +00002880 // Forward -f options with positive and negative forms; we translate
2881 // these by hand.
2882
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002883 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002884 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002885 CmdArgs.push_back("-fapple-kext");
2886 if (!Args.hasArg(options::OPT_fbuiltin))
2887 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002888 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002889 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002890 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002891 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002892 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002893
Nuno Lopes13c88c72009-12-16 16:59:22 +00002894 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2895 options::OPT_fno_assume_sane_operator_new))
2896 CmdArgs.push_back("-fno-assume-sane-operator-new");
2897
Daniel Dunbar4930e332009-11-17 08:07:36 +00002898 // -fblocks=0 is default.
2899 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002900 getToolChain().IsBlocksDefault()) ||
2901 (Args.hasArg(options::OPT_fgnu_runtime) &&
2902 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2903 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002904 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002905
2906 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2907 !getToolChain().hasBlocksRuntime())
2908 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002909 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002910
Douglas Gregor226173a2012-01-18 15:19:58 +00002911 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2912 // users must also pass -fcxx-modules. The latter flag will disappear once the
2913 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00002914 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00002915 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2916 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2917 options::OPT_fno_cxx_modules,
2918 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00002919 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00002920 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00002921 HaveModules = true;
2922 }
2923 }
2924
Douglas Gregor35b04d62013-02-07 19:01:24 +00002925 // If a module path was provided, pass it along. Otherwise, use a temporary
2926 // directory.
2927 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
2928 A->claim();
2929 if (HaveModules) {
2930 A->render(Args, CmdArgs);
2931 }
2932 } else if (HaveModules) {
2933 SmallString<128> DefaultModuleCache;
2934 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
2935 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00002936 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
2937 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00002938 const char Arg[] = "-fmodules-cache-path=";
2939 DefaultModuleCache.insert(DefaultModuleCache.begin(),
2940 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00002941 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
2942 }
2943
2944 // Pass through all -fmodules-ignore-macro arguments.
2945 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00002946 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
2947 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00002948
John McCalldfea9982010-04-09 19:12:06 +00002949 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002950 if (Args.hasFlag(options::OPT_fno_access_control,
2951 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002952 false))
John McCall3155f572010-04-09 19:03:51 +00002953 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002954
Anders Carlssond470fef2010-11-21 00:09:52 +00002955 // -felide-constructors is the default.
2956 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2957 options::OPT_felide_constructors,
2958 false))
2959 CmdArgs.push_back("-fno-elide-constructors");
2960
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002961 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002962 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002963 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002964 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002965
Richard Smith52be6192012-11-05 22:04:41 +00002966 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00002967 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00002968 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00002969 Args.getLastArg(options::OPT_mkernel,
2970 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00002971 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00002972 D.Diag(diag::err_drv_argument_not_allowed_with)
2973 << "-fsanitize=vptr" << NoRttiArg;
2974 }
2975 }
2976
Tony Linthicum76329bf2011-12-12 21:14:55 +00002977 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002978 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002979 options::OPT_fno_short_enums,
2980 getToolChain().getTriple().getArch() ==
2981 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002982 CmdArgs.push_back("-fshort-enums");
2983
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002984 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002985 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002986 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002987 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002988
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002989 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002990 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002991 options::OPT_fno_threadsafe_statics))
2992 CmdArgs.push_back("-fno-threadsafe-statics");
2993
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002994 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002995 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2996 options::OPT_fno_use_cxa_atexit,
2997 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002998 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002999 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
3000 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003001 CmdArgs.push_back("-fno-use-cxa-atexit");
3002
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003003 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003004 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003005 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3006 CmdArgs.push_back("-fms-extensions");
3007
Francois Pichet1b4f1632011-09-17 04:32:15 +00003008 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003009 if (Args.hasFlag(options::OPT_fms_compatibility,
3010 options::OPT_fno_ms_compatibility,
3011 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3012 Args.hasFlag(options::OPT_fms_extensions,
3013 options::OPT_fno_ms_extensions,
3014 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003015 CmdArgs.push_back("-fms-compatibility");
3016
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003017 // -fmsc-version=1300 is default.
3018 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3019 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3020 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003021 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003022 if (msc_ver.empty())
3023 CmdArgs.push_back("-fmsc-version=1300");
3024 else
3025 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3026 }
3027
3028
Eric Christopher5ecce122013-02-18 00:38:31 +00003029 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003030 if (Args.hasFlag(options::OPT_fborland_extensions,
3031 options::OPT_fno_borland_extensions, false))
3032 CmdArgs.push_back("-fborland-extensions");
3033
Francois Pichet02744872011-09-01 16:38:08 +00003034 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3035 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003036 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3037 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003038 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003039 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003040
Chandler Carruthe03aa552010-04-17 20:17:31 +00003041 // -fgnu-keywords default varies depending on language; only pass if
3042 // specified.
3043 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003044 options::OPT_fno_gnu_keywords))
3045 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003046
Rafael Espindola922a6242011-06-02 17:30:53 +00003047 if (Args.hasFlag(options::OPT_fgnu89_inline,
3048 options::OPT_fno_gnu89_inline,
3049 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003050 CmdArgs.push_back("-fgnu89-inline");
3051
Chad Rosier9c76d242012-03-15 22:31:42 +00003052 if (Args.hasArg(options::OPT_fno_inline))
3053 CmdArgs.push_back("-fno-inline");
3054
Chad Rosier64d6be92012-03-06 21:17:19 +00003055 if (Args.hasArg(options::OPT_fno_inline_functions))
3056 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003057
John McCall5fb5df92012-06-20 06:18:46 +00003058 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003059
John McCall5fb5df92012-06-20 06:18:46 +00003060 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3061 // legacy is the default.
3062 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003063 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3064 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003065 objcRuntime.isLegacyDispatchDefaultForArch(
3066 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003067 if (getToolChain().UseObjCMixedDispatch())
3068 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3069 else
3070 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3071 }
3072 }
3073
Nico Weber97bd94b2012-03-09 21:19:44 +00003074 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3075 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00003076 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00003077 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3078 }
3079
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003080 // -fencode-extended-block-signature=1 is default.
3081 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3082 CmdArgs.push_back("-fencode-extended-block-signature");
3083 }
3084
John McCall24fc0de2011-07-06 00:26:06 +00003085 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3086 // NOTE: This logic is duplicated in ToolChains.cpp.
3087 bool ARC = isObjCAutoRefCount(Args);
3088 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003089 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003090
John McCall24fc0de2011-07-06 00:26:06 +00003091 CmdArgs.push_back("-fobjc-arc");
3092
Chandler Carruth491db322011-11-04 07:34:47 +00003093 // FIXME: It seems like this entire block, and several around it should be
3094 // wrapped in isObjC, but for now we just use it here as this is where it
3095 // was being used previously.
3096 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3097 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3098 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3099 else
3100 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3101 }
3102
John McCall24fc0de2011-07-06 00:26:06 +00003103 // Allow the user to enable full exceptions code emission.
3104 // We define off for Objective-CC, on for Objective-C++.
3105 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3106 options::OPT_fno_objc_arc_exceptions,
3107 /*default*/ types::isCXX(InputType)))
3108 CmdArgs.push_back("-fobjc-arc-exceptions");
3109 }
3110
3111 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3112 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003113 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003114 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003115
John McCall24fc0de2011-07-06 00:26:06 +00003116 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3117 // takes precedence.
3118 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3119 if (!GCArg)
3120 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3121 if (GCArg) {
3122 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003123 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003124 << GCArg->getAsString(Args);
3125 } else if (getToolChain().SupportsObjCGC()) {
3126 GCArg->render(Args, CmdArgs);
3127 } else {
3128 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003129 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003130 << GCArg->getAsString(Args);
3131 }
3132 }
3133
John McCallb5f652e2011-06-22 00:53:57 +00003134 // Add exception args.
3135 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003136 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003137
3138 if (getToolChain().UseSjLjExceptions())
3139 CmdArgs.push_back("-fsjlj-exceptions");
3140
3141 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003142 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3143 options::OPT_fno_assume_sane_operator_new))
3144 CmdArgs.push_back("-fno-assume-sane-operator-new");
3145
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003146 // -fconstant-cfstrings is default, and may be subject to argument translation
3147 // on Darwin.
3148 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3149 options::OPT_fno_constant_cfstrings) ||
3150 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3151 options::OPT_mno_constant_cfstrings))
3152 CmdArgs.push_back("-fno-constant-cfstrings");
3153
John Thompsoned4e2952009-11-05 20:14:16 +00003154 // -fshort-wchar default varies depending on platform; only
3155 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003156 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3157 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003158
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003159 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3160 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003161 //
3162 // FIXME: This is gross; that translation should be pulled from the
3163 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003164 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003165 options::OPT_fno_pascal_strings,
3166 false) ||
3167 Args.hasFlag(options::OPT_mpascal_strings,
3168 options::OPT_mno_pascal_strings,
3169 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003170 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003171
Daniel Dunbar096ed292011-10-05 21:04:55 +00003172 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3173 // -fno-pack-struct doesn't apply to -fpack-struct=.
3174 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003175 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003176 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003177 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003178 } else if (Args.hasFlag(options::OPT_fpack_struct,
3179 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003180 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003181 }
3182
Eric Christopher8d56caa2013-02-18 01:16:37 +00003183 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003184 if (!Args.hasArg(options::OPT_fcommon))
3185 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003186 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003187 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003188
Daniel Dunbard18049a2009-04-07 21:16:11 +00003189 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003190 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003191 CmdArgs.push_back("-fno-common");
3192
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003193 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003194 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003195 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003196 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003197 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003198 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3199
Daniel Dunbar6358d682010-10-15 22:30:42 +00003200 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3201 if (!Args.hasFlag(options::OPT_ffor_scope,
3202 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003203 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003204 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3205
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003206 // -fcaret-diagnostics is default.
3207 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3208 options::OPT_fno_caret_diagnostics, true))
3209 CmdArgs.push_back("-fno-caret-diagnostics");
3210
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003211 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003212 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003213 options::OPT_fno_diagnostics_fixit_info))
3214 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003215
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003216 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003217 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003218 options::OPT_fno_diagnostics_show_option))
3219 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003220
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003221 if (const Arg *A =
3222 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3223 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003224 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003225 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003226
Douglas Gregor643c9222011-05-21 17:07:29 +00003227 if (const Arg *A =
3228 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3229 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003230 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003231 }
3232
Chandler Carruthb6766f02011-03-27 01:50:55 +00003233 if (Arg *A = Args.getLastArg(
3234 options::OPT_fdiagnostics_show_note_include_stack,
3235 options::OPT_fno_diagnostics_show_note_include_stack)) {
3236 if (A->getOption().matches(
3237 options::OPT_fdiagnostics_show_note_include_stack))
3238 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3239 else
3240 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3241 }
3242
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003243 // Color diagnostics are the default, unless the terminal doesn't support
3244 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003245 // Support both clang's -f[no-]color-diagnostics and gcc's
3246 // -f[no-]diagnostics-colors[=never|always|auto].
3247 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3248 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3249 it != ie; ++it) {
3250 const Option &O = (*it)->getOption();
3251 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3252 !O.matches(options::OPT_fdiagnostics_color) &&
3253 !O.matches(options::OPT_fno_color_diagnostics) &&
3254 !O.matches(options::OPT_fno_diagnostics_color) &&
3255 !O.matches(options::OPT_fdiagnostics_color_EQ))
3256 continue;
3257
3258 (*it)->claim();
3259 if (O.matches(options::OPT_fcolor_diagnostics) ||
3260 O.matches(options::OPT_fdiagnostics_color)) {
3261 ShowColors = Colors_On;
3262 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3263 O.matches(options::OPT_fno_diagnostics_color)) {
3264 ShowColors = Colors_Off;
3265 } else {
3266 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3267 StringRef value((*it)->getValue());
3268 if (value == "always")
3269 ShowColors = Colors_On;
3270 else if (value == "never")
3271 ShowColors = Colors_Off;
3272 else if (value == "auto")
3273 ShowColors = Colors_Auto;
3274 else
3275 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3276 << ("-fdiagnostics-color=" + value).str();
3277 }
3278 }
3279 if (ShowColors == Colors_On ||
3280 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003281 CmdArgs.push_back("-fcolor-diagnostics");
3282
Daniel Dunbardb097022009-06-08 21:13:54 +00003283 if (!Args.hasFlag(options::OPT_fshow_source_location,
3284 options::OPT_fno_show_source_location))
3285 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003286
Douglas Gregor643c9222011-05-21 17:07:29 +00003287 if (!Args.hasFlag(options::OPT_fshow_column,
3288 options::OPT_fno_show_column,
3289 true))
3290 CmdArgs.push_back("-fno-show-column");
3291
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003292 if (!Args.hasFlag(options::OPT_fspell_checking,
3293 options::OPT_fno_spell_checking))
3294 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003295
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003296
Chad Rosierc8e56e82012-12-05 21:08:21 +00003297 // -fno-asm-blocks is default.
3298 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3299 false))
3300 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003301
Chad Rosier679b0752013-04-24 18:29:59 +00003302 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3303 // This alias option is being used to simplify the hasFlag logic.
3304 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3305 options::OPT_fvectorize;
3306
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003307 // -fvectorize is default.
Chad Rosier679b0752013-04-24 18:29:59 +00003308 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003309 options::OPT_fno_vectorize, true)) {
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003310 CmdArgs.push_back("-backend-option");
3311 CmdArgs.push_back("-vectorize-loops");
3312 }
3313
Hal Finkel061f1652012-12-11 19:59:32 +00003314 // -fno-slp-vectorize is default.
3315 if (Args.hasFlag(options::OPT_fslp_vectorize,
3316 options::OPT_fno_slp_vectorize, false)) {
3317 CmdArgs.push_back("-backend-option");
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003318 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003319 }
3320
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003321 // -fno-slp-vectorize-aggressive is default.
3322 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
3323 options::OPT_fno_slp_vectorize_aggressive, false)) {
3324 CmdArgs.push_back("-backend-option");
3325 CmdArgs.push_back("-vectorize-slp-aggressive");
3326 }
3327
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003328 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3329 A->render(Args, CmdArgs);
3330
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003331 // -fdollars-in-identifiers default varies depending on platform and
3332 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003333 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003334 options::OPT_fno_dollars_in_identifiers)) {
3335 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003336 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003337 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003338 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003339 }
3340
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003341 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3342 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003343 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003344 options::OPT_fno_unit_at_a_time)) {
3345 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003346 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003347 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003348
Eli Friedman055c9702011-11-02 01:53:16 +00003349 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3350 options::OPT_fno_apple_pragma_pack, false))
3351 CmdArgs.push_back("-fapple-pragma-pack");
3352
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003353 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003354 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003355 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003356#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003357 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003358 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3359 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3360 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3361 CmdArgs.push_back("-fno-builtin-strcat");
3362 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3363 CmdArgs.push_back("-fno-builtin-strcpy");
3364 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003365#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003366
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003367 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003368 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003369 options::OPT_traditional_cpp)) {
3370 if (isa<PreprocessJobAction>(JA))
3371 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003372 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003373 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003374 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003375
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003376 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003377 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003378
3379 // Handle serialized diagnostics.
3380 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3381 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003382 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003383 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003384
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003385 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3386 CmdArgs.push_back("-fretain-comments-from-system-headers");
3387
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003388 // Forward -fcomment-block-commands to -cc1.
3389 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003390 // Forward -fparse-all-comments to -cc1.
3391 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003392
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003393 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3394 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003395 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003396 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3397 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003398 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003399
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003400 // We translate this by hand to the -cc1 argument, since nightly test uses
3401 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003402 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003403 CmdArgs.push_back("-disable-llvm-optzns");
3404 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003405 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003406 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003407
Daniel Dunbard67a3222009-03-30 06:36:42 +00003408 if (Output.getType() == types::TY_Dependencies) {
3409 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003410 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003411 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003412 CmdArgs.push_back(Output.getFilename());
3413 } else {
3414 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003415 }
3416
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003417 for (InputInfoList::const_iterator
3418 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3419 const InputInfo &II = *it;
3420 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003421 if (Args.hasArg(options::OPT_rewrite_objc))
3422 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3423 else
3424 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003425 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003426 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003427 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003428 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003429 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003430
Chris Lattnere9d7d782009-11-03 19:50:27 +00003431 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3432
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003433 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003434
3435 // Optionally embed the -cc1 level arguments into the debug info, for build
3436 // analysis.
3437 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003438 ArgStringList OriginalArgs;
3439 for (ArgList::const_iterator it = Args.begin(),
3440 ie = Args.end(); it != ie; ++it)
3441 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003442
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003443 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003444 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003445 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003446 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003447 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003448 }
3449 CmdArgs.push_back("-dwarf-debug-flags");
3450 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3451 }
3452
Eric Christopherd3804002013-02-22 20:12:52 +00003453 // Add the split debug info name to the command lines here so we
3454 // can propagate it to the backend.
3455 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3456 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003457 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003458 const char *SplitDwarfOut;
3459 if (SplitDwarf) {
3460 CmdArgs.push_back("-split-dwarf-file");
3461 SplitDwarfOut = SplitDebugName(Args, Inputs);
3462 CmdArgs.push_back(SplitDwarfOut);
3463 }
3464
3465 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003466 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003467
Eric Christopherf1545832013-02-22 23:50:16 +00003468 // Handle the debug info splitting at object creation time if we're
3469 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003470 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003471 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003472 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003473
Roman Divacky178e01602011-02-10 16:52:03 +00003474 if (Arg *A = Args.getLastArg(options::OPT_pg))
3475 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003476 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003477 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003478
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003479 // Claim some arguments which clang supports automatically.
3480
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003481 // -fpch-preprocess is used with gcc to add a special marker in the output to
3482 // include the PCH file. Clang's PTH solution is completely transparent, so we
3483 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003484 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003485
Daniel Dunbar17731772009-03-23 19:03:36 +00003486 // Claim some arguments which clang doesn't support, but we don't
3487 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003488 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3489 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003490
Rafael Espindolad95a8122011-03-01 05:25:27 +00003491 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003492 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003493 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003494}
3495
Jim Grosbach576452b2012-02-10 20:37:10 +00003496void ClangAs::AddARMTargetArgs(const ArgList &Args,
3497 ArgStringList &CmdArgs) const {
3498 const Driver &D = getToolChain().getDriver();
3499 llvm::Triple Triple = getToolChain().getTriple();
3500
3501 // Set the CPU based on -march= and -mcpu=.
3502 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003503 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003504
3505 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003506 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003507 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003508
3509 // Honor -mfpmath=.
3510 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003511 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003512}
3513
Benjamin Kramerb164d672013-02-22 20:55:17 +00003514void ClangAs::AddX86TargetArgs(const ArgList &Args,
3515 ArgStringList &CmdArgs) const {
3516 // Set the CPU based on -march=.
3517 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3518 CmdArgs.push_back("-target-cpu");
3519 CmdArgs.push_back(CPUName);
3520 }
3521}
3522
John McCall5fb5df92012-06-20 06:18:46 +00003523/// Add options related to the Objective-C runtime/ABI.
3524///
3525/// Returns true if the runtime is non-fragile.
3526ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3527 ArgStringList &cmdArgs,
3528 RewriteKind rewriteKind) const {
3529 // Look for the controlling runtime option.
3530 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3531 options::OPT_fgnu_runtime,
3532 options::OPT_fobjc_runtime_EQ);
3533
3534 // Just forward -fobjc-runtime= to the frontend. This supercedes
3535 // options about fragility.
3536 if (runtimeArg &&
3537 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3538 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003539 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003540 if (runtime.tryParse(value)) {
3541 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3542 << value;
3543 }
3544
3545 runtimeArg->render(args, cmdArgs);
3546 return runtime;
3547 }
3548
3549 // Otherwise, we'll need the ABI "version". Version numbers are
3550 // slightly confusing for historical reasons:
3551 // 1 - Traditional "fragile" ABI
3552 // 2 - Non-fragile ABI, version 1
3553 // 3 - Non-fragile ABI, version 2
3554 unsigned objcABIVersion = 1;
3555 // If -fobjc-abi-version= is present, use that to set the version.
3556 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003557 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003558 if (value == "1")
3559 objcABIVersion = 1;
3560 else if (value == "2")
3561 objcABIVersion = 2;
3562 else if (value == "3")
3563 objcABIVersion = 3;
3564 else
3565 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3566 << value;
3567 } else {
3568 // Otherwise, determine if we are using the non-fragile ABI.
3569 bool nonFragileABIIsDefault =
3570 (rewriteKind == RK_NonFragile ||
3571 (rewriteKind == RK_None &&
3572 getToolChain().IsObjCNonFragileABIDefault()));
3573 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3574 options::OPT_fno_objc_nonfragile_abi,
3575 nonFragileABIIsDefault)) {
3576 // Determine the non-fragile ABI version to use.
3577#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3578 unsigned nonFragileABIVersion = 1;
3579#else
3580 unsigned nonFragileABIVersion = 2;
3581#endif
3582
3583 if (Arg *abiArg = args.getLastArg(
3584 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003585 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003586 if (value == "1")
3587 nonFragileABIVersion = 1;
3588 else if (value == "2")
3589 nonFragileABIVersion = 2;
3590 else
3591 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3592 << value;
3593 }
3594
3595 objcABIVersion = 1 + nonFragileABIVersion;
3596 } else {
3597 objcABIVersion = 1;
3598 }
3599 }
3600
3601 // We don't actually care about the ABI version other than whether
3602 // it's non-fragile.
3603 bool isNonFragile = objcABIVersion != 1;
3604
3605 // If we have no runtime argument, ask the toolchain for its default runtime.
3606 // However, the rewriter only really supports the Mac runtime, so assume that.
3607 ObjCRuntime runtime;
3608 if (!runtimeArg) {
3609 switch (rewriteKind) {
3610 case RK_None:
3611 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3612 break;
3613 case RK_Fragile:
3614 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3615 break;
3616 case RK_NonFragile:
3617 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3618 break;
3619 }
3620
3621 // -fnext-runtime
3622 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3623 // On Darwin, make this use the default behavior for the toolchain.
3624 if (getToolChain().getTriple().isOSDarwin()) {
3625 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3626
3627 // Otherwise, build for a generic macosx port.
3628 } else {
3629 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3630 }
3631
3632 // -fgnu-runtime
3633 } else {
3634 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003635 // Legacy behaviour is to target the gnustep runtime if we are i
3636 // non-fragile mode or the GCC runtime in fragile mode.
3637 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003638 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003639 else
3640 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003641 }
3642
3643 cmdArgs.push_back(args.MakeArgString(
3644 "-fobjc-runtime=" + runtime.getAsString()));
3645 return runtime;
3646}
3647
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003648void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003649 const InputInfo &Output,
3650 const InputInfoList &Inputs,
3651 const ArgList &Args,
3652 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003653 ArgStringList CmdArgs;
3654
3655 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3656 const InputInfo &Input = Inputs[0];
3657
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003658 // Don't warn about "clang -w -c foo.s"
3659 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003660 // and "clang -emit-llvm -c foo.s"
3661 Args.ClaimAllArgs(options::OPT_emit_llvm);
3662 // and "clang -use-gold-plugin -c foo.s"
3663 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003664
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003665 // Invoke ourselves in -cc1as mode.
3666 //
3667 // FIXME: Implement custom jobs for internal actions.
3668 CmdArgs.push_back("-cc1as");
3669
3670 // Add the "effective" target triple.
3671 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003672 std::string TripleStr =
3673 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003674 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3675
3676 // Set the output mode, we currently only expect to be used as a real
3677 // assembler.
3678 CmdArgs.push_back("-filetype");
3679 CmdArgs.push_back("obj");
3680
Eric Christopher45f2e712012-12-18 00:31:10 +00003681 // Set the main file name, so that debug info works even with
3682 // -save-temps or preprocessed assembly.
3683 CmdArgs.push_back("-main-file-name");
3684 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3685
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003686 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003687 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003688
Jim Grosbach576452b2012-02-10 20:37:10 +00003689 // Add target specific cpu and features flags.
3690 switch(getToolChain().getTriple().getArch()) {
3691 default:
3692 break;
3693
3694 case llvm::Triple::arm:
3695 case llvm::Triple::thumb:
3696 AddARMTargetArgs(Args, CmdArgs);
3697 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003698
3699 case llvm::Triple::x86:
3700 case llvm::Triple::x86_64:
3701 AddX86TargetArgs(Args, CmdArgs);
3702 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003703 }
3704
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003705 // Ignore explicit -force_cpusubtype_ALL option.
3706 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003707
Eric Christopherfc3ee562012-01-10 00:38:01 +00003708 // Determine the original source input.
3709 const Action *SourceAction = &JA;
3710 while (SourceAction->getKind() != Action::InputClass) {
3711 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3712 SourceAction = SourceAction->getInputs()[0];
3713 }
3714
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003715 // Forward -g and handle debug info related flags, assuming we are dealing
3716 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003717 if (SourceAction->getType() == types::TY_Asm ||
3718 SourceAction->getType() == types::TY_PP_Asm) {
3719 Args.ClaimAllArgs(options::OPT_g_Group);
3720 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3721 if (!A->getOption().matches(options::OPT_g0))
3722 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003723
3724 // Add the -fdebug-compilation-dir flag if needed.
3725 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003726
3727 // Set the AT_producer to the clang version when using the integrated
3728 // assembler on assembly source files.
3729 CmdArgs.push_back("-dwarf-debug-producer");
3730 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003731 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003732
3733 // Optionally embed the -cc1as level arguments into the debug info, for build
3734 // analysis.
3735 if (getToolChain().UseDwarfDebugFlags()) {
3736 ArgStringList OriginalArgs;
3737 for (ArgList::const_iterator it = Args.begin(),
3738 ie = Args.end(); it != ie; ++it)
3739 (*it)->render(Args, OriginalArgs);
3740
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003741 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003742 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3743 Flags += Exec;
3744 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3745 Flags += " ";
3746 Flags += OriginalArgs[i];
3747 }
3748 CmdArgs.push_back("-dwarf-debug-flags");
3749 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3750 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003751
3752 // FIXME: Add -static support, once we have it.
3753
3754 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3755 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003756 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003757
3758 assert(Output.isFilename() && "Unexpected lipo output.");
3759 CmdArgs.push_back("-o");
3760 CmdArgs.push_back(Output.getFilename());
3761
Daniel Dunbarb440f562010-08-02 02:38:21 +00003762 assert(Input.isFilename() && "Invalid input.");
3763 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003764
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003765 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003766 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003767
3768 // Handle the debug info splitting at object creation time if we're
3769 // creating an object.
3770 // TODO: Currently only works on linux with newer objcopy.
3771 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3772 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3773 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3774 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003775}
3776
Daniel Dunbara3246a02009-03-18 08:07:30 +00003777void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003778 const InputInfo &Output,
3779 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003780 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003781 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003782 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003783 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003784
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003785 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003786 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003787 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003788 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003789 // Don't forward any -g arguments to assembly steps.
3790 if (isa<AssembleJobAction>(JA) &&
3791 A->getOption().matches(options::OPT_g_Group))
3792 continue;
3793
Daniel Dunbar2da02722009-03-19 07:55:12 +00003794 // It is unfortunate that we have to claim here, as this means
3795 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003796 // platforms using a generic gcc, even if we are just using gcc
3797 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003798 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003799 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003800 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003801 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003802
Daniel Dunbar4e295052010-01-25 22:35:08 +00003803 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003804
3805 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003806 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003807 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003808 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003809
3810 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003811 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003812 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003813 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003814 CmdArgs.push_back("ppc64");
3815 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003816 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003817 }
3818
Daniel Dunbar5716d872009-05-02 21:41:52 +00003819 // Try to force gcc to match the tool chain we want, if we recognize
3820 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003821 //
3822 // FIXME: The triple class should directly provide the information we want
3823 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003824 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003825 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003826 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003827 CmdArgs.push_back("-m64");
3828
Daniel Dunbarb440f562010-08-02 02:38:21 +00003829 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003830 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003831 CmdArgs.push_back(Output.getFilename());
3832 } else {
3833 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003834 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003835 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003836
Tony Linthicum76329bf2011-12-12 21:14:55 +00003837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3838 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003839
3840 // Only pass -x if gcc will understand it; otherwise hope gcc
3841 // understands the suffix correctly. The main use case this would go
3842 // wrong in is for linker inputs if they happened to have an odd
3843 // suffix; really the only way to get this to happen is a command
3844 // like '-x foobar a.c' which will treat a.c like a linker input.
3845 //
3846 // FIXME: For the linker case specifically, can we safely convert
3847 // inputs into '-Wl,' options?
3848 for (InputInfoList::const_iterator
3849 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3850 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003851
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003852 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003853 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3854 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003855 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003856 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003857 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003858 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003859 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003860 else if (II.getType() == types::TY_ModuleFile)
3861 D.Diag(diag::err_drv_no_module_support)
3862 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003863
Daniel Dunbara3246a02009-03-18 08:07:30 +00003864 if (types::canTypeBeUserSpecified(II.getType())) {
3865 CmdArgs.push_back("-x");
3866 CmdArgs.push_back(types::getTypeName(II.getType()));
3867 }
3868
Daniel Dunbarb440f562010-08-02 02:38:21 +00003869 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003870 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003871 else {
3872 const Arg &A = II.getInputArg();
3873
3874 // Reverse translate some rewritten options.
3875 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3876 CmdArgs.push_back("-lstdc++");
3877 continue;
3878 }
3879
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003880 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003881 A.render(Args, CmdArgs);
3882 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003883 }
3884
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003885 const std::string customGCCName = D.getCCCGenericGCCName();
3886 const char *GCCName;
3887 if (!customGCCName.empty())
3888 GCCName = customGCCName.c_str();
3889 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003890 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003891 } else
3892 GCCName = "gcc";
3893
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003894 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003895 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003896 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003897}
3898
Daniel Dunbar4e295052010-01-25 22:35:08 +00003899void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3900 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003901 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003902}
3903
Daniel Dunbar4e295052010-01-25 22:35:08 +00003904void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3905 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003906 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003907}
3908
Daniel Dunbar4e295052010-01-25 22:35:08 +00003909void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3910 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003911 const Driver &D = getToolChain().getDriver();
3912
Daniel Dunbar4e295052010-01-25 22:35:08 +00003913 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003914 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3915 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003916 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003917 else {
3918 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003919 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003920 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003921
Daniel Dunbar4e295052010-01-25 22:35:08 +00003922 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003923 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003924}
3925
Daniel Dunbar4e295052010-01-25 22:35:08 +00003926void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3927 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003928 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003929}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003930
Daniel Dunbar4e295052010-01-25 22:35:08 +00003931void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3932 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003933 // The types are (hopefully) good enough.
3934}
3935
Tony Linthicum76329bf2011-12-12 21:14:55 +00003936// Hexagon tools start.
3937void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3938 ArgStringList &CmdArgs) const {
3939
3940}
3941void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3942 const InputInfo &Output,
3943 const InputInfoList &Inputs,
3944 const ArgList &Args,
3945 const char *LinkingOutput) const {
3946
3947 const Driver &D = getToolChain().getDriver();
3948 ArgStringList CmdArgs;
3949
3950 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003951 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003952 CmdArgs.push_back(Args.MakeArgString(MarchString));
3953
3954 RenderExtraToolArgs(JA, CmdArgs);
3955
3956 if (Output.isFilename()) {
3957 CmdArgs.push_back("-o");
3958 CmdArgs.push_back(Output.getFilename());
3959 } else {
3960 assert(Output.isNothing() && "Unexpected output");
3961 CmdArgs.push_back("-fsyntax-only");
3962 }
3963
Matthew Curtise8f80a12012-12-06 17:49:03 +00003964 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
3965 if (!SmallDataThreshold.empty())
3966 CmdArgs.push_back(
3967 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003968
Matthew Curtise5df3812012-12-07 17:23:04 +00003969 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3970 options::OPT_Xassembler);
3971
Tony Linthicum76329bf2011-12-12 21:14:55 +00003972 // Only pass -x if gcc will understand it; otherwise hope gcc
3973 // understands the suffix correctly. The main use case this would go
3974 // wrong in is for linker inputs if they happened to have an odd
3975 // suffix; really the only way to get this to happen is a command
3976 // like '-x foobar a.c' which will treat a.c like a linker input.
3977 //
3978 // FIXME: For the linker case specifically, can we safely convert
3979 // inputs into '-Wl,' options?
3980 for (InputInfoList::const_iterator
3981 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3982 const InputInfo &II = *it;
3983
3984 // Don't try to pass LLVM or AST inputs to a generic gcc.
3985 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3986 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3987 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3988 << getToolChain().getTripleString();
3989 else if (II.getType() == types::TY_AST)
3990 D.Diag(clang::diag::err_drv_no_ast_support)
3991 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003992 else if (II.getType() == types::TY_ModuleFile)
3993 D.Diag(diag::err_drv_no_module_support)
3994 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00003995
3996 if (II.isFilename())
3997 CmdArgs.push_back(II.getFilename());
3998 else
3999 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4000 II.getInputArg().render(Args, CmdArgs);
4001 }
4002
4003 const char *GCCName = "hexagon-as";
4004 const char *Exec =
4005 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4006 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4007
4008}
4009void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4010 ArgStringList &CmdArgs) const {
4011 // The types are (hopefully) good enough.
4012}
4013
4014void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4015 const InputInfo &Output,
4016 const InputInfoList &Inputs,
4017 const ArgList &Args,
4018 const char *LinkingOutput) const {
4019
Matthew Curtise689b052012-12-06 15:46:07 +00004020 const toolchains::Hexagon_TC& ToolChain =
4021 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4022 const Driver &D = ToolChain.getDriver();
4023
Tony Linthicum76329bf2011-12-12 21:14:55 +00004024 ArgStringList CmdArgs;
4025
Matthew Curtise689b052012-12-06 15:46:07 +00004026 //----------------------------------------------------------------------------
4027 //
4028 //----------------------------------------------------------------------------
4029 bool hasStaticArg = Args.hasArg(options::OPT_static);
4030 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004031 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004032 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4033 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4034 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4035 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004036
Matthew Curtise689b052012-12-06 15:46:07 +00004037 //----------------------------------------------------------------------------
4038 // Silence warnings for various options
4039 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004040
Matthew Curtise689b052012-12-06 15:46:07 +00004041 Args.ClaimAllArgs(options::OPT_g_Group);
4042 Args.ClaimAllArgs(options::OPT_emit_llvm);
4043 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4044 // handled somewhere else.
4045 Args.ClaimAllArgs(options::OPT_static_libgcc);
4046
4047 //----------------------------------------------------------------------------
4048 //
4049 //----------------------------------------------------------------------------
4050 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4051 e = ToolChain.ExtraOpts.end();
4052 i != e; ++i)
4053 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004054
Matthew Curtisf10a5952012-12-06 14:16:43 +00004055 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4056 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004057
Matthew Curtise689b052012-12-06 15:46:07 +00004058 if (buildingLib) {
4059 CmdArgs.push_back("-shared");
4060 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4061 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004062 }
4063
Matthew Curtise689b052012-12-06 15:46:07 +00004064 if (hasStaticArg)
4065 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004066
Matthew Curtise8f80a12012-12-06 17:49:03 +00004067 if (buildPIE && !buildingLib)
4068 CmdArgs.push_back("-pie");
4069
4070 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4071 if (!SmallDataThreshold.empty()) {
4072 CmdArgs.push_back(
4073 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4074 }
4075
Matthew Curtise689b052012-12-06 15:46:07 +00004076 //----------------------------------------------------------------------------
4077 //
4078 //----------------------------------------------------------------------------
4079 CmdArgs.push_back("-o");
4080 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004081
Matthew Curtise689b052012-12-06 15:46:07 +00004082 const std::string MarchSuffix = "/" + MarchString;
4083 const std::string G0Suffix = "/G0";
4084 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4085 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4086 + "/";
4087 const std::string StartFilesDir = RootDir
4088 + "hexagon/lib"
4089 + (buildingLib
4090 ? MarchG0Suffix : MarchSuffix);
4091
4092 //----------------------------------------------------------------------------
4093 // moslib
4094 //----------------------------------------------------------------------------
4095 std::vector<std::string> oslibs;
4096 bool hasStandalone= false;
4097
4098 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4099 ie = Args.filtered_end(); it != ie; ++it) {
4100 (*it)->claim();
4101 oslibs.push_back((*it)->getValue());
4102 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004103 }
Matthew Curtise689b052012-12-06 15:46:07 +00004104 if (oslibs.empty()) {
4105 oslibs.push_back("standalone");
4106 hasStandalone = true;
4107 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004108
Matthew Curtise689b052012-12-06 15:46:07 +00004109 //----------------------------------------------------------------------------
4110 // Start Files
4111 //----------------------------------------------------------------------------
4112 if (incStdLib && incStartFiles) {
4113
4114 if (!buildingLib) {
4115 if (hasStandalone) {
4116 CmdArgs.push_back(
4117 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4118 }
4119 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4120 }
4121 std::string initObj = useShared ? "/initS.o" : "/init.o";
4122 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4123 }
4124
4125 //----------------------------------------------------------------------------
4126 // Library Search Paths
4127 //----------------------------------------------------------------------------
4128 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4129 for (ToolChain::path_list::const_iterator
4130 i = LibPaths.begin(),
4131 e = LibPaths.end();
4132 i != e;
4133 ++i)
4134 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4135
4136 //----------------------------------------------------------------------------
4137 //
4138 //----------------------------------------------------------------------------
4139 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4140 Args.AddAllArgs(CmdArgs, options::OPT_e);
4141 Args.AddAllArgs(CmdArgs, options::OPT_s);
4142 Args.AddAllArgs(CmdArgs, options::OPT_t);
4143 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4144
4145 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4146
4147 //----------------------------------------------------------------------------
4148 // Libraries
4149 //----------------------------------------------------------------------------
4150 if (incStdLib && incDefLibs) {
4151 if (D.CCCIsCXX) {
4152 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4153 CmdArgs.push_back("-lm");
4154 }
4155
4156 CmdArgs.push_back("--start-group");
4157
4158 if (!buildingLib) {
4159 for(std::vector<std::string>::iterator i = oslibs.begin(),
4160 e = oslibs.end(); i != e; ++i)
4161 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4162 CmdArgs.push_back("-lc");
4163 }
4164 CmdArgs.push_back("-lgcc");
4165
4166 CmdArgs.push_back("--end-group");
4167 }
4168
4169 //----------------------------------------------------------------------------
4170 // End files
4171 //----------------------------------------------------------------------------
4172 if (incStdLib && incStartFiles) {
4173 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4174 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4175 }
4176
4177 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4178 C.addCommand(
4179 new Command(
4180 JA, *this,
4181 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004182}
4183// Hexagon tools end.
4184
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004185llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4186 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4187 // archs which Darwin doesn't use.
4188
4189 // The matching this routine does is fairly pointless, since it is neither the
4190 // complete architecture list, nor a reasonable subset. The problem is that
4191 // historically the driver driver accepts this and also ties its -march=
4192 // handling to the architecture name, so we need to be careful before removing
4193 // support for it.
4194
4195 // This code must be kept in sync with Clang's Darwin specific argument
4196 // translation.
4197
4198 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4199 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4200 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4201 .Case("ppc64", llvm::Triple::ppc64)
4202 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4203 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4204 llvm::Triple::x86)
4205 .Case("x86_64", llvm::Triple::x86_64)
4206 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004207 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4208 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4209 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004210 .Case("r600", llvm::Triple::r600)
4211 .Case("nvptx", llvm::Triple::nvptx)
4212 .Case("nvptx64", llvm::Triple::nvptx64)
4213 .Case("amdil", llvm::Triple::amdil)
4214 .Case("spir", llvm::Triple::spir)
4215 .Default(llvm::Triple::UnknownArch);
4216}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004217
Bob Wilsondecc03e2012-11-23 06:14:39 +00004218const char *Clang::getBaseInputName(const ArgList &Args,
4219 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004220 return Args.MakeArgString(
4221 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004222}
4223
Bob Wilsondecc03e2012-11-23 06:14:39 +00004224const char *Clang::getBaseInputStem(const ArgList &Args,
4225 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004226 const char *Str = getBaseInputName(Args, Inputs);
4227
Chris Lattner906bb902011-01-16 08:14:11 +00004228 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004229 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004230
4231 return Str;
4232}
4233
Bob Wilsondecc03e2012-11-23 06:14:39 +00004234const char *Clang::getDependencyFileName(const ArgList &Args,
4235 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004236 // FIXME: Think about this more.
4237 std::string Res;
4238
4239 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004240 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004241 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004242 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004243 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004244 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004245 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004246}
4247
Daniel Dunbarbe220842009-03-20 16:06:39 +00004248void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004249 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004250 const InputInfoList &Inputs,
4251 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004252 const char *LinkingOutput) const {
4253 ArgStringList CmdArgs;
4254
4255 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4256 const InputInfo &Input = Inputs[0];
4257
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004258 // Determine the original source input.
4259 const Action *SourceAction = &JA;
4260 while (SourceAction->getKind() != Action::InputClass) {
4261 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4262 SourceAction = SourceAction->getInputs()[0];
4263 }
4264
4265 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004266 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004267 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004268 if (Args.hasArg(options::OPT_gstabs))
4269 CmdArgs.push_back("--gstabs");
4270 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004271 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004272 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004273
Daniel Dunbarbe220842009-03-20 16:06:39 +00004274 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004275 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004276
Daniel Dunbar6d484762010-07-22 01:47:22 +00004277 // Use -force_cpusubtype_ALL on x86 by default.
4278 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4279 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004280 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4281 CmdArgs.push_back("-force_cpusubtype_ALL");
4282
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004283 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004284 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004285 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004286 (!getDarwinToolChain().isTargetIPhoneOS() ||
4287 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4288 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004289 CmdArgs.push_back("-static");
4290
Daniel Dunbarbe220842009-03-20 16:06:39 +00004291 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4292 options::OPT_Xassembler);
4293
4294 assert(Output.isFilename() && "Unexpected lipo output.");
4295 CmdArgs.push_back("-o");
4296 CmdArgs.push_back(Output.getFilename());
4297
Daniel Dunbarb440f562010-08-02 02:38:21 +00004298 assert(Input.isFilename() && "Invalid input.");
4299 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004300
4301 // asm_final spec is empty.
4302
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004303 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004304 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004305 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004306}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004307
David Blaikie68e081d2011-12-20 02:48:34 +00004308void darwin::DarwinTool::anchor() {}
4309
Daniel Dunbare9ded432009-09-09 18:36:20 +00004310void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4311 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004312 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004313
Daniel Dunbarc1964212009-03-26 16:23:12 +00004314 // Derived from darwin_arch spec.
4315 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004316 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004317
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004318 // FIXME: Is this needed anymore?
4319 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004320 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004321}
4322
Bill Wendling3b2000f2012-10-02 18:02:50 +00004323bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4324 // We only need to generate a temp path for LTO if we aren't compiling object
4325 // files. When compiling source files, we run 'dsymutil' after linking. We
4326 // don't run 'dsymutil' when compiling object files.
4327 for (InputInfoList::const_iterator
4328 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4329 if (it->getType() != types::TY_Object)
4330 return true;
4331
4332 return false;
4333}
4334
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004335void darwin::Link::AddLinkArgs(Compilation &C,
4336 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004337 ArgStringList &CmdArgs,
4338 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004339 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004340 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004341
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004342 unsigned Version[3] = { 0, 0, 0 };
4343 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4344 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004345 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004346 Version[1], Version[2], HadExtra) ||
4347 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004348 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004349 << A->getAsString(Args);
4350 }
4351
4352 // Newer linkers support -demangle, pass it if supported and not disabled by
4353 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004354 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004355 // Don't pass -demangle to ld_classic.
4356 //
4357 // FIXME: This is a temporary workaround, ld should be handling this.
4358 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4359 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004360 if (getToolChain().getArch() == llvm::Triple::x86) {
4361 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4362 options::OPT_Wl_COMMA),
4363 ie = Args.filtered_end(); it != ie; ++it) {
4364 const Arg *A = *it;
4365 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004366 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004367 UsesLdClassic = true;
4368 }
4369 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004370 if (!UsesLdClassic)
4371 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004372 }
4373
Bill Wendling313b6bf2012-11-16 23:03:00 +00004374 // If we are using LTO, then automatically create a temporary file path for
4375 // the linker to use, so that it's lifetime will extend past a possible
4376 // dsymutil step.
4377 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4378 const char *TmpPath = C.getArgs().MakeArgString(
4379 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4380 C.addTempFile(TmpPath);
4381 CmdArgs.push_back("-object_path_lto");
4382 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004383 }
4384
Daniel Dunbarc1964212009-03-26 16:23:12 +00004385 // Derived from the "link" spec.
4386 Args.AddAllArgs(CmdArgs, options::OPT_static);
4387 if (!Args.hasArg(options::OPT_static))
4388 CmdArgs.push_back("-dynamic");
4389 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4390 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4391 // here. How do we wish to handle such things?
4392 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004393
Daniel Dunbarc1964212009-03-26 16:23:12 +00004394 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004395 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004396 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004397 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004398
4399 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4400 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4401 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4402
4403 Arg *A;
4404 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4405 (A = Args.getLastArg(options::OPT_current__version)) ||
4406 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004407 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004408 << A->getAsString(Args) << "-dynamiclib";
4409
4410 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4411 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4412 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4413 } else {
4414 CmdArgs.push_back("-dylib");
4415
4416 Arg *A;
4417 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4418 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4419 (A = Args.getLastArg(options::OPT_client__name)) ||
4420 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4421 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4422 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004423 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004424 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004425
Daniel Dunbarc1964212009-03-26 16:23:12 +00004426 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4427 "-dylib_compatibility_version");
4428 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4429 "-dylib_current_version");
4430
Daniel Dunbara48823f2010-01-22 02:04:52 +00004431 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004432
4433 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4434 "-dylib_install_name");
4435 }
4436
4437 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4438 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4439 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004440 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004441 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004442 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4443 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4444 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4445 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4446 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4447 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004448 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004449 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4450 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4451 Args.AddAllArgs(CmdArgs, options::OPT_init);
4452
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004453 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004454 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004455
4456 // If we had an explicit -mios-simulator-version-min argument, honor that,
4457 // otherwise use the traditional deployment targets. We can't just check the
4458 // is-sim attribute because existing code follows this path, and the linker
4459 // may not handle the argument.
4460 //
4461 // FIXME: We may be able to remove this, once we can verify no one depends on
4462 // it.
4463 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4464 CmdArgs.push_back("-ios_simulator_version_min");
4465 else if (DarwinTC.isTargetIPhoneOS())
4466 CmdArgs.push_back("-iphoneos_version_min");
4467 else
4468 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004469 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004470
Daniel Dunbarc1964212009-03-26 16:23:12 +00004471 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4472 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4473 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4474 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4475 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004476
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004477 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4478 options::OPT_fno_pie,
4479 options::OPT_fno_PIE)) {
4480 if (A->getOption().matches(options::OPT_fpie) ||
4481 A->getOption().matches(options::OPT_fPIE))
4482 CmdArgs.push_back("-pie");
4483 else
4484 CmdArgs.push_back("-no_pie");
4485 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004486
4487 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4488 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4489 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4490 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4491 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4492 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4493 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4494 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4495 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4496 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4497 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4498 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4499 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4500 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4501 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4502 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004503
Daniel Dunbar84384642011-05-02 21:03:47 +00004504 // Give --sysroot= preference, over the Apple specific behavior to also use
4505 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004506 StringRef sysroot = C.getSysRoot();
4507 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004508 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004509 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004510 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4511 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004512 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004513 }
4514
Daniel Dunbarc1964212009-03-26 16:23:12 +00004515 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4516 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4517 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4518 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4519 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004520 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004521 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4522 Args.AddAllArgs(CmdArgs, options::OPT_y);
4523 Args.AddLastArg(CmdArgs, options::OPT_w);
4524 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4525 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4526 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4527 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4528 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4529 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4530 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4531 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4532 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4533 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4534 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4535 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4536}
4537
4538void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004539 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004540 const InputInfoList &Inputs,
4541 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004542 const char *LinkingOutput) const {
4543 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004544
Daniel Dunbarc1964212009-03-26 16:23:12 +00004545 // The logic here is derived from gcc's behavior; most of which
4546 // comes from specs (starting with link_command). Consult gcc for
4547 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004548 ArgStringList CmdArgs;
4549
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004550 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4551 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4552 options::OPT_ccc_arcmt_migrate)) {
4553 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4554 (*I)->claim();
4555 const char *Exec =
4556 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4557 CmdArgs.push_back(Output.getFilename());
4558 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4559 return;
4560 }
4561
Daniel Dunbarc1964212009-03-26 16:23:12 +00004562 // I'm not sure why this particular decomposition exists in gcc, but
4563 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004564 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004565
Daniel Dunbarc1964212009-03-26 16:23:12 +00004566 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4567 Args.AddAllArgs(CmdArgs, options::OPT_s);
4568 Args.AddAllArgs(CmdArgs, options::OPT_t);
4569 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4570 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004571 Args.AddLastArg(CmdArgs, options::OPT_e);
4572 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4573 Args.AddAllArgs(CmdArgs, options::OPT_r);
4574
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004575 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4576 // members of static archive libraries which implement Objective-C classes or
4577 // categories.
4578 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4579 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004580
Bill Wendling58979742012-12-10 21:48:41 +00004581 if (Args.hasArg(options::OPT_rdynamic))
4582 CmdArgs.push_back("-export_dynamic");
4583
Daniel Dunbarc1964212009-03-26 16:23:12 +00004584 CmdArgs.push_back("-o");
4585 CmdArgs.push_back(Output.getFilename());
4586
Chad Rosier06fd3c62012-05-16 23:45:12 +00004587 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004588 !Args.hasArg(options::OPT_nostartfiles)) {
4589 // Derived from startfile spec.
4590 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004591 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004592 if (getDarwinToolChain().isTargetIOSSimulator()) {
4593 // The simulator doesn't have a versioned crt1 file.
4594 CmdArgs.push_back("-ldylib1.o");
4595 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004596 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4597 CmdArgs.push_back("-ldylib1.o");
4598 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004599 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004600 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004601 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004602 CmdArgs.push_back("-ldylib1.10.5.o");
4603 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004604 } else {
4605 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004606 if (!Args.hasArg(options::OPT_static)) {
4607 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004608 if (getDarwinToolChain().isTargetIOSSimulator()) {
4609 // The simulator doesn't have a versioned crt1 file.
4610 CmdArgs.push_back("-lbundle1.o");
4611 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004612 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4613 CmdArgs.push_back("-lbundle1.o");
4614 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004615 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004616 CmdArgs.push_back("-lbundle1.o");
4617 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004618 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004619 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004620 if (Args.hasArg(options::OPT_pg) &&
4621 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004622 if (Args.hasArg(options::OPT_static) ||
4623 Args.hasArg(options::OPT_object) ||
4624 Args.hasArg(options::OPT_preload)) {
4625 CmdArgs.push_back("-lgcrt0.o");
4626 } else {
4627 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004628
Daniel Dunbarc1964212009-03-26 16:23:12 +00004629 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004630 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004631 // By default on OS X 10.8 and later, we don't link with a crt1.o
4632 // file and the linker knows to use _main as the entry point. But,
4633 // when compiling with -pg, we need to link with the gcrt1.o file,
4634 // so pass the -no_new_main option to tell the linker to use the
4635 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004636 if (getDarwinToolChain().isTargetMacOS() &&
4637 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4638 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004639 } else {
4640 if (Args.hasArg(options::OPT_static) ||
4641 Args.hasArg(options::OPT_object) ||
4642 Args.hasArg(options::OPT_preload)) {
4643 CmdArgs.push_back("-lcrt0.o");
4644 } else {
4645 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004646 if (getDarwinToolChain().isTargetIOSSimulator()) {
4647 // The simulator doesn't have a versioned crt1 file.
4648 CmdArgs.push_back("-lcrt1.o");
4649 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004650 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4651 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004652 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004653 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004654 } else {
4655 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4656 CmdArgs.push_back("-lcrt1.o");
4657 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4658 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004659 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004660 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004661
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004662 // darwin_crt2 spec is empty.
4663 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004664 }
4665 }
4666 }
4667 }
4668
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004669 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4670 Args.hasArg(options::OPT_shared_libgcc) &&
4671 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004672 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004673 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004674 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004675 }
4676 }
4677
4678 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004679
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004680 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004681 // If we're building a dynamic lib with -fsanitize=address,
4682 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004683 // of them as dynamic_lookup. Linking executables is handled in
4684 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004685 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004686 if (Args.hasArg(options::OPT_dynamiclib) ||
4687 Args.hasArg(options::OPT_bundle)) {
4688 CmdArgs.push_back("-undefined");
4689 CmdArgs.push_back("dynamic_lookup");
4690 }
4691 }
4692
Daniel Dunbarc1964212009-03-26 16:23:12 +00004693 if (Args.hasArg(options::OPT_fopenmp))
4694 // This is more complicated in gcc...
4695 CmdArgs.push_back("-lgomp");
4696
Douglas Gregor9295df02012-05-15 21:00:27 +00004697 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4698
Bob Wilson16d93952012-05-15 18:57:39 +00004699 if (isObjCRuntimeLinked(Args) &&
4700 !Args.hasArg(options::OPT_nostdlib) &&
4701 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004702 // Avoid linking compatibility stubs on i386 mac.
4703 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004704 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004705 // If we don't have ARC or subscripting runtime support, link in the
4706 // runtime stubs. We have to do this *before* adding any of the normal
4707 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004708 ObjCRuntime runtime =
4709 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004710 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004711 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004712 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004713 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004714 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004715 CmdArgs.push_back("-framework");
4716 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004717 // Link libobj.
4718 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004719 }
John McCall31168b02011-06-15 23:02:42 +00004720
Daniel Dunbarc1964212009-03-26 16:23:12 +00004721 if (LinkingOutput) {
4722 CmdArgs.push_back("-arch_multiple");
4723 CmdArgs.push_back("-final_output");
4724 CmdArgs.push_back(LinkingOutput);
4725 }
4726
Daniel Dunbarc1964212009-03-26 16:23:12 +00004727 if (Args.hasArg(options::OPT_fnested_functions))
4728 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004729
Daniel Dunbarc1964212009-03-26 16:23:12 +00004730 if (!Args.hasArg(options::OPT_nostdlib) &&
4731 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004732 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004733 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004734
Daniel Dunbarc1964212009-03-26 16:23:12 +00004735 // link_ssp spec is empty.
4736
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004737 // Let the tool chain choose which runtime library to link.
4738 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004739 }
4740
Chad Rosier06fd3c62012-05-16 23:45:12 +00004741 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004742 !Args.hasArg(options::OPT_nostartfiles)) {
4743 // endfile_spec is empty.
4744 }
4745
4746 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4747 Args.AddAllArgs(CmdArgs, options::OPT_F);
4748
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004749 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004750 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004751 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004752}
4753
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004754void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004755 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004756 const InputInfoList &Inputs,
4757 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004758 const char *LinkingOutput) const {
4759 ArgStringList CmdArgs;
4760
4761 CmdArgs.push_back("-create");
4762 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004763
4764 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004765 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004766
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004767 for (InputInfoList::const_iterator
4768 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4769 const InputInfo &II = *it;
4770 assert(II.isFilename() && "Unexpected lipo input.");
4771 CmdArgs.push_back(II.getFilename());
4772 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004773 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004774 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004775 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004776}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004777
Daniel Dunbar88299622010-06-04 18:28:36 +00004778void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004779 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004780 const InputInfoList &Inputs,
4781 const ArgList &Args,
4782 const char *LinkingOutput) const {
4783 ArgStringList CmdArgs;
4784
Daniel Dunbareb86b042011-05-09 17:23:16 +00004785 CmdArgs.push_back("-o");
4786 CmdArgs.push_back(Output.getFilename());
4787
Daniel Dunbar88299622010-06-04 18:28:36 +00004788 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4789 const InputInfo &Input = Inputs[0];
4790 assert(Input.isFilename() && "Unexpected dsymutil input.");
4791 CmdArgs.push_back(Input.getFilename());
4792
Daniel Dunbar88299622010-06-04 18:28:36 +00004793 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004794 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004795 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004796}
4797
Eric Christopher551ef452011-08-23 17:56:55 +00004798void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004799 const InputInfo &Output,
4800 const InputInfoList &Inputs,
4801 const ArgList &Args,
4802 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004803 ArgStringList CmdArgs;
4804 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004805 CmdArgs.push_back("--debug-info");
4806 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004807 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004808
4809 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4810 const InputInfo &Input = Inputs[0];
4811 assert(Input.isFilename() && "Unexpected verify input");
4812
4813 // Grabbing the output of the earlier dsymutil run.
4814 CmdArgs.push_back(Input.getFilename());
4815
4816 const char *Exec =
4817 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4818 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4819}
4820
David Chisnallf571cde2012-02-15 13:39:01 +00004821void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4822 const InputInfo &Output,
4823 const InputInfoList &Inputs,
4824 const ArgList &Args,
4825 const char *LinkingOutput) const {
4826 ArgStringList CmdArgs;
4827
4828 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4829 options::OPT_Xassembler);
4830
4831 CmdArgs.push_back("-o");
4832 CmdArgs.push_back(Output.getFilename());
4833
4834 for (InputInfoList::const_iterator
4835 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4836 const InputInfo &II = *it;
4837 CmdArgs.push_back(II.getFilename());
4838 }
4839
4840 const char *Exec =
4841 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4842 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4843}
4844
4845
4846void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4847 const InputInfo &Output,
4848 const InputInfoList &Inputs,
4849 const ArgList &Args,
4850 const char *LinkingOutput) const {
4851 // FIXME: Find a real GCC, don't hard-code versions here
4852 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4853 const llvm::Triple &T = getToolChain().getTriple();
4854 std::string LibPath = "/usr/lib/";
4855 llvm::Triple::ArchType Arch = T.getArch();
4856 switch (Arch) {
4857 case llvm::Triple::x86:
4858 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4859 T.getOSName()).str() + "/4.5.2/";
4860 break;
4861 case llvm::Triple::x86_64:
4862 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4863 T.getOSName()).str();
4864 GCCLibPath += "/4.5.2/amd64/";
4865 LibPath += "amd64/";
4866 break;
4867 default:
4868 assert(0 && "Unsupported architecture");
4869 }
4870
4871 ArgStringList CmdArgs;
4872
David Chisnall272a0712012-02-29 15:06:12 +00004873 // Demangle C++ names in errors
4874 CmdArgs.push_back("-C");
4875
David Chisnallf571cde2012-02-15 13:39:01 +00004876 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4877 (!Args.hasArg(options::OPT_shared))) {
4878 CmdArgs.push_back("-e");
4879 CmdArgs.push_back("_start");
4880 }
4881
4882 if (Args.hasArg(options::OPT_static)) {
4883 CmdArgs.push_back("-Bstatic");
4884 CmdArgs.push_back("-dn");
4885 } else {
4886 CmdArgs.push_back("-Bdynamic");
4887 if (Args.hasArg(options::OPT_shared)) {
4888 CmdArgs.push_back("-shared");
4889 } else {
4890 CmdArgs.push_back("--dynamic-linker");
4891 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4892 }
4893 }
4894
4895 if (Output.isFilename()) {
4896 CmdArgs.push_back("-o");
4897 CmdArgs.push_back(Output.getFilename());
4898 } else {
4899 assert(Output.isNothing() && "Invalid output.");
4900 }
4901
4902 if (!Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nostartfiles)) {
4904 if (!Args.hasArg(options::OPT_shared)) {
4905 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4906 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004907 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004908 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4909 } else {
4910 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004911 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4912 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004913 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004914 if (getToolChain().getDriver().CCCIsCXX)
4915 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004916 }
4917
4918 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4919
4920 Args.AddAllArgs(CmdArgs, options::OPT_L);
4921 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4922 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004923 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004924
4925 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4926
4927 if (!Args.hasArg(options::OPT_nostdlib) &&
4928 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004929 if (getToolChain().getDriver().CCCIsCXX)
4930 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004931 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004932 if (!Args.hasArg(options::OPT_shared)) {
4933 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004934 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004935 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004936 }
David Chisnallf571cde2012-02-15 13:39:01 +00004937 }
4938
4939 if (!Args.hasArg(options::OPT_nostdlib) &&
4940 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004941 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004942 }
David Chisnall96de9932012-02-16 16:00:47 +00004943 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004944
4945 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4946
4947 const char *Exec =
4948 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4949 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4950}
4951
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004952void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004953 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004954 const InputInfoList &Inputs,
4955 const ArgList &Args,
4956 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004957 ArgStringList CmdArgs;
4958
4959 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4960 options::OPT_Xassembler);
4961
4962 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004963 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004964
4965 for (InputInfoList::const_iterator
4966 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4967 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004968 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004969 }
4970
4971 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004972 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004973 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004974}
4975
4976void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004977 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004978 const InputInfoList &Inputs,
4979 const ArgList &Args,
4980 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004981 ArgStringList CmdArgs;
4982
4983 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004984 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004985 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004986 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004987 }
4988
4989 if (Args.hasArg(options::OPT_static)) {
4990 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004991 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004992 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004993// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004994 CmdArgs.push_back("-Bdynamic");
4995 if (Args.hasArg(options::OPT_shared)) {
4996 CmdArgs.push_back("-shared");
4997 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004998 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004999 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5000 }
5001 }
5002
Daniel Dunbarb440f562010-08-02 02:38:21 +00005003 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005004 CmdArgs.push_back("-o");
5005 CmdArgs.push_back(Output.getFilename());
5006 } else {
5007 assert(Output.isNothing() && "Invalid output.");
5008 }
5009
5010 if (!Args.hasArg(options::OPT_nostdlib) &&
5011 !Args.hasArg(options::OPT_nostartfiles)) {
5012 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005013 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005014 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005015 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005016 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005017 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005018 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005019 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005020 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005021 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005022 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005023 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005024 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005025 }
5026
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005027 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5028 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005029 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005030
5031 Args.AddAllArgs(CmdArgs, options::OPT_L);
5032 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5033 Args.AddAllArgs(CmdArgs, options::OPT_e);
5034
Daniel Dunbar54423b22010-09-17 00:24:54 +00005035 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005036
5037 if (!Args.hasArg(options::OPT_nostdlib) &&
5038 !Args.hasArg(options::OPT_nodefaultlibs)) {
5039 // FIXME: For some reason GCC passes -lgcc before adding
5040 // the default system libraries. Just mimic this for now.
5041 CmdArgs.push_back("-lgcc");
5042
5043 if (Args.hasArg(options::OPT_pthread))
5044 CmdArgs.push_back("-pthread");
5045 if (!Args.hasArg(options::OPT_shared))
5046 CmdArgs.push_back("-lc");
5047 CmdArgs.push_back("-lgcc");
5048 }
5049
5050 if (!Args.hasArg(options::OPT_nostdlib) &&
5051 !Args.hasArg(options::OPT_nostartfiles)) {
5052 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005053 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005054 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005055 }
5056
Bill Wendling08760582011-06-27 19:15:03 +00005057 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005058
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005059 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005060 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005061 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005062}
5063
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005064void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005065 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005066 const InputInfoList &Inputs,
5067 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005068 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005069 ArgStringList CmdArgs;
5070
5071 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5072 options::OPT_Xassembler);
5073
5074 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005075 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005076
5077 for (InputInfoList::const_iterator
5078 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5079 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005080 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005081 }
5082
5083 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005084 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005085 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005086}
5087
5088void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005089 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005090 const InputInfoList &Inputs,
5091 const ArgList &Args,
5092 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005093 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005094 ArgStringList CmdArgs;
5095
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005096 // Silence warning for "clang -g foo.o -o foo"
5097 Args.ClaimAllArgs(options::OPT_g_Group);
5098 // and "clang -emit-llvm foo.o -o foo"
5099 Args.ClaimAllArgs(options::OPT_emit_llvm);
5100 // and for "clang -w foo.o -o foo". Other warning options are already
5101 // handled somewhere else.
5102 Args.ClaimAllArgs(options::OPT_w);
5103
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005104 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005105 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005106 CmdArgs.push_back("-e");
5107 CmdArgs.push_back("__start");
5108 }
5109
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005110 if (Args.hasArg(options::OPT_static)) {
5111 CmdArgs.push_back("-Bstatic");
5112 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005113 if (Args.hasArg(options::OPT_rdynamic))
5114 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005115 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005116 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005117 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005118 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005119 } else {
5120 CmdArgs.push_back("-dynamic-linker");
5121 CmdArgs.push_back("/usr/libexec/ld.so");
5122 }
5123 }
5124
Daniel Dunbarb440f562010-08-02 02:38:21 +00005125 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005126 CmdArgs.push_back("-o");
5127 CmdArgs.push_back(Output.getFilename());
5128 } else {
5129 assert(Output.isNothing() && "Invalid output.");
5130 }
5131
5132 if (!Args.hasArg(options::OPT_nostdlib) &&
5133 !Args.hasArg(options::OPT_nostartfiles)) {
5134 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005135 if (Args.hasArg(options::OPT_pg))
5136 CmdArgs.push_back(Args.MakeArgString(
5137 getToolChain().GetFilePath("gcrt0.o")));
5138 else
5139 CmdArgs.push_back(Args.MakeArgString(
5140 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005141 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005142 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005143 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005144 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005145 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005146 }
5147 }
5148
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005149 std::string Triple = getToolChain().getTripleString();
5150 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005151 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005152 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005153 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005154
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005155 Args.AddAllArgs(CmdArgs, options::OPT_L);
5156 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5157 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005158 Args.AddAllArgs(CmdArgs, options::OPT_s);
5159 Args.AddAllArgs(CmdArgs, options::OPT_t);
5160 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5161 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005162
Daniel Dunbar54423b22010-09-17 00:24:54 +00005163 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005164
5165 if (!Args.hasArg(options::OPT_nostdlib) &&
5166 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005167 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005168 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005169 if (Args.hasArg(options::OPT_pg))
5170 CmdArgs.push_back("-lm_p");
5171 else
5172 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005173 }
5174
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005175 // FIXME: For some reason GCC passes -lgcc before adding
5176 // the default system libraries. Just mimic this for now.
5177 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005178
Eric Christopher17674ec2012-09-13 06:32:34 +00005179 if (Args.hasArg(options::OPT_pthread)) {
5180 if (!Args.hasArg(options::OPT_shared) &&
5181 Args.hasArg(options::OPT_pg))
5182 CmdArgs.push_back("-lpthread_p");
5183 else
5184 CmdArgs.push_back("-lpthread");
5185 }
5186
Chandler Carruth45661652011-12-17 22:32:42 +00005187 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005188 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005189 CmdArgs.push_back("-lc_p");
5190 else
5191 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005192 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005193
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005194 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005195 }
5196
5197 if (!Args.hasArg(options::OPT_nostdlib) &&
5198 !Args.hasArg(options::OPT_nostartfiles)) {
5199 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005200 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005201 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005202 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005203 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005204 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005205 }
5206
5207 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005208 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005209 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005210}
Ed Schoutene33194b2009-04-02 19:13:12 +00005211
Eli Friedman9fa28852012-08-08 23:57:20 +00005212void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5213 const InputInfo &Output,
5214 const InputInfoList &Inputs,
5215 const ArgList &Args,
5216 const char *LinkingOutput) const {
5217 ArgStringList CmdArgs;
5218
5219 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5220 options::OPT_Xassembler);
5221
5222 CmdArgs.push_back("-o");
5223 CmdArgs.push_back(Output.getFilename());
5224
5225 for (InputInfoList::const_iterator
5226 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5227 const InputInfo &II = *it;
5228 CmdArgs.push_back(II.getFilename());
5229 }
5230
5231 const char *Exec =
5232 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5233 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5234}
5235
5236void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5237 const InputInfo &Output,
5238 const InputInfoList &Inputs,
5239 const ArgList &Args,
5240 const char *LinkingOutput) const {
5241 const Driver &D = getToolChain().getDriver();
5242 ArgStringList CmdArgs;
5243
5244 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5245 (!Args.hasArg(options::OPT_shared))) {
5246 CmdArgs.push_back("-e");
5247 CmdArgs.push_back("__start");
5248 }
5249
5250 if (Args.hasArg(options::OPT_static)) {
5251 CmdArgs.push_back("-Bstatic");
5252 } else {
5253 if (Args.hasArg(options::OPT_rdynamic))
5254 CmdArgs.push_back("-export-dynamic");
5255 CmdArgs.push_back("--eh-frame-hdr");
5256 CmdArgs.push_back("-Bdynamic");
5257 if (Args.hasArg(options::OPT_shared)) {
5258 CmdArgs.push_back("-shared");
5259 } else {
5260 CmdArgs.push_back("-dynamic-linker");
5261 CmdArgs.push_back("/usr/libexec/ld.so");
5262 }
5263 }
5264
5265 if (Output.isFilename()) {
5266 CmdArgs.push_back("-o");
5267 CmdArgs.push_back(Output.getFilename());
5268 } else {
5269 assert(Output.isNothing() && "Invalid output.");
5270 }
5271
5272 if (!Args.hasArg(options::OPT_nostdlib) &&
5273 !Args.hasArg(options::OPT_nostartfiles)) {
5274 if (!Args.hasArg(options::OPT_shared)) {
5275 if (Args.hasArg(options::OPT_pg))
5276 CmdArgs.push_back(Args.MakeArgString(
5277 getToolChain().GetFilePath("gcrt0.o")));
5278 else
5279 CmdArgs.push_back(Args.MakeArgString(
5280 getToolChain().GetFilePath("crt0.o")));
5281 CmdArgs.push_back(Args.MakeArgString(
5282 getToolChain().GetFilePath("crtbegin.o")));
5283 } else {
5284 CmdArgs.push_back(Args.MakeArgString(
5285 getToolChain().GetFilePath("crtbeginS.o")));
5286 }
5287 }
5288
5289 Args.AddAllArgs(CmdArgs, options::OPT_L);
5290 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5291 Args.AddAllArgs(CmdArgs, options::OPT_e);
5292
5293 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5294
5295 if (!Args.hasArg(options::OPT_nostdlib) &&
5296 !Args.hasArg(options::OPT_nodefaultlibs)) {
5297 if (D.CCCIsCXX) {
5298 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5299 if (Args.hasArg(options::OPT_pg))
5300 CmdArgs.push_back("-lm_p");
5301 else
5302 CmdArgs.push_back("-lm");
5303 }
5304
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005305 if (Args.hasArg(options::OPT_pthread)) {
5306 if (!Args.hasArg(options::OPT_shared) &&
5307 Args.hasArg(options::OPT_pg))
5308 CmdArgs.push_back("-lpthread_p");
5309 else
5310 CmdArgs.push_back("-lpthread");
5311 }
5312
Eli Friedman9fa28852012-08-08 23:57:20 +00005313 if (!Args.hasArg(options::OPT_shared)) {
5314 if (Args.hasArg(options::OPT_pg))
5315 CmdArgs.push_back("-lc_p");
5316 else
5317 CmdArgs.push_back("-lc");
5318 }
5319
5320 std::string myarch = "-lclang_rt.";
5321 const llvm::Triple &T = getToolChain().getTriple();
5322 llvm::Triple::ArchType Arch = T.getArch();
5323 switch (Arch) {
5324 case llvm::Triple::arm:
5325 myarch += ("arm");
5326 break;
5327 case llvm::Triple::x86:
5328 myarch += ("i386");
5329 break;
5330 case llvm::Triple::x86_64:
5331 myarch += ("amd64");
5332 break;
5333 default:
5334 assert(0 && "Unsupported architecture");
5335 }
5336 CmdArgs.push_back(Args.MakeArgString(myarch));
5337 }
5338
5339 if (!Args.hasArg(options::OPT_nostdlib) &&
5340 !Args.hasArg(options::OPT_nostartfiles)) {
5341 if (!Args.hasArg(options::OPT_shared))
5342 CmdArgs.push_back(Args.MakeArgString(
5343 getToolChain().GetFilePath("crtend.o")));
5344 else
5345 CmdArgs.push_back(Args.MakeArgString(
5346 getToolChain().GetFilePath("crtendS.o")));
5347 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005348
5349 const char *Exec =
5350 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5351 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005352}
5353
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005354void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005355 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005356 const InputInfoList &Inputs,
5357 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005358 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005359 ArgStringList CmdArgs;
5360
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005361 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5362 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005363 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005364 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005365 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005366 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005367 else if (getToolChain().getArch() == llvm::Triple::mips ||
5368 getToolChain().getArch() == llvm::Triple::mipsel ||
5369 getToolChain().getArch() == llvm::Triple::mips64 ||
5370 getToolChain().getArch() == llvm::Triple::mips64el) {
5371 StringRef CPUName;
5372 StringRef ABIName;
5373 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005374
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005375 CmdArgs.push_back("-march");
5376 CmdArgs.push_back(CPUName.data());
5377
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005378 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005379 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005380
5381 if (getToolChain().getArch() == llvm::Triple::mips ||
5382 getToolChain().getArch() == llvm::Triple::mips64)
5383 CmdArgs.push_back("-EB");
5384 else
5385 CmdArgs.push_back("-EL");
5386
5387 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5388 options::OPT_fpic, options::OPT_fno_pic,
5389 options::OPT_fPIE, options::OPT_fno_PIE,
5390 options::OPT_fpie, options::OPT_fno_pie);
5391 if (LastPICArg &&
5392 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5393 LastPICArg->getOption().matches(options::OPT_fpic) ||
5394 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5395 LastPICArg->getOption().matches(options::OPT_fpie))) {
5396 CmdArgs.push_back("-KPIC");
5397 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005398 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5399 getToolChain().getArch() == llvm::Triple::thumb) {
5400 CmdArgs.push_back("-mfpu=softvfp");
5401 switch(getToolChain().getTriple().getEnvironment()) {
5402 case llvm::Triple::GNUEABI:
5403 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005404 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005405 break;
5406
5407 default:
5408 CmdArgs.push_back("-matpcs");
5409 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005410 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005411
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005412 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5413 options::OPT_Xassembler);
5414
5415 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005416 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005417
5418 for (InputInfoList::const_iterator
5419 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5420 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005421 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005422 }
5423
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005424 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005425 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005426 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005427}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005428
5429void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005430 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005431 const InputInfoList &Inputs,
5432 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005433 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005434 const toolchains::FreeBSD& ToolChain =
5435 static_cast<const toolchains::FreeBSD&>(getToolChain());
5436 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005437 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005438
5439 // Silence warning for "clang -g foo.o -o foo"
5440 Args.ClaimAllArgs(options::OPT_g_Group);
5441 // and "clang -emit-llvm foo.o -o foo"
5442 Args.ClaimAllArgs(options::OPT_emit_llvm);
5443 // and for "clang -w foo.o -o foo". Other warning options are already
5444 // handled somewhere else.
5445 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005446
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005447 if (!D.SysRoot.empty())
5448 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5449
Roman Divackyafe2f232012-08-28 15:09:03 +00005450 if (Args.hasArg(options::OPT_pie))
5451 CmdArgs.push_back("-pie");
5452
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005453 if (Args.hasArg(options::OPT_static)) {
5454 CmdArgs.push_back("-Bstatic");
5455 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005456 if (Args.hasArg(options::OPT_rdynamic))
5457 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005458 CmdArgs.push_back("--eh-frame-hdr");
5459 if (Args.hasArg(options::OPT_shared)) {
5460 CmdArgs.push_back("-Bshareable");
5461 } else {
5462 CmdArgs.push_back("-dynamic-linker");
5463 CmdArgs.push_back("/libexec/ld-elf.so.1");
5464 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005465 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5466 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005467 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5468 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5469 CmdArgs.push_back("--hash-style=both");
5470 }
5471 }
5472 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005473 }
5474
5475 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5476 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005477 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005478 CmdArgs.push_back("-m");
5479 CmdArgs.push_back("elf_i386_fbsd");
5480 }
5481
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005482 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005483 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005484 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005485 }
5486
Daniel Dunbarb440f562010-08-02 02:38:21 +00005487 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005488 CmdArgs.push_back("-o");
5489 CmdArgs.push_back(Output.getFilename());
5490 } else {
5491 assert(Output.isNothing() && "Invalid output.");
5492 }
5493
5494 if (!Args.hasArg(options::OPT_nostdlib) &&
5495 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005496 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005497 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005498 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005499 crt1 = "gcrt1.o";
5500 else if (Args.hasArg(options::OPT_pie))
5501 crt1 = "Scrt1.o";
5502 else
5503 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005504 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005505 if (crt1)
5506 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5507
5508 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5509
5510 const char *crtbegin = NULL;
5511 if (Args.hasArg(options::OPT_static))
5512 crtbegin = "crtbeginT.o";
5513 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5514 crtbegin = "crtbeginS.o";
5515 else
5516 crtbegin = "crtbegin.o";
5517
5518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005519 }
5520
5521 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005522 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005523 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5524 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005525 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005526 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5527 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005528 Args.AddAllArgs(CmdArgs, options::OPT_s);
5529 Args.AddAllArgs(CmdArgs, options::OPT_t);
5530 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5531 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005532
Roman Divackyafe2f232012-08-28 15:09:03 +00005533 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005534
5535 if (!Args.hasArg(options::OPT_nostdlib) &&
5536 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005537 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005538 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005539 if (Args.hasArg(options::OPT_pg))
5540 CmdArgs.push_back("-lm_p");
5541 else
5542 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005543 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005544 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5545 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005546 if (Args.hasArg(options::OPT_pg))
5547 CmdArgs.push_back("-lgcc_p");
5548 else
5549 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005550 if (Args.hasArg(options::OPT_static)) {
5551 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005552 } else if (Args.hasArg(options::OPT_pg)) {
5553 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005554 } else {
5555 CmdArgs.push_back("--as-needed");
5556 CmdArgs.push_back("-lgcc_s");
5557 CmdArgs.push_back("--no-as-needed");
5558 }
5559
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005560 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005561 if (Args.hasArg(options::OPT_pg))
5562 CmdArgs.push_back("-lpthread_p");
5563 else
5564 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005565 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005566
Roman Divacky66f22762011-02-10 16:59:40 +00005567 if (Args.hasArg(options::OPT_pg)) {
5568 if (Args.hasArg(options::OPT_shared))
5569 CmdArgs.push_back("-lc");
5570 else
5571 CmdArgs.push_back("-lc_p");
5572 CmdArgs.push_back("-lgcc_p");
5573 } else {
5574 CmdArgs.push_back("-lc");
5575 CmdArgs.push_back("-lgcc");
5576 }
5577
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005578 if (Args.hasArg(options::OPT_static)) {
5579 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005580 } else if (Args.hasArg(options::OPT_pg)) {
5581 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005582 } else {
5583 CmdArgs.push_back("--as-needed");
5584 CmdArgs.push_back("-lgcc_s");
5585 CmdArgs.push_back("--no-as-needed");
5586 }
5587 }
5588
5589 if (!Args.hasArg(options::OPT_nostdlib) &&
5590 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005591 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005592 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005593 else
5594 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005595 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005596 }
5597
Roman Divackyafe2f232012-08-28 15:09:03 +00005598 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005599
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005600 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005601 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005602 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005603}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005604
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005605void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5606 const InputInfo &Output,
5607 const InputInfoList &Inputs,
5608 const ArgList &Args,
5609 const char *LinkingOutput) const {
5610 ArgStringList CmdArgs;
5611
5612 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5613 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005614 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005615 CmdArgs.push_back("--32");
5616
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005617 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005618 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005619 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005620 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005621 CmdArgs.push_back("-EL");
5622
5623 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5624 options::OPT_Xassembler);
5625
5626 CmdArgs.push_back("-o");
5627 CmdArgs.push_back(Output.getFilename());
5628
5629 for (InputInfoList::const_iterator
5630 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5631 const InputInfo &II = *it;
5632 CmdArgs.push_back(II.getFilename());
5633 }
5634
David Chisnallddbd68f2011-09-27 22:03:18 +00005635 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005636 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5637}
5638
5639void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5640 const InputInfo &Output,
5641 const InputInfoList &Inputs,
5642 const ArgList &Args,
5643 const char *LinkingOutput) const {
5644 const Driver &D = getToolChain().getDriver();
5645 ArgStringList CmdArgs;
5646
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005647 if (!D.SysRoot.empty())
5648 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5649
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005650 if (Args.hasArg(options::OPT_static)) {
5651 CmdArgs.push_back("-Bstatic");
5652 } else {
5653 if (Args.hasArg(options::OPT_rdynamic))
5654 CmdArgs.push_back("-export-dynamic");
5655 CmdArgs.push_back("--eh-frame-hdr");
5656 if (Args.hasArg(options::OPT_shared)) {
5657 CmdArgs.push_back("-Bshareable");
5658 } else {
5659 CmdArgs.push_back("-dynamic-linker");
5660 CmdArgs.push_back("/libexec/ld.elf_so");
5661 }
5662 }
5663
5664 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5665 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005666 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005667 CmdArgs.push_back("-m");
5668 CmdArgs.push_back("elf_i386");
5669 }
5670
5671 if (Output.isFilename()) {
5672 CmdArgs.push_back("-o");
5673 CmdArgs.push_back(Output.getFilename());
5674 } else {
5675 assert(Output.isNothing() && "Invalid output.");
5676 }
5677
5678 if (!Args.hasArg(options::OPT_nostdlib) &&
5679 !Args.hasArg(options::OPT_nostartfiles)) {
5680 if (!Args.hasArg(options::OPT_shared)) {
5681 CmdArgs.push_back(Args.MakeArgString(
5682 getToolChain().GetFilePath("crt0.o")));
5683 CmdArgs.push_back(Args.MakeArgString(
5684 getToolChain().GetFilePath("crti.o")));
5685 CmdArgs.push_back(Args.MakeArgString(
5686 getToolChain().GetFilePath("crtbegin.o")));
5687 } else {
5688 CmdArgs.push_back(Args.MakeArgString(
5689 getToolChain().GetFilePath("crti.o")));
5690 CmdArgs.push_back(Args.MakeArgString(
5691 getToolChain().GetFilePath("crtbeginS.o")));
5692 }
5693 }
5694
5695 Args.AddAllArgs(CmdArgs, options::OPT_L);
5696 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5697 Args.AddAllArgs(CmdArgs, options::OPT_e);
5698 Args.AddAllArgs(CmdArgs, options::OPT_s);
5699 Args.AddAllArgs(CmdArgs, options::OPT_t);
5700 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5701 Args.AddAllArgs(CmdArgs, options::OPT_r);
5702
5703 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5704
5705 if (!Args.hasArg(options::OPT_nostdlib) &&
5706 !Args.hasArg(options::OPT_nodefaultlibs)) {
5707 if (D.CCCIsCXX) {
5708 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5709 CmdArgs.push_back("-lm");
5710 }
5711 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5712 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005713 if (Args.hasArg(options::OPT_static)) {
5714 CmdArgs.push_back("-lgcc_eh");
5715 } else {
5716 CmdArgs.push_back("--as-needed");
5717 CmdArgs.push_back("-lgcc_s");
5718 CmdArgs.push_back("--no-as-needed");
5719 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005720 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005721
5722 if (Args.hasArg(options::OPT_pthread))
5723 CmdArgs.push_back("-lpthread");
5724 CmdArgs.push_back("-lc");
5725
5726 CmdArgs.push_back("-lgcc");
5727 if (Args.hasArg(options::OPT_static)) {
5728 CmdArgs.push_back("-lgcc_eh");
5729 } else {
5730 CmdArgs.push_back("--as-needed");
5731 CmdArgs.push_back("-lgcc_s");
5732 CmdArgs.push_back("--no-as-needed");
5733 }
5734 }
5735
5736 if (!Args.hasArg(options::OPT_nostdlib) &&
5737 !Args.hasArg(options::OPT_nostartfiles)) {
5738 if (!Args.hasArg(options::OPT_shared))
5739 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5740 "crtend.o")));
5741 else
5742 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5743 "crtendS.o")));
5744 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5745 "crtn.o")));
5746 }
5747
Bill Wendling08760582011-06-27 19:15:03 +00005748 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005749
David Chisnallddbd68f2011-09-27 22:03:18 +00005750 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005751 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5752}
5753
Thomas Schwinge4e555262013-03-28 19:04:25 +00005754void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5755 const InputInfo &Output,
5756 const InputInfoList &Inputs,
5757 const ArgList &Args,
5758 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005759 ArgStringList CmdArgs;
5760
5761 // Add --32/--64 to make sure we get the format we want.
5762 // This is incomplete
5763 if (getToolChain().getArch() == llvm::Triple::x86) {
5764 CmdArgs.push_back("--32");
5765 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5766 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005767 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5768 CmdArgs.push_back("-a32");
5769 CmdArgs.push_back("-mppc");
5770 CmdArgs.push_back("-many");
5771 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5772 CmdArgs.push_back("-a64");
5773 CmdArgs.push_back("-mppc64");
5774 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005775 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005776 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005777 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5778 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005779
5780 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5781 getToolChain().getTriple());
5782 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005783
5784 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5785 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5786 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005787 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5788 getToolChain().getArch() == llvm::Triple::mipsel ||
5789 getToolChain().getArch() == llvm::Triple::mips64 ||
5790 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005791 StringRef CPUName;
5792 StringRef ABIName;
5793 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005794
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005795 CmdArgs.push_back("-march");
5796 CmdArgs.push_back(CPUName.data());
5797
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005798 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005799 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005800
5801 if (getToolChain().getArch() == llvm::Triple::mips ||
5802 getToolChain().getArch() == llvm::Triple::mips64)
5803 CmdArgs.push_back("-EB");
5804 else
5805 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005806
5807 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5808 options::OPT_fpic, options::OPT_fno_pic,
5809 options::OPT_fPIE, options::OPT_fno_PIE,
5810 options::OPT_fpie, options::OPT_fno_pie);
5811 if (LastPICArg &&
5812 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5813 LastPICArg->getOption().matches(options::OPT_fpic) ||
5814 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5815 LastPICArg->getOption().matches(options::OPT_fpie))) {
5816 CmdArgs.push_back("-KPIC");
5817 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005818 }
5819
5820 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5821 options::OPT_Xassembler);
5822
5823 CmdArgs.push_back("-o");
5824 CmdArgs.push_back(Output.getFilename());
5825
5826 for (InputInfoList::const_iterator
5827 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5828 const InputInfo &II = *it;
5829 CmdArgs.push_back(II.getFilename());
5830 }
5831
5832 const char *Exec =
5833 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5834 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5835}
5836
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005837static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5838 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005839 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005840 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5841 Args.hasArg(options::OPT_static);
Rafael Espindolacc354322011-10-17 21:39:04 +00005842 if (!D.CCCIsCXX)
5843 CmdArgs.push_back("-lgcc");
5844
Logan Chien3d3373c2012-11-19 12:04:11 +00005845 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005846 if (D.CCCIsCXX)
5847 CmdArgs.push_back("-lgcc");
5848 } else {
5849 if (!D.CCCIsCXX)
5850 CmdArgs.push_back("--as-needed");
5851 CmdArgs.push_back("-lgcc_s");
5852 if (!D.CCCIsCXX)
5853 CmdArgs.push_back("--no-as-needed");
5854 }
5855
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005856 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005857 CmdArgs.push_back("-lgcc_eh");
5858 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5859 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005860
5861 // According to Android ABI, we have to link with libdl if we are
5862 // linking with non-static libgcc.
5863 //
5864 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5865 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5866 if (isAndroid && !StaticLibgcc)
5867 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005868}
5869
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005870static bool hasMipsN32ABIArg(const ArgList &Args) {
5871 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005872 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005873}
5874
Thomas Schwinge4e555262013-03-28 19:04:25 +00005875void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5876 const InputInfo &Output,
5877 const InputInfoList &Inputs,
5878 const ArgList &Args,
5879 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005880 const toolchains::Linux& ToolChain =
5881 static_cast<const toolchains::Linux&>(getToolChain());
5882 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005883 const bool isAndroid =
5884 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005885 SanitizerArgs Sanitize(getToolChain(), Args);
5886 const bool IsPIE =
5887 !Args.hasArg(options::OPT_shared) &&
5888 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005889
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005890 ArgStringList CmdArgs;
5891
Rafael Espindolad1002f62010-11-15 18:28:16 +00005892 // Silence warning for "clang -g foo.o -o foo"
5893 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005894 // and "clang -emit-llvm foo.o -o foo"
5895 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005896 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005897 // handled somewhere else.
5898 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005899
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005900 if (!D.SysRoot.empty())
5901 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005902
Peter Collingbourne54d770c2013-04-09 04:35:11 +00005903 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00005904 CmdArgs.push_back("-pie");
5905
Rafael Espindola1c76c592010-11-07 22:57:16 +00005906 if (Args.hasArg(options::OPT_rdynamic))
5907 CmdArgs.push_back("-export-dynamic");
5908
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005909 if (Args.hasArg(options::OPT_s))
5910 CmdArgs.push_back("-s");
5911
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005912 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5913 e = ToolChain.ExtraOpts.end();
5914 i != e; ++i)
5915 CmdArgs.push_back(i->c_str());
5916
5917 if (!Args.hasArg(options::OPT_static)) {
5918 CmdArgs.push_back("--eh-frame-hdr");
5919 }
5920
5921 CmdArgs.push_back("-m");
5922 if (ToolChain.getArch() == llvm::Triple::x86)
5923 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00005924 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5925 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005926 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005927 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005928 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005929 else if (ToolChain.getArch() == llvm::Triple::ppc)
5930 CmdArgs.push_back("elf32ppclinux");
5931 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5932 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005933 else if (ToolChain.getArch() == llvm::Triple::mips)
5934 CmdArgs.push_back("elf32btsmip");
5935 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5936 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005937 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5938 if (hasMipsN32ABIArg(Args))
5939 CmdArgs.push_back("elf32btsmipn32");
5940 else
5941 CmdArgs.push_back("elf64btsmip");
5942 }
5943 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5944 if (hasMipsN32ABIArg(Args))
5945 CmdArgs.push_back("elf32ltsmipn32");
5946 else
5947 CmdArgs.push_back("elf64ltsmip");
5948 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005949 else
5950 CmdArgs.push_back("elf_x86_64");
5951
5952 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005953 if (ToolChain.getArch() == llvm::Triple::arm
5954 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005955 CmdArgs.push_back("-Bstatic");
5956 else
5957 CmdArgs.push_back("-static");
5958 } else if (Args.hasArg(options::OPT_shared)) {
5959 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00005960 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005961 CmdArgs.push_back("-Bsymbolic");
5962 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005963 }
5964
5965 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005966 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005967 (!Args.hasArg(options::OPT_static) &&
5968 !Args.hasArg(options::OPT_shared))) {
5969 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005970 if (isAndroid)
5971 CmdArgs.push_back("/system/bin/linker");
5972 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005973 CmdArgs.push_back("/lib/ld-linux.so.2");
Tim Northover9bb857a2013-01-31 12:13:10 +00005974 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5975 CmdArgs.push_back("/lib/ld-linux-aarch64.so.1");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005976 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005977 ToolChain.getArch() == llvm::Triple::thumb) {
5978 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5979 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5980 else
5981 CmdArgs.push_back("/lib/ld-linux.so.3");
5982 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005983 else if (ToolChain.getArch() == llvm::Triple::mips ||
5984 ToolChain.getArch() == llvm::Triple::mipsel)
5985 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005986 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005987 ToolChain.getArch() == llvm::Triple::mips64el) {
5988 if (hasMipsN32ABIArg(Args))
5989 CmdArgs.push_back("/lib32/ld.so.1");
5990 else
5991 CmdArgs.push_back("/lib64/ld.so.1");
5992 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005993 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005994 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005995 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005996 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005997 else
5998 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5999 }
6000
6001 CmdArgs.push_back("-o");
6002 CmdArgs.push_back(Output.getFilename());
6003
Rafael Espindola81937ec2010-12-01 01:52:43 +00006004 if (!Args.hasArg(options::OPT_nostdlib) &&
6005 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006006 if (!isAndroid) {
6007 const char *crt1 = NULL;
6008 if (!Args.hasArg(options::OPT_shared)){
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006009 if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006010 crt1 = "Scrt1.o";
6011 else
6012 crt1 = "crt1.o";
6013 }
6014 if (crt1)
6015 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006016
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006017 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6018 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006019
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006020 const char *crtbegin;
6021 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006022 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006023 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006024 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006025 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006026 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006027 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006028 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006029 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006030
6031 // Add crtfastmath.o if available and fast math is enabled.
6032 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006033 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006034
6035 Args.AddAllArgs(CmdArgs, options::OPT_L);
6036
6037 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6038
Roman Divackyee8188a2011-03-01 17:53:14 +00006039 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6040 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006041 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006042
Rafael Espindola9446d762012-04-09 23:53:34 +00006043 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6044 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6045 // forward.
6046 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6047 CmdArgs.push_back("-plugin");
6048 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6049 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006050
6051 // Try to pass driver level flags relevant to LTO code generation down to
6052 // the plugin.
6053
6054 // Handle architecture-specific flags for selecting CPU variants.
6055 if (ToolChain.getArch() == llvm::Triple::x86 ||
6056 ToolChain.getArch() == llvm::Triple::x86_64)
6057 CmdArgs.push_back(
6058 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6059 getX86TargetCPU(Args, ToolChain.getTriple())));
6060 else if (ToolChain.getArch() == llvm::Triple::arm ||
6061 ToolChain.getArch() == llvm::Triple::thumb)
6062 CmdArgs.push_back(
6063 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6064 getARMTargetCPU(Args, ToolChain.getTriple())));
6065
6066 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6067 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00006068 }
6069
Chandler Carruth953fb082013-01-13 11:46:33 +00006070
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006071 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6072 CmdArgs.push_back("--no-demangle");
6073
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006074 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6075
Eric Christopher04997782012-11-29 18:51:05 +00006076 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006077 if (Sanitize.needsUbsanRt())
Richard Smithcff3cde2013-03-20 23:49:07 +00006078 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6079 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
6080 Sanitize.needsMsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006081 if (Sanitize.needsAsanRt())
6082 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6083 if (Sanitize.needsTsanRt())
6084 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006085 if (Sanitize.needsMsanRt())
6086 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006087
Chandler Carruth94a32012012-05-14 18:31:18 +00006088 if (D.CCCIsCXX &&
6089 !Args.hasArg(options::OPT_nostdlib) &&
6090 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006091 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6092 !Args.hasArg(options::OPT_static);
6093 if (OnlyLibstdcxxStatic)
6094 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006095 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006096 if (OnlyLibstdcxxStatic)
6097 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006098 CmdArgs.push_back("-lm");
6099 }
6100
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006101 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006102 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6103 if (Args.hasArg(options::OPT_static))
6104 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006105
Chandler Carruth01538002013-01-17 13:19:29 +00006106 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6107 if (OpenMP) {
6108 CmdArgs.push_back("-lgomp");
6109
6110 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6111 // librt. Most modern Linux platfroms require it, but some may not.
6112 CmdArgs.push_back("-lrt");
6113 }
6114
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006115 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006116
Chandler Carruth94a32012012-05-14 18:31:18 +00006117 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006118 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006119 CmdArgs.push_back("-lpthread");
6120
6121 CmdArgs.push_back("-lc");
6122
6123 if (Args.hasArg(options::OPT_static))
6124 CmdArgs.push_back("--end-group");
6125 else
6126 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6127 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006128
Rafael Espindola81937ec2010-12-01 01:52:43 +00006129 if (!Args.hasArg(options::OPT_nostartfiles)) {
6130 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006131 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006132 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006133 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006134 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006135 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006136 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006137
Rafael Espindola81937ec2010-12-01 01:52:43 +00006138 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006139 if (!isAndroid)
6140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006141 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006142 }
6143
Bill Wendling08760582011-06-27 19:15:03 +00006144 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006145
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006146 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6147}
Rafael Espindola92b00932010-08-10 00:25:48 +00006148
Chris Lattner3e2ee142010-07-07 16:01:42 +00006149void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006150 const InputInfo &Output,
6151 const InputInfoList &Inputs,
6152 const ArgList &Args,
6153 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006154 ArgStringList CmdArgs;
6155
6156 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6157 options::OPT_Xassembler);
6158
6159 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006160 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006161
6162 for (InputInfoList::const_iterator
6163 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6164 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006165 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006166 }
6167
6168 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006169 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006170 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006171}
6172
6173void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006174 const InputInfo &Output,
6175 const InputInfoList &Inputs,
6176 const ArgList &Args,
6177 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006178 const Driver &D = getToolChain().getDriver();
6179 ArgStringList CmdArgs;
6180
Daniel Dunbarb440f562010-08-02 02:38:21 +00006181 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006182 CmdArgs.push_back("-o");
6183 CmdArgs.push_back(Output.getFilename());
6184 } else {
6185 assert(Output.isNothing() && "Invalid output.");
6186 }
6187
6188 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006189 !Args.hasArg(options::OPT_nostartfiles)) {
6190 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6191 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6192 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6193 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6194 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006195
6196 Args.AddAllArgs(CmdArgs, options::OPT_L);
6197 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6198 Args.AddAllArgs(CmdArgs, options::OPT_e);
6199
Daniel Dunbar54423b22010-09-17 00:24:54 +00006200 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006201
Eli Friedman83de5132011-12-08 23:54:21 +00006202 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6203
Chris Lattner3e2ee142010-07-07 16:01:42 +00006204 if (!Args.hasArg(options::OPT_nostdlib) &&
6205 !Args.hasArg(options::OPT_nodefaultlibs)) {
6206 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006207 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006208 CmdArgs.push_back("-lm");
6209 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006210 }
6211
6212 if (!Args.hasArg(options::OPT_nostdlib) &&
6213 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006214 if (Args.hasArg(options::OPT_pthread))
6215 CmdArgs.push_back("-lpthread");
6216 CmdArgs.push_back("-lc");
6217 CmdArgs.push_back("-lCompilerRT-Generic");
6218 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6219 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006220 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006221 }
6222
Eli Friedman83de5132011-12-08 23:54:21 +00006223 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006224 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006225}
6226
Daniel Dunbarcc912342009-05-02 18:28:39 +00006227/// DragonFly Tools
6228
6229// For now, DragonFly Assemble does just about the same as for
6230// FreeBSD, but this may change soon.
6231void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006232 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006233 const InputInfoList &Inputs,
6234 const ArgList &Args,
6235 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006236 ArgStringList CmdArgs;
6237
6238 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6239 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006240 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006241 CmdArgs.push_back("--32");
6242
6243 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6244 options::OPT_Xassembler);
6245
6246 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006247 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006248
6249 for (InputInfoList::const_iterator
6250 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6251 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006252 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006253 }
6254
6255 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006256 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006257 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006258}
6259
6260void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006261 const InputInfo &Output,
6262 const InputInfoList &Inputs,
6263 const ArgList &Args,
6264 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006265 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006266 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006267 ArgStringList CmdArgs;
6268
John McCall65b8da02013-04-11 22:55:55 +00006269 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6270 UseGCC47 = false;
6271
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006272 if (!D.SysRoot.empty())
6273 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6274
John McCall65b8da02013-04-11 22:55:55 +00006275 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006276 if (Args.hasArg(options::OPT_static)) {
6277 CmdArgs.push_back("-Bstatic");
6278 } else {
John McCall65b8da02013-04-11 22:55:55 +00006279 if (Args.hasArg(options::OPT_rdynamic))
6280 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006281 if (Args.hasArg(options::OPT_shared))
6282 CmdArgs.push_back("-Bshareable");
6283 else {
6284 CmdArgs.push_back("-dynamic-linker");
6285 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6286 }
John McCall65b8da02013-04-11 22:55:55 +00006287 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006288 }
6289
6290 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6291 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006292 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006293 CmdArgs.push_back("-m");
6294 CmdArgs.push_back("elf_i386");
6295 }
6296
Daniel Dunbarb440f562010-08-02 02:38:21 +00006297 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006298 CmdArgs.push_back("-o");
6299 CmdArgs.push_back(Output.getFilename());
6300 } else {
6301 assert(Output.isNothing() && "Invalid output.");
6302 }
6303
6304 if (!Args.hasArg(options::OPT_nostdlib) &&
6305 !Args.hasArg(options::OPT_nostartfiles)) {
6306 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006307 if (Args.hasArg(options::OPT_pg))
6308 CmdArgs.push_back(Args.MakeArgString(
6309 getToolChain().GetFilePath("gcrt1.o")));
6310 else {
6311 if (Args.hasArg(options::OPT_pie))
6312 CmdArgs.push_back(Args.MakeArgString(
6313 getToolChain().GetFilePath("Scrt1.o")));
6314 else
6315 CmdArgs.push_back(Args.MakeArgString(
6316 getToolChain().GetFilePath("crt1.o")));
6317 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006318 }
John McCall65b8da02013-04-11 22:55:55 +00006319 CmdArgs.push_back(Args.MakeArgString(
6320 getToolChain().GetFilePath("crti.o")));
6321 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6322 CmdArgs.push_back(Args.MakeArgString(
6323 getToolChain().GetFilePath("crtbeginS.o")));
6324 else
6325 CmdArgs.push_back(Args.MakeArgString(
6326 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006327 }
6328
6329 Args.AddAllArgs(CmdArgs, options::OPT_L);
6330 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6331 Args.AddAllArgs(CmdArgs, options::OPT_e);
6332
Daniel Dunbar54423b22010-09-17 00:24:54 +00006333 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006334
6335 if (!Args.hasArg(options::OPT_nostdlib) &&
6336 !Args.hasArg(options::OPT_nodefaultlibs)) {
6337 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6338 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006339 if (UseGCC47)
6340 CmdArgs.push_back("-L/usr/lib/gcc47");
6341 else
6342 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006343
6344 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006345 if (UseGCC47) {
6346 CmdArgs.push_back("-rpath");
6347 CmdArgs.push_back("/usr/lib/gcc47");
6348 } else {
6349 CmdArgs.push_back("-rpath");
6350 CmdArgs.push_back("/usr/lib/gcc44");
6351 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006352 }
6353
Rafael Espindola38360b32010-07-20 12:59:03 +00006354 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006355 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006356 CmdArgs.push_back("-lm");
6357 }
6358
Daniel Dunbarcc912342009-05-02 18:28:39 +00006359 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006360 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006361
6362 if (!Args.hasArg(options::OPT_nolibc)) {
6363 CmdArgs.push_back("-lc");
6364 }
6365
John McCall65b8da02013-04-11 22:55:55 +00006366 if (UseGCC47) {
6367 if (Args.hasArg(options::OPT_static) ||
6368 Args.hasArg(options::OPT_static_libgcc)) {
6369 CmdArgs.push_back("-lgcc");
6370 CmdArgs.push_back("-lgcc_eh");
6371 } else {
6372 if (Args.hasArg(options::OPT_shared_libgcc)) {
6373 CmdArgs.push_back("-lgcc_pic");
6374 if (!Args.hasArg(options::OPT_shared))
6375 CmdArgs.push_back("-lgcc");
6376 } else {
6377 CmdArgs.push_back("-lgcc");
6378 CmdArgs.push_back("--as-needed");
6379 CmdArgs.push_back("-lgcc_pic");
6380 CmdArgs.push_back("--no-as-needed");
6381 }
6382 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006383 } else {
John McCall65b8da02013-04-11 22:55:55 +00006384 if (Args.hasArg(options::OPT_shared)) {
6385 CmdArgs.push_back("-lgcc_pic");
6386 } else {
6387 CmdArgs.push_back("-lgcc");
6388 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006389 }
6390 }
6391
6392 if (!Args.hasArg(options::OPT_nostdlib) &&
6393 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006394 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006395 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006396 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006397 else
6398 CmdArgs.push_back(Args.MakeArgString(
6399 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006400 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006401 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006402 }
6403
Bill Wendling08760582011-06-27 19:15:03 +00006404 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006405
Daniel Dunbarcc912342009-05-02 18:28:39 +00006406 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006407 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006408 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006409}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006410
6411void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6412 const InputInfo &Output,
6413 const InputInfoList &Inputs,
6414 const ArgList &Args,
6415 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006416 ArgStringList CmdArgs;
6417
6418 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006419 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6420 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006421 } else {
6422 assert(Output.isNothing() && "Invalid output.");
6423 }
6424
6425 if (!Args.hasArg(options::OPT_nostdlib) &&
6426 !Args.hasArg(options::OPT_nostartfiles)) {
6427 CmdArgs.push_back("-defaultlib:libcmt");
6428 }
6429
6430 CmdArgs.push_back("-nologo");
6431
Michael J. Spencere2f49362012-06-18 16:56:04 +00006432 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6433
6434 // Add filenames immediately.
6435 for (InputInfoList::const_iterator
6436 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6437 if (it->isFilename())
6438 CmdArgs.push_back(it->getFilename());
6439 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006440
6441 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006442 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006443 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6444}