blob: 8df0578e7d9e13259df7a992fdfbaa34924276bf [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
12#include "SanitizerArgs.h"
13#include "ToolChains.h"
14#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000022#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000023#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000024#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000025#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000026#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000027#include "llvm/Option/Arg.h"
28#include "llvm/Option/ArgList.h"
29#include "llvm/Option/Option.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000032#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000033#include "llvm/Support/Host.h"
Rafael Espindola04b3fc42013-06-25 14:29:51 +000034#include "llvm/Support/Program.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000035#include "llvm/Support/Process.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000037#include <sys/stat.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;
Reid Kleckner898229a2013-06-14 17:17:23 +000042using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000043
Daniel Dunbar64198ef2009-09-10 01:21:05 +000044/// CheckPreprocessingOptions - Perform some validation of preprocessing
45/// arguments that is shared with gcc.
46static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
47 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Hans Wennborg70850d82013-07-18 20:29:38 +000048 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP())
Chris Lattner0e62c1c2011-07-23 10:55:15 +000049 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000050 << A->getAsString(Args) << "-E";
51}
52
Daniel Dunbar4eadb602009-09-10 01:21:12 +000053/// CheckCodeGenerationOptions - Perform some validation of code generation
54/// arguments that is shared with gcc.
55static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
56 // In gcc, only ARM checks this, but it seems reasonable to check universally.
57 if (Args.hasArg(options::OPT_static))
58 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
59 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000060 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000061 << A->getAsString(Args) << "-static";
62}
63
Chris Lattnerbf2803f2010-03-29 17:55:58 +000064// Quote target names for inclusion in GNU Make dependency files.
65// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000066static void QuoteTarget(StringRef Target,
67 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000068 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
69 switch (Target[i]) {
70 case ' ':
71 case '\t':
72 // Escape the preceding backslashes
73 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
74 Res.push_back('\\');
75
76 // Escape the space/tab
77 Res.push_back('\\');
78 break;
79 case '$':
80 Res.push_back('$');
81 break;
82 case '#':
83 Res.push_back('\\');
84 break;
85 default:
86 break;
87 }
88
89 Res.push_back(Target[i]);
90 }
91}
92
Bill Wendlingc0938f32012-03-12 22:10:06 +000093static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000094 ArgStringList &CmdArgs,
95 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000096 const char *EnvVar) {
97 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +000098 bool CombinedArg = false;
99
Bill Wendling281ca292012-03-12 21:22:35 +0000100 if (!DirList)
101 return; // Nothing to do.
102
Chad Rosier616e8a52012-10-30 21:42:09 +0000103 StringRef Name(ArgName);
104 if (Name.equals("-I") || Name.equals("-L"))
105 CombinedArg = true;
106
Bill Wendling281ca292012-03-12 21:22:35 +0000107 StringRef Dirs(DirList);
108 if (Dirs.empty()) // Empty string should not add '.'.
109 return;
110
111 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000112 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000113 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000114 if (CombinedArg) {
115 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
116 } else {
117 CmdArgs.push_back(ArgName);
118 CmdArgs.push_back(".");
119 }
Bill Wendling281ca292012-03-12 21:22:35 +0000120 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000121 if (CombinedArg) {
122 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
123 } else {
124 CmdArgs.push_back(ArgName);
125 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
126 }
Bill Wendling281ca292012-03-12 21:22:35 +0000127 }
Nico Weber89355782012-03-19 15:00:03 +0000128 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000129 }
130
131 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000132 if (CombinedArg) {
133 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
134 } else {
135 CmdArgs.push_back(ArgName);
136 CmdArgs.push_back(".");
137 }
Bill Wendling281ca292012-03-12 21:22:35 +0000138 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000139 if (CombinedArg) {
140 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
141 } else {
142 CmdArgs.push_back(ArgName);
143 CmdArgs.push_back(Args.MakeArgString(Dirs));
144 }
Bill Wendling281ca292012-03-12 21:22:35 +0000145 }
146}
147
Daniel Dunbar54423b22010-09-17 00:24:54 +0000148static void AddLinkerInputs(const ToolChain &TC,
149 const InputInfoList &Inputs, const ArgList &Args,
150 ArgStringList &CmdArgs) {
151 const Driver &D = TC.getDriver();
152
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000153 // Add extra linker input arguments which are not treated as inputs
154 // (constructed via -Xarch_).
155 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
156
Daniel Dunbar54423b22010-09-17 00:24:54 +0000157 for (InputInfoList::const_iterator
158 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
159 const InputInfo &II = *it;
160
161 if (!TC.HasNativeLLVMSupport()) {
162 // Don't try to pass LLVM inputs unless we have native support.
163 if (II.getType() == types::TY_LLVM_IR ||
164 II.getType() == types::TY_LTO_IR ||
165 II.getType() == types::TY_LLVM_BC ||
166 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000167 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000168 << TC.getTripleString();
169 }
170
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000171 // Add filenames immediately.
172 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000173 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000174 continue;
175 }
176
177 // Otherwise, this is a linker input argument.
178 const Arg &A = II.getInputArg();
179
180 // Handle reserved library options.
181 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000182 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000183 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
184 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000185 } else
186 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000187 }
Bill Wendling281ca292012-03-12 21:22:35 +0000188
189 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000190 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000191}
192
John McCall31168b02011-06-15 23:02:42 +0000193/// \brief Determine whether Objective-C automated reference counting is
194/// enabled.
195static bool isObjCAutoRefCount(const ArgList &Args) {
196 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
197}
198
Ted Kremeneke65b0862012-03-06 20:05:56 +0000199/// \brief Determine whether we are linking the ObjC runtime.
200static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000201 if (isObjCAutoRefCount(Args)) {
202 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000203 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000204 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000205 return Args.hasArg(options::OPT_fobjc_link_runtime);
206}
207
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000208static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000209 ArgStringList &CmdArgs,
210 llvm::Triple Triple) {
211 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
212 Args.hasArg(options::OPT_fprofile_generate) ||
213 Args.hasArg(options::OPT_fcreate_profile) ||
214 Args.hasArg(options::OPT_coverage)))
215 return;
216
217 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
218 // the link line. We cannot do the same thing because unlike gcov there is a
219 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
220 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000221 std::string ProfileRT =
222 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000223
Bill Wendling08760582011-06-27 19:15:03 +0000224 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000225}
226
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000227static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000228 // Don't forward inputs from the original command line. They are added from
229 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000230 return O.getKind() != Option::InputClass &&
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000231 !O.hasFlag(options::NoForward) &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000232 !O.hasFlag(options::DriverOption) &&
233 !O.hasFlag(options::LinkerInput);
234}
235
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000236void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000237 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000238 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000239 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000240 ArgStringList &CmdArgs,
241 const InputInfo &Output,
242 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000243 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000244
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000245 CheckPreprocessingOptions(D, Args);
246
247 Args.AddLastArg(CmdArgs, options::OPT_C);
248 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000249
250 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000251 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000252 (A = Args.getLastArg(options::OPT_MD)) ||
253 (A = Args.getLastArg(options::OPT_MMD))) {
254 // Determine the output location.
255 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000256 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000257 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000258 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000259 } else if (Output.getType() == types::TY_Dependencies) {
260 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 } else if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 DepFile = "-";
264 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000265 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000266 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000267 }
268 CmdArgs.push_back("-dependency-file");
269 CmdArgs.push_back(DepFile);
270
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000271 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000272 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
273 const char *DepTarget;
274
275 // If user provided -o, that is the dependency target, except
276 // when we are only generating a dependency file.
277 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
278 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000279 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000280 } else {
281 // Otherwise derive from the base input.
282 //
283 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000285 llvm::sys::path::replace_extension(P, "o");
286 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 }
288
289 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000290 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 QuoteTarget(DepTarget, Quoted);
292 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 }
294
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000295 if (A->getOption().matches(options::OPT_M) ||
296 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 CmdArgs.push_back("-sys-header-deps");
298 }
299
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000300 if (Args.hasArg(options::OPT_MG)) {
301 if (!A || A->getOption().matches(options::OPT_MD) ||
302 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000303 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000304 CmdArgs.push_back("-MG");
305 }
306
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000307 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000308
309 // Convert all -MQ <target> args to -MT <quoted target>
310 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
311 options::OPT_MQ),
312 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000313 const Arg *A = *it;
314 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000315
Daniel Dunbara442fd52010-06-11 22:00:13 +0000316 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000317 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000318 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000319 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320 CmdArgs.push_back(Args.MakeArgString(Quoted));
321
322 // -MT flag - no change
323 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000324 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 }
326 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327
Douglas Gregor111af7d2009-04-18 00:34:01 +0000328 // Add -i* options, and automatically translate to
329 // -include-pch/-include-pth for transparent PCH support. It's
330 // wonky, but we include looking for .gch so we can support seamless
331 // replacement into a build system already set up to be generating
332 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000333 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000334 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
335 ie = Args.filtered_end(); it != ie; ++it) {
336 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000337
338 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000339 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
340 RenderedImplicitInclude = true;
341
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000342 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000343 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000344
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000345 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000346 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000347 SmallString<128> P(A->getValue());
348 // We want the files to have a name like foo.h.pch. Add a dummy extension
349 // so that replace_extension does the right thing.
350 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000351 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000352 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000353 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356
Douglas Gregor111af7d2009-04-18 00:34:01 +0000357 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000358 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000359 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000360 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000361 }
362
Douglas Gregor111af7d2009-04-18 00:34:01 +0000363 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000364 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000365 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000366 FoundPCH = UsePCH;
367 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000369 }
370
371 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000372 if (IsFirstImplicitInclude) {
373 A->claim();
374 if (UsePCH)
375 CmdArgs.push_back("-include-pch");
376 else
377 CmdArgs.push_back("-include-pth");
378 CmdArgs.push_back(Args.MakeArgString(P.str()));
379 continue;
380 } else {
381 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000382 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000383 << P.str() << A->getAsString(Args);
384 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000385 }
386 }
387
388 // Not translated, render as usual.
389 A->claim();
390 A->render(Args, CmdArgs);
391 }
392
393 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000394 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
395 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000396
397 // Add -Wp, and -Xassembler if using the preprocessor.
398
399 // FIXME: There is a very unfortunate problem here, some troubled
400 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
401 // really support that we would have to parse and then translate
402 // those options. :(
403 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
404 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000405
406 // -I- is a deprecated GCC feature, reject it.
407 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000408 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000409
410 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
411 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000412 StringRef sysroot = C.getSysRoot();
413 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000414 if (!Args.hasArg(options::OPT_isysroot)) {
415 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000416 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000417 }
418 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000419
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000420 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000421 // FIXME: We should probably sink the logic for handling these from the
422 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000423 // CPATH - included following the user specified includes (but prior to
424 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000425 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000426 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000427 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000429 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000430 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000431 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000433 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000434
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000435 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000436 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000437 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000438
439 // Add system include arguments.
440 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000441}
442
Daniel Dunbarf492c922009-09-10 22:59:51 +0000443/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000444/// CPU.
445//
446// FIXME: This is redundant with -mcpu, why does LLVM use this.
447// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000448static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000449 return llvm::StringSwitch<const char *>(CPU)
Tim Northover92509c12013-06-13 15:02:46 +0000450 .Case("strongarm", "v4")
Chad Rosier9ac84512011-10-07 17:48:56 +0000451 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
452 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
453 .Cases("arm920", "arm920t", "arm922t", "v4t")
454 .Cases("arm940t", "ep9312","v4t")
455 .Cases("arm10tdmi", "arm1020t", "v5")
456 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
457 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
458 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
459 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
460 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
461 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonf643afc2013-03-04 22:37:46 +0000462 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
463 .Cases("cortex-a9", "cortex-a15", "v7")
Quentin Colombetf5a37a32012-12-21 17:57:47 +0000464 .Case("cortex-r5", "v7r")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000465 .Case("cortex-m0", "v6m")
Bob Wilson743bf672013-03-04 22:37:49 +0000466 .Case("cortex-m3", "v7m")
467 .Case("cortex-m4", "v7em")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000468 .Case("cortex-a9-mp", "v7f")
469 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000470 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000471}
472
Benjamin Kramer09811c72012-06-26 22:20:06 +0000473/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
474//
475// FIXME: tblgen this.
476static std::string getARMTargetCPU(const ArgList &Args,
477 const llvm::Triple &Triple) {
478 // FIXME: Warn on inconsistent use of -mcpu and -march.
479
480 // If we have -mcpu=, use that.
481 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000482 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000483 // Handle -mcpu=native.
484 if (MCPU == "native")
485 return llvm::sys::getHostCPUName();
486 else
487 return MCPU;
488 }
489
490 StringRef MArch;
491 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
492 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000493 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000494 } else {
495 // Otherwise, use the Arch from the triple.
496 MArch = Triple.getArchName();
497 }
498
499 // Handle -march=native.
500 std::string NativeMArch;
501 if (MArch == "native") {
502 std::string CPU = llvm::sys::getHostCPUName();
503 if (CPU != "generic") {
504 // Translate the native cpu into the architecture. The switch below will
505 // then chose the minimum cpu for that arch.
506 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
507 MArch = NativeMArch;
508 }
509 }
510
511 return llvm::StringSwitch<const char *>(MArch)
512 .Cases("armv2", "armv2a","arm2")
513 .Case("armv3", "arm6")
514 .Case("armv3m", "arm7m")
Tim Northover92509c12013-06-13 15:02:46 +0000515 .Case("armv4", "strongarm")
516 .Case("armv4t", "arm7tdmi")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000517 .Cases("armv5", "armv5t", "arm10tdmi")
518 .Cases("armv5e", "armv5te", "arm1022e")
519 .Case("armv5tej", "arm926ej-s")
520 .Cases("armv6", "armv6k", "arm1136jf-s")
521 .Case("armv6j", "arm1136j-s")
522 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
523 .Case("armv6t2", "arm1156t2-s")
Bob Wilson743bf672013-03-04 22:37:49 +0000524 .Cases("armv6m", "armv6-m", "cortex-m0")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000525 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilson743bf672013-03-04 22:37:49 +0000526 .Cases("armv7em", "armv7e-m", "cortex-m4")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000527 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
528 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000529 .Cases("armv7r", "armv7-r", "cortex-r4")
530 .Cases("armv7m", "armv7-m", "cortex-m3")
Joey Goulyd077bc62013-06-26 17:19:48 +0000531 .Cases("armv8", "armv8a", "armv8-a", "cortex-a53")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000532 .Case("ep9312", "ep9312")
533 .Case("iwmmxt", "iwmmxt")
534 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000535 // If all else failed, return the most base CPU with thumb interworking
536 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000537 .Default("arm7tdmi");
538}
539
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000540// FIXME: Move to target hook.
541static bool isSignedCharDefault(const llvm::Triple &Triple) {
542 switch (Triple.getArch()) {
543 default:
544 return true;
545
Tim Northover9bb857a2013-01-31 12:13:10 +0000546 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000547 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000548 case llvm::Triple::ppc:
549 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000550 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000551 return true;
552 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000553
554 case llvm::Triple::systemz:
555 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000556 }
557}
558
Chad Rosiercfbfc582012-04-04 20:51:35 +0000559// Handle -mfpu=.
560//
561// FIXME: Centralize feature selection, defaulting shouldn't be also in the
562// frontend target.
563static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
564 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000565 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000566
567 // Set the target features based on the FPU.
568 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
569 // Disable any default FPU support.
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("-vfp2");
572 CmdArgs.push_back("-target-feature");
573 CmdArgs.push_back("-vfp3");
574 CmdArgs.push_back("-target-feature");
575 CmdArgs.push_back("-neon");
576 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
577 CmdArgs.push_back("-target-feature");
578 CmdArgs.push_back("+vfp3");
579 CmdArgs.push_back("-target-feature");
580 CmdArgs.push_back("+d16");
581 CmdArgs.push_back("-target-feature");
582 CmdArgs.push_back("-neon");
583 } else if (FPU == "vfp") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("+vfp2");
586 CmdArgs.push_back("-target-feature");
587 CmdArgs.push_back("-neon");
588 } else if (FPU == "vfp3" || FPU == "vfpv3") {
589 CmdArgs.push_back("-target-feature");
590 CmdArgs.push_back("+vfp3");
591 CmdArgs.push_back("-target-feature");
592 CmdArgs.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000593 } else if (FPU == "fp-armv8") {
594 CmdArgs.push_back("-target-feature");
595 CmdArgs.push_back("+v8fp");
596 } else if (FPU == "neon-fp-armv8") {
597 CmdArgs.push_back("-target-feature");
598 CmdArgs.push_back("+v8fp");
599 CmdArgs.push_back("-target-feature");
600 CmdArgs.push_back("+neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000601 } else if (FPU == "neon") {
602 CmdArgs.push_back("-target-feature");
603 CmdArgs.push_back("+neon");
604 } else
605 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
606}
607
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000608// Handle -mfpmath=.
609static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000610 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000611 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000612
613 // Set the target features based on the FPMath.
614 if (FPMath == "neon") {
615 CmdArgs.push_back("-target-feature");
616 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000617
Bob Wilsonf643afc2013-03-04 22:37:46 +0000618 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
619 CPU != "cortex-a8" && CPU != "cortex-a9" &&
620 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000621 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
622
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000623 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
624 FPMath == "vfp4") {
625 CmdArgs.push_back("-target-feature");
626 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000627
628 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000629 } else
630 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
631}
632
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000633// Select the float ABI as determined by -msoft-float, -mhard-float, and
634// -mfloat-abi=.
635static StringRef getARMFloatABI(const Driver &D,
636 const ArgList &Args,
637 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000638 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
640 options::OPT_mhard_float,
641 options::OPT_mfloat_abi_EQ)) {
642 if (A->getOption().matches(options::OPT_msoft_float))
643 FloatABI = "soft";
644 else if (A->getOption().matches(options::OPT_mhard_float))
645 FloatABI = "hard";
646 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000647 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000648 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000649 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000650 << A->getAsString(Args);
651 FloatABI = "soft";
652 }
653 }
654 }
655
656 // If unspecified, choose the default based on the platform.
657 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000658 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000659 case llvm::Triple::Darwin:
660 case llvm::Triple::MacOSX:
661 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 // Darwin defaults to "softfp" for v6 and v7.
663 //
664 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000665 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000666 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000667 if (StringRef(ArchName).startswith("v6") ||
668 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000669 FloatABI = "softfp";
670 else
671 FloatABI = "soft";
672 break;
673 }
674
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000675 case llvm::Triple::FreeBSD:
676 // FreeBSD defaults to soft float
677 FloatABI = "soft";
678 break;
679
Daniel Dunbar78485922009-09-10 23:00:09 +0000680 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000681 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000682 case llvm::Triple::GNUEABIHF:
683 FloatABI = "hard";
684 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000685 case llvm::Triple::GNUEABI:
686 FloatABI = "softfp";
687 break;
688 case llvm::Triple::EABI:
689 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
690 FloatABI = "softfp";
691 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000692 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000693 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000694 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000695 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000696 FloatABI = "softfp";
697 else
698 FloatABI = "soft";
699 break;
700 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000701 default:
702 // Assume "soft", but warn the user we are guessing.
703 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000704 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000705 break;
706 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000707 }
708 }
709
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000710 return FloatABI;
711}
712
713
714void Clang::AddARMTargetArgs(const ArgList &Args,
715 ArgStringList &CmdArgs,
716 bool KernelOrKext) const {
717 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000718 // Get the effective triple, which takes into account the deployment target.
719 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
720 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000721 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000722
723 // Select the ABI to use.
724 //
725 // FIXME: Support -meabi.
726 const char *ABIName = 0;
727 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000728 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000729 } else if (Triple.isOSDarwin()) {
730 // The backend is hardwired to assume AAPCS for M-class processors, ensure
731 // the frontend matches that.
732 if (StringRef(CPUName).startswith("cortex-m")) {
733 ABIName = "aapcs";
734 } else {
735 ABIName = "apcs-gnu";
736 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000737 } else {
738 // Select the default based on the platform.
739 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000740 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000741 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000742 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000743 ABIName = "aapcs-linux";
744 break;
745 case llvm::Triple::EABI:
746 ABIName = "aapcs";
747 break;
748 default:
749 ABIName = "apcs-gnu";
750 }
751 }
752 CmdArgs.push_back("-target-abi");
753 CmdArgs.push_back(ABIName);
754
755 // Set the CPU based on -march= and -mcpu=.
756 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000757 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000758
759 // Determine floating point ABI from the options & target defaults.
760 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 if (FloatABI == "soft") {
762 // Floating point operations and argument passing are soft.
763 //
764 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000765 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000768 } else if (FloatABI == "softfp") {
769 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000770 CmdArgs.push_back("-mfloat-abi");
771 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000772 } else {
773 // Floating point operations and argument passing are hard.
774 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000775 CmdArgs.push_back("-mfloat-abi");
776 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000777 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000778
779 // Set appropriate target features for floating point mode.
780 //
781 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
782 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
783 // stripped out by the ARM target.
784
785 // Use software floating point operations?
786 if (FloatABI == "soft") {
787 CmdArgs.push_back("-target-feature");
788 CmdArgs.push_back("+soft-float");
789 }
790
791 // Use software floating point argument passing?
792 if (FloatABI != "hard") {
793 CmdArgs.push_back("-target-feature");
794 CmdArgs.push_back("+soft-float-abi");
795 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000796
797 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000798 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000799 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000800
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000801 // Honor -mfpmath=.
802 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000803 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000804
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000805 // Setting -msoft-float effectively disables NEON because of the GCC
806 // implementation, although the same isn't true of VFP or VFP3.
807 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000808 CmdArgs.push_back("-target-feature");
809 CmdArgs.push_back("-neon");
810 }
811
812 // Kernel code has more strict alignment requirements.
813 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000814 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
815 CmdArgs.push_back("-backend-option");
816 CmdArgs.push_back("-arm-long-calls");
817 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000818
Daniel Dunbar12100e22011-03-22 16:48:17 +0000819 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000820 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000821
822 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000823 CmdArgs.push_back("-backend-option");
824 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000825 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000826
827 // Setting -mno-global-merge disables the codegen global merge pass. Setting
828 // -mglobal-merge has no effect as the pass is enabled by default.
829 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
830 options::OPT_mno_global_merge)) {
831 if (A->getOption().matches(options::OPT_mno_global_merge))
832 CmdArgs.push_back("-mno-global-merge");
833 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000834
Bob Wilson9c8af452013-04-11 18:53:25 +0000835 if (!Args.hasFlag(options::OPT_mimplicit_float,
836 options::OPT_mno_implicit_float,
837 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000838 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000839}
840
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000841// Translate MIPS CPU name alias option to CPU name.
842static StringRef getMipsCPUFromAlias(const Arg &A) {
843 if (A.getOption().matches(options::OPT_mips32))
844 return "mips32";
845 if (A.getOption().matches(options::OPT_mips32r2))
846 return "mips32r2";
847 if (A.getOption().matches(options::OPT_mips64))
848 return "mips64";
849 if (A.getOption().matches(options::OPT_mips64r2))
850 return "mips64r2";
851 llvm_unreachable("Unexpected option");
852 return "";
853}
854
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000855// Get CPU and ABI names. They are not independent
856// so we have to calculate them together.
857static void getMipsCPUAndABI(const ArgList &Args,
858 const ToolChain &TC,
859 StringRef &CPUName,
860 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000861 const char *DefMips32CPU = "mips32";
862 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000863
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000864 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000865 options::OPT_mcpu_EQ,
866 options::OPT_mips_CPUs_Group)) {
867 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
868 CPUName = getMipsCPUFromAlias(*A);
869 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000870 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000871 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000872
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000873 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000874 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000875 // Convert a GNU style Mips ABI name to the name
876 // accepted by LLVM Mips backend.
877 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
878 .Case("32", "o32")
879 .Case("64", "n64")
880 .Default(ABIName);
881 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000882
883 // Setup default CPU and ABI names.
884 if (CPUName.empty() && ABIName.empty()) {
885 switch (TC.getTriple().getArch()) {
886 default:
887 llvm_unreachable("Unexpected triple arch name");
888 case llvm::Triple::mips:
889 case llvm::Triple::mipsel:
890 CPUName = DefMips32CPU;
891 break;
892 case llvm::Triple::mips64:
893 case llvm::Triple::mips64el:
894 CPUName = DefMips64CPU;
895 break;
896 }
897 }
898
899 if (!ABIName.empty()) {
900 // Deduce CPU name from ABI name.
901 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000902 .Cases("32", "o32", "eabi", DefMips32CPU)
903 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000904 .Default("");
905 }
906 else if (!CPUName.empty()) {
907 // Deduce ABI name from CPU name.
908 ABIName = llvm::StringSwitch<const char *>(CPUName)
909 .Cases("mips32", "mips32r2", "o32")
910 .Cases("mips64", "mips64r2", "n64")
911 .Default("");
912 }
913
914 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000915}
916
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000917// Convert ABI name to the GNU tools acceptable variant.
918static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
919 return llvm::StringSwitch<llvm::StringRef>(ABI)
920 .Case("o32", "32")
921 .Case("n64", "64")
922 .Default(ABI);
923}
924
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000925// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
926// and -mfloat-abi=.
927static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000928 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000929 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000930 options::OPT_mhard_float,
931 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000932 if (A->getOption().matches(options::OPT_msoft_float))
933 FloatABI = "soft";
934 else if (A->getOption().matches(options::OPT_mhard_float))
935 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000936 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000937 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000938 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000939 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000940 FloatABI = "hard";
941 }
942 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000943 }
944
945 // If unspecified, choose the default based on the platform.
946 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000947 // Assume "hard", because it's a default value used by gcc.
948 // When we start to recognize specific target MIPS processors,
949 // we will be able to select the default more correctly.
950 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000951 }
952
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000953 return FloatABI;
954}
955
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000956static void AddTargetFeature(const ArgList &Args,
957 ArgStringList &CmdArgs,
958 OptSpecifier OnOpt,
959 OptSpecifier OffOpt,
960 StringRef FeatureName) {
961 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
962 CmdArgs.push_back("-target-feature");
963 if (A->getOption().matches(OnOpt))
964 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
965 else
966 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
967 }
968}
969
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000970void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000971 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000972 const Driver &D = getToolChain().getDriver();
973 StringRef CPUName;
974 StringRef ABIName;
975 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
976
977 CmdArgs.push_back("-target-cpu");
978 CmdArgs.push_back(CPUName.data());
979
980 CmdArgs.push_back("-target-abi");
981 CmdArgs.push_back(ABIName.data());
982
983 StringRef FloatABI = getMipsFloatABI(D, Args);
984
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000985 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
986
987 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000988 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000989 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000990 CmdArgs.push_back("-mfloat-abi");
991 CmdArgs.push_back("soft");
992
993 // FIXME: Note, this is a hack. We need to pass the selected float
994 // mode to the MipsTargetInfoBase to define appropriate macros there.
995 // Now it is the only method.
996 CmdArgs.push_back("-target-feature");
997 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000998
999 if (FloatABI == "hard" && IsMips16) {
1000 CmdArgs.push_back("-mllvm");
1001 CmdArgs.push_back("-mips16-hard-float");
1002 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001003 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001004 else {
1005 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001006 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001007 CmdArgs.push_back("-mfloat-abi");
1008 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001009 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001010
Simon Atanasyan82eec3a2013-04-14 14:07:36 +00001011 AddTargetFeature(Args, CmdArgs,
1012 options::OPT_msingle_float, options::OPT_mdouble_float,
1013 "single-float");
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001014 AddTargetFeature(Args, CmdArgs,
1015 options::OPT_mips16, options::OPT_mno_mips16,
1016 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001017 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan60777612013-04-14 14:07:51 +00001018 options::OPT_mmicromips, options::OPT_mno_micromips,
1019 "micromips");
1020 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001021 options::OPT_mdsp, options::OPT_mno_dsp,
1022 "dsp");
1023 AddTargetFeature(Args, CmdArgs,
1024 options::OPT_mdspr2, options::OPT_mno_dspr2,
1025 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001026
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001027 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1028 if (A->getOption().matches(options::OPT_mxgot)) {
1029 CmdArgs.push_back("-mllvm");
1030 CmdArgs.push_back("-mxgot");
1031 }
1032 }
1033
Simon Atanasyanc580b322013-05-11 06:33:44 +00001034 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1035 options::OPT_mno_ldc1_sdc1)) {
1036 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1037 CmdArgs.push_back("-mllvm");
1038 CmdArgs.push_back("-mno-ldc1-sdc1");
1039 }
1040 }
1041
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001042 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001043 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001044 CmdArgs.push_back("-mllvm");
1045 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1046 A->claim();
1047 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001048}
1049
Hal Finkel8eb59282012-06-11 22:35:19 +00001050/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1051static std::string getPPCTargetCPU(const ArgList &Args) {
1052 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001053 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001054
1055 if (CPUName == "native") {
1056 std::string CPU = llvm::sys::getHostCPUName();
1057 if (!CPU.empty() && CPU != "generic")
1058 return CPU;
1059 else
1060 return "";
1061 }
1062
1063 return llvm::StringSwitch<const char *>(CPUName)
1064 .Case("common", "generic")
1065 .Case("440", "440")
1066 .Case("440fp", "440")
1067 .Case("450", "450")
1068 .Case("601", "601")
1069 .Case("602", "602")
1070 .Case("603", "603")
1071 .Case("603e", "603e")
1072 .Case("603ev", "603ev")
1073 .Case("604", "604")
1074 .Case("604e", "604e")
1075 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001076 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001077 .Case("G3", "g3")
1078 .Case("7400", "7400")
1079 .Case("G4", "g4")
1080 .Case("7450", "7450")
1081 .Case("G4+", "g4+")
1082 .Case("750", "750")
1083 .Case("970", "970")
1084 .Case("G5", "g5")
1085 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001086 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001087 .Case("e500mc", "e500mc")
1088 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001089 .Case("power3", "pwr3")
1090 .Case("power4", "pwr4")
1091 .Case("power5", "pwr5")
1092 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001093 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001094 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001095 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001096 .Case("pwr3", "pwr3")
1097 .Case("pwr4", "pwr4")
1098 .Case("pwr5", "pwr5")
1099 .Case("pwr5x", "pwr5x")
1100 .Case("pwr6", "pwr6")
1101 .Case("pwr6x", "pwr6x")
1102 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001103 .Case("powerpc", "ppc")
1104 .Case("powerpc64", "ppc64")
1105 .Default("");
1106 }
1107
1108 return "";
1109}
1110
1111void Clang::AddPPCTargetArgs(const ArgList &Args,
1112 ArgStringList &CmdArgs) const {
1113 std::string TargetCPUName = getPPCTargetCPU(Args);
1114
1115 // LLVM may default to generating code for the native CPU,
1116 // but, like gcc, we default to a more generic option for
1117 // each architecture. (except on Darwin)
1118 llvm::Triple Triple = getToolChain().getTriple();
1119 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1120 if (Triple.getArch() == llvm::Triple::ppc64)
1121 TargetCPUName = "ppc64";
1122 else
1123 TargetCPUName = "ppc";
1124 }
1125
1126 if (!TargetCPUName.empty()) {
1127 CmdArgs.push_back("-target-cpu");
1128 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1129 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001130
1131 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001132 AddTargetFeature(Args, CmdArgs,
1133 options::OPT_faltivec, options::OPT_fno_altivec,
1134 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001135
Hal Finkel7d458592013-03-30 13:47:44 +00001136 AddTargetFeature(Args, CmdArgs,
1137 options::OPT_mfprnd, options::OPT_mno_fprnd,
1138 "fprnd");
1139
Hal Finkel279ca4d2013-03-28 08:38:53 +00001140 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1141 AddTargetFeature(Args, CmdArgs,
1142 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1143 "mfocrf");
1144
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001145 AddTargetFeature(Args, CmdArgs,
1146 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1147 "popcntd");
1148
Hal Finkel279ca4d2013-03-28 08:38:53 +00001149 // It is really only possible to turn qpx off because turning qpx on is tied
1150 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001151 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1152 CmdArgs.push_back("-target-feature");
1153 CmdArgs.push_back("-qpx");
1154 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001155}
1156
Tom Stellard6674c702013-04-01 20:56:53 +00001157/// Get the (LLVM) name of the R600 gpu we are targeting.
1158static std::string getR600TargetGPU(const ArgList &Args) {
1159 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1160 std::string GPUName = A->getValue();
1161 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001162 .Cases("rv630", "rv635", "r600")
1163 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001164 .Case("rv740", "rv770")
1165 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001166 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001167 .Case("hemlock", "cypress")
1168 .Case("aruba", "cayman")
1169 .Default(GPUName.c_str());
1170 }
1171 return "";
1172}
1173
1174void Clang::AddR600TargetArgs(const ArgList &Args,
1175 ArgStringList &CmdArgs) const {
1176 std::string TargetGPUName = getR600TargetGPU(Args);
1177 CmdArgs.push_back("-target-cpu");
1178 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1179}
1180
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001181void Clang::AddSparcTargetArgs(const ArgList &Args,
1182 ArgStringList &CmdArgs) const {
1183 const Driver &D = getToolChain().getDriver();
1184
1185 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001186 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001187 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001188 }
1189
1190 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001191 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001192 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1193 options::OPT_mhard_float)) {
1194 if (A->getOption().matches(options::OPT_msoft_float))
1195 FloatABI = "soft";
1196 else if (A->getOption().matches(options::OPT_mhard_float))
1197 FloatABI = "hard";
1198 }
1199
1200 // If unspecified, choose the default based on the platform.
1201 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001202 // Assume "soft", but warn the user we are guessing.
1203 FloatABI = "soft";
1204 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001205 }
1206
1207 if (FloatABI == "soft") {
1208 // Floating point operations and argument passing are soft.
1209 //
1210 // FIXME: This changes CPP defines, we need -target-soft-float.
1211 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001212 CmdArgs.push_back("-target-feature");
1213 CmdArgs.push_back("+soft-float");
1214 } else {
1215 assert(FloatABI == "hard" && "Invalid float abi!");
1216 CmdArgs.push_back("-mhard-float");
1217 }
1218}
1219
Chandler Carruth953fb082013-01-13 11:46:33 +00001220static const char *getX86TargetCPU(const ArgList &Args,
1221 const llvm::Triple &Triple) {
1222 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1223 if (StringRef(A->getValue()) != "native")
1224 return A->getValue();
1225
1226 // FIXME: Reject attempts to use -march=native unless the target matches
1227 // the host.
1228 //
1229 // FIXME: We should also incorporate the detected target features for use
1230 // with -native.
1231 std::string CPU = llvm::sys::getHostCPUName();
1232 if (!CPU.empty() && CPU != "generic")
1233 return Args.MakeArgString(CPU);
1234 }
1235
1236 // Select the default CPU if none was given (or detection failed).
1237
1238 if (Triple.getArch() != llvm::Triple::x86_64 &&
1239 Triple.getArch() != llvm::Triple::x86)
1240 return 0; // This routine is only handling x86 targets.
1241
1242 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1243
1244 // FIXME: Need target hooks.
1245 if (Triple.isOSDarwin())
1246 return Is64Bit ? "core2" : "yonah";
1247
1248 // Everything else goes to x86-64 in 64-bit mode.
1249 if (Is64Bit)
1250 return "x86-64";
1251
1252 if (Triple.getOSName().startswith("haiku"))
1253 return "i586";
1254 if (Triple.getOSName().startswith("openbsd"))
1255 return "i486";
1256 if (Triple.getOSName().startswith("bitrig"))
1257 return "i686";
1258 if (Triple.getOSName().startswith("freebsd"))
1259 return "i486";
1260 if (Triple.getOSName().startswith("netbsd"))
1261 return "i486";
1262 // All x86 devices running Android have core2 as their common
1263 // denominator. This makes a better choice than pentium4.
1264 if (Triple.getEnvironment() == llvm::Triple::Android)
1265 return "core2";
1266
1267 // Fallback to p4.
1268 return "pentium4";
1269}
1270
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001271void Clang::AddX86TargetArgs(const ArgList &Args,
1272 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001273 if (!Args.hasFlag(options::OPT_mred_zone,
1274 options::OPT_mno_red_zone,
1275 true) ||
1276 Args.hasArg(options::OPT_mkernel) ||
1277 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001278 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001279
Bob Wilson2616e2e2013-02-10 16:01:41 +00001280 // Default to avoid implicit floating-point for kernel/kext code, but allow
1281 // that to be overridden with -mno-soft-float.
1282 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1283 Args.hasArg(options::OPT_fapple_kext));
1284 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1285 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001286 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001287 options::OPT_mno_implicit_float)) {
1288 const Option &O = A->getOption();
1289 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1290 O.matches(options::OPT_msoft_float));
1291 }
1292 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001293 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001294
Chandler Carruth953fb082013-01-13 11:46:33 +00001295 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001296 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001297 CmdArgs.push_back(CPUName);
1298 }
1299
Eli Friedmanad811f02011-07-02 00:34:19 +00001300 // The required algorithm here is slightly strange: the options are applied
1301 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1302 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1303 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1304 // former correctly, but not the latter; handle directly-overridden
1305 // attributes here.
1306 llvm::StringMap<unsigned> PrevFeature;
1307 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001308 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1309 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001310 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001311 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001312
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001313 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001314 assert(Name.startswith("m") && "Invalid feature name.");
1315 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001316
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001317 bool IsNegative = Name.startswith("no-");
1318 if (IsNegative)
1319 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001320
Eli Friedmanad811f02011-07-02 00:34:19 +00001321 unsigned& Prev = PrevFeature[Name];
1322 if (Prev)
1323 Features[Prev - 1] = 0;
1324 Prev = Features.size() + 1;
1325 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1326 }
1327 for (unsigned i = 0; i < Features.size(); i++) {
1328 if (Features[i]) {
1329 CmdArgs.push_back("-target-feature");
1330 CmdArgs.push_back(Features[i]);
1331 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001332 }
1333}
1334
Matthew Curtise8f80a12012-12-06 17:49:03 +00001335static inline bool HasPICArg(const ArgList &Args) {
1336 return Args.hasArg(options::OPT_fPIC)
1337 || Args.hasArg(options::OPT_fpic);
1338}
1339
1340static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1341 return Args.getLastArg(options::OPT_G,
1342 options::OPT_G_EQ,
1343 options::OPT_msmall_data_threshold_EQ);
1344}
1345
1346static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1347 std::string value;
1348 if (HasPICArg(Args))
1349 value = "0";
1350 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1351 value = A->getValue();
1352 A->claim();
1353 }
1354 return value;
1355}
1356
Tony Linthicum76329bf2011-12-12 21:14:55 +00001357void Clang::AddHexagonTargetArgs(const ArgList &Args,
1358 ArgStringList &CmdArgs) const {
1359 llvm::Triple Triple = getToolChain().getTriple();
1360
1361 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001362 CmdArgs.push_back(Args.MakeArgString(
1363 "hexagon"
1364 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001365 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001366 CmdArgs.push_back("-mqdsp6-compat");
1367 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001368
Matthew Curtise8f80a12012-12-06 17:49:03 +00001369 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1370 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001371 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001372 CmdArgs.push_back(Args.MakeArgString(
1373 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001374 }
1375
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001376 if (!Args.hasArg(options::OPT_fno_short_enums))
1377 CmdArgs.push_back("-fshort-enums");
1378 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1379 CmdArgs.push_back ("-mllvm");
1380 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1381 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001382 CmdArgs.push_back ("-mllvm");
1383 CmdArgs.push_back ("-machine-sink-split=0");
1384}
1385
Eric Christopher84fbdb42011-08-19 00:30:14 +00001386static bool
John McCall5fb5df92012-06-20 06:18:46 +00001387shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001388 const llvm::Triple &Triple) {
1389 // We use the zero-cost exception tables for Objective-C if the non-fragile
1390 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1391 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001392 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001393 return true;
1394
Bob Wilson6524dd32011-10-14 05:03:44 +00001395 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001396 return false;
1397
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001398 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001399 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001400 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001401}
1402
Anders Carlssone96ab552011-02-28 02:27:16 +00001403/// addExceptionArgs - Adds exception related arguments to the driver command
1404/// arguments. There's a master flag, -fexceptions and also language specific
1405/// flags to enable/disable C++ and Objective-C exceptions.
1406/// This makes it possible to for example disable C++ exceptions but enable
1407/// Objective-C exceptions.
1408static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1409 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001410 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001411 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001412 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001413 if (KernelOrKext) {
1414 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1415 // arguments now to avoid warnings about unused arguments.
1416 Args.ClaimAllArgs(options::OPT_fexceptions);
1417 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1418 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1419 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1420 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1421 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001422 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001423 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001424
1425 // Exceptions are enabled by default.
1426 bool ExceptionsEnabled = true;
1427
1428 // This keeps track of whether exceptions were explicitly turned on or off.
1429 bool DidHaveExplicitExceptionFlag = false;
1430
Rafael Espindola00a66572009-10-01 13:33:33 +00001431 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1432 options::OPT_fno_exceptions)) {
1433 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001434 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001435 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001436 ExceptionsEnabled = false;
1437
1438 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001439 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001440
Anders Carlssone96ab552011-02-28 02:27:16 +00001441 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001442
Anders Carlssone96ab552011-02-28 02:27:16 +00001443 // Exception tables and cleanups can be enabled with -fexceptions even if the
1444 // language itself doesn't support exceptions.
1445 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1446 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001447
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001448 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1449 // is not necessarily sensible, but follows GCC.
1450 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001451 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001452 options::OPT_fno_objc_exceptions,
1453 true)) {
1454 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001455
Eric Christopher84fbdb42011-08-19 00:30:14 +00001456 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001457 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001458 }
1459
1460 if (types::isCXX(InputType)) {
1461 bool CXXExceptionsEnabled = ExceptionsEnabled;
1462
Eric Christopher84fbdb42011-08-19 00:30:14 +00001463 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1464 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001465 options::OPT_fexceptions,
1466 options::OPT_fno_exceptions)) {
1467 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1468 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001469 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001470 CXXExceptionsEnabled = false;
1471 }
1472
1473 if (CXXExceptionsEnabled) {
1474 CmdArgs.push_back("-fcxx-exceptions");
1475
1476 ShouldUseExceptionTables = true;
1477 }
1478 }
1479
1480 if (ShouldUseExceptionTables)
1481 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001482}
1483
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001484static bool ShouldDisableAutolink(const ArgList &Args,
1485 const ToolChain &TC) {
1486 bool Default = true;
1487 if (TC.getTriple().isOSDarwin()) {
1488 // The native darwin assembler doesn't support the linker_option directives,
1489 // so we disable them if we think the .s file will be passed to it.
1490 Default = TC.useIntegratedAs();
1491 }
1492 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1493 Default);
1494}
1495
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001496static bool ShouldDisableCFI(const ArgList &Args,
1497 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001498 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001499 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001500 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001501 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001502 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001503 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001504 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001505 options::OPT_fno_dwarf2_cfi_asm,
1506 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001507}
1508
Ted Kremenek62093662013-03-12 17:02:12 +00001509static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1510 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001511 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1512 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001513 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001514 return !UseDwarfDirectory;
1515}
1516
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001517/// \brief Check whether the given input tree contains any compilation actions.
1518static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001519 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001520 return true;
1521
1522 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1523 if (ContainsCompileAction(*it))
1524 return true;
1525
1526 return false;
1527}
1528
1529/// \brief Check if -relax-all should be passed to the internal assembler.
1530/// This is done by default when compiling non-assembler source with -O0.
1531static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1532 bool RelaxDefault = true;
1533
1534 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1535 RelaxDefault = A->getOption().matches(options::OPT_O0);
1536
1537 if (RelaxDefault) {
1538 RelaxDefault = false;
1539 for (ActionList::const_iterator it = C.getActions().begin(),
1540 ie = C.getActions().end(); it != ie; ++it) {
1541 if (ContainsCompileAction(*it)) {
1542 RelaxDefault = true;
1543 break;
1544 }
1545 }
1546 }
1547
1548 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1549 RelaxDefault);
1550}
1551
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001552SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001553 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1554 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001555 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1556 // at least once (possibly, disabled further).
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001557 const Driver &D = TC.getDriver();
Richard Smith52be6192012-11-05 22:04:41 +00001558 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001559 unsigned Add, Remove;
1560 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001561 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001562 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001563 Kind |= Add;
1564 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001565 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001566 }
1567
Chad Rosierae229d52013-01-29 23:31:22 +00001568 UbsanTrapOnError =
1569 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1570 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1571 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1572
1573 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1574 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1575 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1576 D.Diag(diag::err_drv_argument_not_allowed_with)
1577 << "-fcatch-undefined-behavior"
1578 << "-fno-sanitize-undefined-trap-on-error";
1579 }
1580
1581 // Warn about undefined sanitizer options that require runtime support.
1582 if (UbsanTrapOnError && notAllowedWithTrap()) {
1583 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1584 D.Diag(diag::err_drv_argument_not_allowed_with)
1585 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1586 << "-fcatch-undefined-behavior";
1587 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1588 options::OPT_fno_sanitize_undefined_trap_on_error,
1589 false))
1590 D.Diag(diag::err_drv_argument_not_allowed_with)
1591 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1592 << "-fsanitize-undefined-trap-on-error";
1593 }
1594
Richard Smith52be6192012-11-05 22:04:41 +00001595 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001596 bool NeedsAsan = needsAsanRt();
1597 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001598 bool NeedsMsan = needsMsanRt();
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001599 bool NeedsLsan = needsLeakDetection();
Richard Smith06d87f12012-12-01 01:02:45 +00001600 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001601 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001602 << lastArgumentForKind(D, Args, NeedsAsanRt)
1603 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001604 if (NeedsAsan && NeedsMsan)
1605 D.Diag(diag::err_drv_argument_not_allowed_with)
1606 << lastArgumentForKind(D, Args, NeedsAsanRt)
1607 << lastArgumentForKind(D, Args, NeedsMsanRt);
1608 if (NeedsTsan && NeedsMsan)
1609 D.Diag(diag::err_drv_argument_not_allowed_with)
1610 << lastArgumentForKind(D, Args, NeedsTsanRt)
1611 << lastArgumentForKind(D, Args, NeedsMsanRt);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001612 if (NeedsLsan && NeedsTsan)
1613 D.Diag(diag::err_drv_argument_not_allowed_with)
1614 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1615 << lastArgumentForKind(D, Args, NeedsTsanRt);
1616 if (NeedsLsan && NeedsMsan)
1617 D.Diag(diag::err_drv_argument_not_allowed_with)
1618 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1619 << lastArgumentForKind(D, Args, NeedsMsanRt);
1620 // FIXME: Currenly -fsanitize=leak is silently ignored in the presence of
1621 // -fsanitize=address. Perhaps it should print an error, or perhaps
1622 // -f(-no)sanitize=leak should change whether leak detection is enabled by
1623 // default in ASan?
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001624
1625 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001626 // explicitly contain -fsanitize=address (probably, turned off later in the
1627 // command line).
1628 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1629 D.Diag(diag::warn_drv_unused_sanitizer)
1630 << lastArgumentForKind(D, Args, AddressFull)
1631 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001632
1633 // Parse -f(no-)sanitize-blacklist options.
1634 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1635 options::OPT_fno_sanitize_blacklist)) {
1636 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1637 std::string BLPath = BLArg->getValue();
Rafael Espindola54bbaad2013-06-25 14:48:00 +00001638 if (llvm::sys::fs::exists(BLPath))
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001639 BlacklistFile = BLPath;
1640 else
1641 D.Diag(diag::err_drv_no_such_file) << BLPath;
1642 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001643 } else {
1644 // If no -fsanitize-blacklist option is specified, try to look up for
1645 // blacklist in the resource directory.
1646 std::string BLPath;
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001647 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
Rafael Espindola54bbaad2013-06-25 14:48:00 +00001648 llvm::sys::fs::exists(BLPath))
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001649 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001650 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001651
1652 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001653 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001654 MsanTrackOrigins =
1655 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1656 options::OPT_fno_sanitize_memory_track_origins,
1657 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001658
1659 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov7e434072013-04-09 07:27:44 +00001660 if (NeedsAsan) {
1661 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1662 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov29524a92013-01-20 13:12:12 +00001663 AsanZeroBaseShadow =
Alexey Samsonov7e434072013-04-09 07:27:44 +00001664 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1665 options::OPT_fno_sanitize_address_zero_base_shadow,
1666 ZeroBaseShadowDefault);
1667 // Zero-base shadow is a requirement on Android.
1668 if (IsAndroid && !AsanZeroBaseShadow) {
1669 D.Diag(diag::err_drv_argument_not_allowed_with)
1670 << "-fno-sanitize-address-zero-base-shadow"
1671 << lastArgumentForKind(D, Args, Address);
1672 }
1673 }
Richard Smith52be6192012-11-05 22:04:41 +00001674}
1675
Chandler Carruth36381702013-06-23 11:28:48 +00001676static void addProfileRTLinux(
1677 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1678 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1679 Args.hasArg(options::OPT_fprofile_generate) ||
1680 Args.hasArg(options::OPT_fcreate_profile) ||
1681 Args.hasArg(options::OPT_coverage)))
1682 return;
1683
1684 // The profile runtime is located in the Linux library directory and has name
1685 // "libclang_rt.profile-<ArchName>.a".
1686 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1687 llvm::sys::path::append(
1688 LibProfile, "lib", "linux",
1689 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1690
1691 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1692}
1693
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001694static void addSanitizerRTLinkFlagsLinux(
1695 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001696 const StringRef Sanitizer, bool BeforeLibStdCXX,
1697 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001698 // Sanitizer runtime is located in the Linux library directory and
1699 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1700 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1701 llvm::sys::path::append(
1702 LibSanitizer, "lib", "linux",
1703 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001704
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001705 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1706 // etc.) so that the linker picks custom versions of the global 'operator
1707 // new' and 'operator delete' symbols. We take the extreme (but simple)
1708 // strategy of inserting it at the front of the link command. It also
1709 // needs to be forced to end up in the executable, so wrap it in
1710 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001711 SmallVector<const char *, 3> LibSanitizerArgs;
1712 LibSanitizerArgs.push_back("-whole-archive");
1713 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1714 LibSanitizerArgs.push_back("-no-whole-archive");
1715
1716 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1717 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1718
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001719 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001720 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001721 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001722
1723 // If possible, use a dynamic symbols file to export the symbols from the
1724 // runtime library. If we can't do so, use -export-dynamic instead to export
1725 // all symbols from the binary.
1726 if (ExportSymbols) {
1727 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1728 CmdArgs.push_back(
1729 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1730 else
1731 CmdArgs.push_back("-export-dynamic");
1732 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001733}
1734
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001735/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1736/// This needs to be called before we add the C run-time (malloc, etc).
1737static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001738 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001739 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001740 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1741 llvm::sys::path::append(LibAsan, "lib", "linux",
1742 (Twine("libclang_rt.asan-") +
1743 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001744 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001745 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001746 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001747 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001748 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001749}
1750
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001751/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1752/// This needs to be called before we add the C run-time (malloc, etc).
1753static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1754 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001755 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001756 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001757}
1758
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001759/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1760/// This needs to be called before we add the C run-time (malloc, etc).
1761static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1762 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001763 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001764 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001765}
1766
1767/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1768/// This needs to be called before we add the C run-time (malloc, etc).
1769static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1770 ArgStringList &CmdArgs) {
1771 if (!Args.hasArg(options::OPT_shared))
1772 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001773}
1774
Richard Smithe30752c2012-10-09 19:52:38 +00001775/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1776/// (Linux).
1777static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001778 ArgStringList &CmdArgs, bool IsCXX,
1779 bool HasOtherSanitizerRt) {
1780 if (Args.hasArg(options::OPT_shared))
1781 return;
1782
1783 // Need a copy of sanitizer_common. This could come from another sanitizer
1784 // runtime; if we're not including one, include our own copy.
1785 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001786 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001787
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001788 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001789
1790 // Only include the bits of the runtime which need a C++ ABI library if
1791 // we're linking in C++ mode.
1792 if (IsCXX)
1793 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001794}
1795
Rafael Espindola224dd632011-12-14 21:02:23 +00001796static bool shouldUseFramePointer(const ArgList &Args,
1797 const llvm::Triple &Triple) {
1798 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1799 options::OPT_fomit_frame_pointer))
1800 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1801
Richard Sandiford896f8db2013-07-19 14:06:49 +00001802 // Don't use a frame pointer on linux x86, x86_64 and z if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001803 if ((Triple.getArch() == llvm::Triple::x86_64 ||
Richard Sandiford896f8db2013-07-19 14:06:49 +00001804 Triple.getArch() == llvm::Triple::x86 ||
1805 Triple.getArch() == llvm::Triple::systemz) &&
Rafael Espindola224dd632011-12-14 21:02:23 +00001806 Triple.getOS() == llvm::Triple::Linux) {
1807 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1808 if (!A->getOption().matches(options::OPT_O0))
1809 return false;
1810 }
1811
1812 return true;
1813}
1814
Eric Christopherb7d97e92013-04-03 01:58:53 +00001815static bool shouldUseLeafFramePointer(const ArgList &Args,
1816 const llvm::Triple &Triple) {
1817 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1818 options::OPT_momit_leaf_frame_pointer))
1819 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1820
Richard Sandiford896f8db2013-07-19 14:06:49 +00001821 // Don't use a leaf frame pointer on linux x86, x86_64 and z if optimizing.
Eric Christopherb7d97e92013-04-03 01:58:53 +00001822 if ((Triple.getArch() == llvm::Triple::x86_64 ||
Richard Sandiford896f8db2013-07-19 14:06:49 +00001823 Triple.getArch() == llvm::Triple::x86 ||
1824 Triple.getArch() == llvm::Triple::systemz) &&
Eric Christopherb7d97e92013-04-03 01:58:53 +00001825 Triple.getOS() == llvm::Triple::Linux) {
1826 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1827 if (!A->getOption().matches(options::OPT_O0))
1828 return false;
1829 }
1830
1831 return true;
1832}
1833
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001834/// If the PWD environment variable is set, add a CC1 option to specify the
1835/// debug compilation directory.
1836static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001837 struct stat StatPWDBuf, StatDotBuf;
1838
Benjamin Kramer85f5aa12013-04-27 08:42:33 +00001839 const char *pwd = ::getenv("PWD");
1840 if (!pwd)
1841 return;
1842
1843 if (llvm::sys::path::is_absolute(pwd) &&
Chad Rosiera35d5a32013-04-26 20:49:50 +00001844 stat(pwd, &StatPWDBuf) == 0 &&
1845 stat(".", &StatDotBuf) == 0 &&
1846 StatPWDBuf.st_ino == StatDotBuf.st_ino &&
1847 StatPWDBuf.st_dev == StatDotBuf.st_dev) {
1848 CmdArgs.push_back("-fdebug-compilation-dir");
1849 CmdArgs.push_back(Args.MakeArgString(pwd));
1850 return;
1851 }
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001852
Chad Rosiera35d5a32013-04-26 20:49:50 +00001853 // Fall back to using getcwd.
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001854 SmallString<128> cwd;
1855 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001856 CmdArgs.push_back("-fdebug-compilation-dir");
1857 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001858 }
1859}
1860
Eric Christopherd3804002013-02-22 20:12:52 +00001861static const char *SplitDebugName(const ArgList &Args,
1862 const InputInfoList &Inputs) {
1863 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1864 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1865 SmallString<128> T(FinalOutput->getValue());
1866 llvm::sys::path::replace_extension(T, "dwo");
1867 return Args.MakeArgString(T);
1868 } else {
1869 // Use the compilation dir.
1870 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1871 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1872 llvm::sys::path::replace_extension(F, "dwo");
1873 T += F;
1874 return Args.MakeArgString(F);
1875 }
1876}
1877
1878static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1879 const Tool &T, const JobAction &JA,
1880 const ArgList &Args, const InputInfo &Output,
1881 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001882 ArgStringList ExtractArgs;
1883 ExtractArgs.push_back("--extract-dwo");
1884
1885 ArgStringList StripArgs;
1886 StripArgs.push_back("--strip-dwo");
1887
1888 // Grabbing the output of the earlier compile step.
1889 StripArgs.push_back(Output.getFilename());
1890 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001891 ExtractArgs.push_back(OutFile);
1892
1893 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001894 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001895
1896 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001897 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001898
1899 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001900 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001901}
1902
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001903static bool isOptimizationLevelFast(const ArgList &Args) {
1904 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1905 if (A->getOption().matches(options::OPT_Ofast))
1906 return true;
1907 return false;
1908}
1909
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001910void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001911 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001912 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001913 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001914 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001915 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1916 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001917 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001918 ArgStringList CmdArgs;
1919
Daniel Dunbare521a892009-03-31 20:53:55 +00001920 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1921
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001922 // Invoke ourselves in -cc1 mode.
1923 //
1924 // FIXME: Implement custom jobs for internal actions.
1925 CmdArgs.push_back("-cc1");
1926
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001927 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001928 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001929 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001930 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001931
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001932 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001933 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001934
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001935 if (isa<AnalyzeJobAction>(JA)) {
1936 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1937 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001938 } else if (isa<MigrateJobAction>(JA)) {
1939 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001940 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001941 if (Output.getType() == types::TY_Dependencies)
1942 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001943 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001944 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001945 if (Args.hasArg(options::OPT_rewrite_objc) &&
1946 !Args.hasArg(options::OPT_g_Group))
1947 CmdArgs.push_back("-P");
1948 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001949 } else if (isa<AssembleJobAction>(JA)) {
1950 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001951
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001952 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001953 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001954
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001955 // When using an integrated assembler, translate -Wa, and -Xassembler
1956 // options.
1957 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1958 options::OPT_Xassembler),
1959 ie = Args.filtered_end(); it != ie; ++it) {
1960 const Arg *A = *it;
1961 A->claim();
1962
1963 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001964 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001965
1966 if (Value == "-force_cpusubtype_ALL") {
1967 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001968 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001969 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001970 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001971 CmdArgs.push_back("-mllvm");
1972 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001973 } else if (Value == "--noexecstack") {
1974 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001975 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001976 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001977 << A->getOption().getName() << Value;
1978 }
1979 }
1980 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001981
1982 // Also ignore explicit -force_cpusubtype_ALL option.
1983 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001984 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001985 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001986 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001987
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001988 if (JA.getType() == types::TY_Nothing)
1989 CmdArgs.push_back("-fsyntax-only");
1990 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001991 CmdArgs.push_back("-emit-pch");
1992 else
1993 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001994 } else {
1995 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001996
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001997 if (JA.getType() == types::TY_Nothing) {
1998 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001999 } else if (JA.getType() == types::TY_LLVM_IR ||
2000 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002001 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002002 } else if (JA.getType() == types::TY_LLVM_BC ||
2003 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002004 CmdArgs.push_back("-emit-llvm-bc");
2005 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002006 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002007 } else if (JA.getType() == types::TY_AST) {
2008 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002009 } else if (JA.getType() == types::TY_ModuleFile) {
2010 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002011 } else if (JA.getType() == types::TY_RewrittenObjC) {
2012 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002013 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002014 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2015 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002016 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002017 } else {
2018 assert(JA.getType() == types::TY_PP_Asm &&
2019 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002020 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002021 }
2022
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002023 // The make clang go fast button.
2024 CmdArgs.push_back("-disable-free");
2025
John McCallbb79b5f2010-02-13 03:50:24 +00002026 // Disable the verification pass in -asserts builds.
2027#ifdef NDEBUG
2028 CmdArgs.push_back("-disable-llvm-verifier");
2029#endif
2030
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002031 // Set the main file name, so that debug info works even with
2032 // -save-temps.
2033 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002034 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002035
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002036 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002037 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002038 if (Args.hasArg(options::OPT_static))
2039 CmdArgs.push_back("-static-define");
2040
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002041 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002042 // Enable region store model by default.
2043 CmdArgs.push_back("-analyzer-store=region");
2044
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002045 // Treat blocks as analysis entry points.
2046 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2047
Ted Kremenek49c79792011-03-24 00:28:47 +00002048 CmdArgs.push_back("-analyzer-eagerly-assume");
2049
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002050 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002051 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002052 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002053
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002054 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2055 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002056
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002057 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002058 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002059
2060 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002061
Jordan Rose10ad0812013-04-05 17:55:07 +00002062 if (types::isCXX(Inputs[0].getType()))
2063 CmdArgs.push_back("-analyzer-checker=cplusplus");
2064
Ted Kremenek37e96522012-01-26 02:27:38 +00002065 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002066 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2067 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2068 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2069 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2070 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2071 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002072 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002073
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002074 // Set the output format. The default is plist, for (lame) historical
2075 // reasons.
2076 CmdArgs.push_back("-analyzer-output");
2077 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002078 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002079 else
2080 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002081
Ted Kremenekfe449a22010-03-22 22:32:05 +00002082 // Disable the presentation of standard compiler warnings when
2083 // using --analyze. We only want to show static analyzer diagnostics
2084 // or frontend errors.
2085 CmdArgs.push_back("-w");
2086
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002087 // Add -Xanalyzer arguments when running as analyzer.
2088 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002089 }
2090
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002091 CheckCodeGenerationOptions(D, Args);
2092
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002093 bool PIE = getToolChain().isPIEDefault();
2094 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002095 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002096
Alexey Samsonov090301e2013-04-09 12:28:19 +00002097 // For the PIC and PIE flag options, this logic is different from the
2098 // legacy logic in very old versions of GCC, as that logic was just
2099 // a bug no one had ever fixed. This logic is both more rational and
2100 // consistent with GCC's new logic now that the bugs are fixed. The last
2101 // argument relating to either PIC or PIE wins, and no other argument is
2102 // used. If the last argument is any flavor of the '-fno-...' arguments,
2103 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2104 // at the same level.
2105 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2106 options::OPT_fpic, options::OPT_fno_pic,
2107 options::OPT_fPIE, options::OPT_fno_PIE,
2108 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002109 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2110 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002111 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002112 if (LastPICArg) {
2113 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002114 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2115 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2116 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2117 PIC = PIE || O.matches(options::OPT_fPIC) ||
2118 O.matches(options::OPT_fpic);
2119 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2120 O.matches(options::OPT_fPIC);
2121 } else {
2122 PIE = PIC = false;
2123 }
2124 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002125 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002126
2127 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2128 // specified while enabling PIC enabled level 1 PIC, just force it back to
2129 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2130 // informal testing).
2131 if (PIC && getToolChain().getTriple().isOSDarwin())
2132 IsPICLevelTwo |= getToolChain().isPICDefault();
2133
Chandler Carruthc0c04552012-04-08 16:40:35 +00002134 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2135 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002136 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002137 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002138 (Triple.getOS() != llvm::Triple::IOS ||
2139 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002140 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002141 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002142 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002143
Chandler Carruth76a943b2012-11-19 03:52:03 +00002144 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2145 // This is a very special mode. It trumps the other modes, almost no one
2146 // uses it, and it isn't even valid on any OS but Darwin.
2147 if (!getToolChain().getTriple().isOSDarwin())
2148 D.Diag(diag::err_drv_unsupported_opt_for_target)
2149 << A->getSpelling() << getToolChain().getTriple().str();
2150
2151 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2152
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002153 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002154 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002155
Chandler Carruth76a943b2012-11-19 03:52:03 +00002156 // Only a forced PIC mode can cause the actual compile to have PIC defines
2157 // etc., no flags are sufficient. This behavior was selected to closely
2158 // match that of llvm-gcc and Apple GCC before that.
2159 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2160 CmdArgs.push_back("-pic-level");
2161 CmdArgs.push_back("2");
2162 }
2163 } else {
2164 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2165 // handled in Clang's IRGen by the -pie-level flag.
2166 CmdArgs.push_back("-mrelocation-model");
2167 CmdArgs.push_back(PIC ? "pic" : "static");
2168
2169 if (PIC) {
2170 CmdArgs.push_back("-pic-level");
2171 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2172 if (PIE) {
2173 CmdArgs.push_back("-pie-level");
2174 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2175 }
2176 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002177 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002178
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002179 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2180 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002181 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002182
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002183 // LLVM Code Generator Options.
2184
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002185 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2186 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002187 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002188 }
2189
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002190 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2191 options::OPT_freg_struct_return)) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002192 if (getToolChain().getTriple().getArch() != llvm::Triple::x86) {
2193 D.Diag(diag::err_drv_unsupported_opt_for_target)
2194 << A->getSpelling() << getToolChain().getTriple().str();
2195 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2196 CmdArgs.push_back("-fpcc-struct-return");
2197 } else {
2198 assert(A->getOption().matches(options::OPT_freg_struct_return));
2199 CmdArgs.push_back("-freg-struct-return");
2200 }
2201 }
2202
Roman Divacky65b88cd2011-03-01 17:40:53 +00002203 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2204 CmdArgs.push_back("-mrtd");
2205
Rafael Espindola224dd632011-12-14 21:02:23 +00002206 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002207 CmdArgs.push_back("-mdisable-fp-elim");
2208 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2209 options::OPT_fno_zero_initialized_in_bss))
2210 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002211
2212 bool OFastEnabled = isOptimizationLevelFast(Args);
2213 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2214 // enabled. This alias option is being used to simplify the hasFlag logic.
2215 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2216 options::OPT_fstrict_aliasing;
2217 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002218 options::OPT_fno_strict_aliasing,
2219 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002220 CmdArgs.push_back("-relaxed-aliasing");
Manman Renc451e572013-04-04 21:53:22 +00002221 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2222 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002223 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2224 false))
2225 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002226 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2227 options::OPT_fno_optimize_sibling_calls))
2228 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002229
Eric Christopher006208c2013-04-04 06:29:47 +00002230 // Handle segmented stacks.
2231 if (Args.hasArg(options::OPT_fsplit_stack))
2232 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002233
2234 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2235 // This alias option is being used to simplify the getLastArg logic.
2236 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2237 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002238
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002239 // Handle various floating point optimization flags, mapping them to the
2240 // appropriate LLVM code generation flags. The pattern for all of these is to
2241 // default off the codegen optimizations, and if any flag enables them and no
2242 // flag disables them after the flag enabling them, enable the codegen
2243 // optimization. This is complicated by several "umbrella" flags.
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_ffinite_math_only,
2247 options::OPT_fno_finite_math_only,
2248 options::OPT_fhonor_infinities,
2249 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002250 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2251 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002252 A->getOption().getID() != options::OPT_fhonor_infinities)
2253 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002254 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002255 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002256 options::OPT_ffinite_math_only,
2257 options::OPT_fno_finite_math_only,
2258 options::OPT_fhonor_nans,
2259 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002260 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2261 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002262 A->getOption().getID() != options::OPT_fhonor_nans)
2263 CmdArgs.push_back("-menable-no-nans");
2264
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002265 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2266 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002267 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002268 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002269 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002270 options::OPT_fno_math_errno)) {
2271 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2272 // However, turning *off* -ffast_math merely restores the toolchain default
2273 // (which may be false).
2274 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2275 A->getOption().getID() == options::OPT_ffast_math ||
2276 A->getOption().getID() == options::OPT_Ofast)
2277 MathErrno = false;
2278 else if (A->getOption().getID() == options::OPT_fmath_errno)
2279 MathErrno = true;
2280 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002281 if (MathErrno)
2282 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002283
2284 // There are several flags which require disabling very specific
2285 // optimizations. Any of these being disabled forces us to turn off the
2286 // entire set of LLVM optimizations, so collect them through all the flag
2287 // madness.
2288 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002289 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002290 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002291 options::OPT_funsafe_math_optimizations,
2292 options::OPT_fno_unsafe_math_optimizations,
2293 options::OPT_fassociative_math,
2294 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002295 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2296 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002297 A->getOption().getID() != options::OPT_fno_associative_math)
2298 AssociativeMath = true;
2299 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002300 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002301 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002302 options::OPT_funsafe_math_optimizations,
2303 options::OPT_fno_unsafe_math_optimizations,
2304 options::OPT_freciprocal_math,
2305 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002306 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2307 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002308 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2309 ReciprocalMath = true;
2310 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002311 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002312 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002313 options::OPT_funsafe_math_optimizations,
2314 options::OPT_fno_unsafe_math_optimizations,
2315 options::OPT_fsigned_zeros,
2316 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002317 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2318 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002319 A->getOption().getID() != options::OPT_fsigned_zeros)
2320 SignedZeros = false;
2321 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002322 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002323 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002324 options::OPT_funsafe_math_optimizations,
2325 options::OPT_fno_unsafe_math_optimizations,
2326 options::OPT_ftrapping_math,
2327 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002328 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2329 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002330 A->getOption().getID() != options::OPT_ftrapping_math)
2331 TrappingMath = false;
2332 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2333 !TrappingMath)
2334 CmdArgs.push_back("-menable-unsafe-fp-math");
2335
Lang Hamesaa53b932012-07-06 00:59:19 +00002336
2337 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002338 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002339 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002340 options::OPT_ffp_contract)) {
2341 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002342 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002343 if (Val == "fast" || Val == "on" || Val == "off") {
2344 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2345 } else {
2346 D.Diag(diag::err_drv_unsupported_option_argument)
2347 << A->getOption().getName() << Val;
2348 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002349 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2350 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002351 // If fast-math is set then set the fp-contract mode to fast.
2352 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2353 }
2354 }
2355
Bob Wilson6a039162012-07-19 03:52:53 +00002356 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2357 // and if we find them, tell the frontend to provide the appropriate
2358 // preprocessor macros. This is distinct from enabling any optimizations as
2359 // these options induce language changes which must survive serialization
2360 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002361 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2362 options::OPT_fno_fast_math))
2363 if (!A->getOption().matches(options::OPT_fno_fast_math))
2364 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002365 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2366 if (A->getOption().matches(options::OPT_ffinite_math_only))
2367 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002368
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002369 // Decide whether to use verbose asm. Verbose assembly is the default on
2370 // toolchains which have the integrated assembler on by default.
2371 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2372 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002373 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002374 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002375 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002376
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002377 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2378 CmdArgs.push_back("-mdebug-pass");
2379 CmdArgs.push_back("Structure");
2380 }
2381 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2382 CmdArgs.push_back("-mdebug-pass");
2383 CmdArgs.push_back("Arguments");
2384 }
2385
John McCall8517abc2010-02-19 02:45:38 +00002386 // Enable -mconstructor-aliases except on darwin, where we have to
2387 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002388 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002389 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002390
John McCall7ef5cb32011-03-18 02:56:14 +00002391 // Darwin's kernel doesn't support guard variables; just die if we
2392 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002393 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002394 CmdArgs.push_back("-fforbid-guard-variables");
2395
Douglas Gregordbe39272011-02-01 15:15:22 +00002396 if (Args.hasArg(options::OPT_mms_bitfields)) {
2397 CmdArgs.push_back("-mms-bitfields");
2398 }
John McCall8517abc2010-02-19 02:45:38 +00002399
Daniel Dunbar306945d2009-09-16 06:17:29 +00002400 // This is a coarse approximation of what llvm-gcc actually does, both
2401 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2402 // complicated ways.
2403 bool AsynchronousUnwindTables =
2404 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2405 options::OPT_fno_asynchronous_unwind_tables,
2406 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002407 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002408 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2409 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002410 CmdArgs.push_back("-munwind-tables");
2411
Chandler Carruth05fb5852012-11-21 23:40:23 +00002412 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002413
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002414 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2415 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002416 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002417 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002418
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002419 // FIXME: Handle -mtune=.
2420 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002421
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002422 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002423 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002424 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002425 }
2426
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002427 // Add target specific cpu and features flags.
2428 switch(getToolChain().getTriple().getArch()) {
2429 default:
2430 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002431
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002432 case llvm::Triple::arm:
2433 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002434 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002435 break;
2436
Eric Christopher0b26a612010-03-02 02:41:08 +00002437 case llvm::Triple::mips:
2438 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002439 case llvm::Triple::mips64:
2440 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002441 AddMIPSTargetArgs(Args, CmdArgs);
2442 break;
2443
Hal Finkel8eb59282012-06-11 22:35:19 +00002444 case llvm::Triple::ppc:
2445 case llvm::Triple::ppc64:
2446 AddPPCTargetArgs(Args, CmdArgs);
2447 break;
2448
Tom Stellard6674c702013-04-01 20:56:53 +00002449 case llvm::Triple::r600:
2450 AddR600TargetArgs(Args, CmdArgs);
2451 break;
2452
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002453 case llvm::Triple::sparc:
2454 AddSparcTargetArgs(Args, CmdArgs);
2455 break;
2456
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002457 case llvm::Triple::x86:
2458 case llvm::Triple::x86_64:
2459 AddX86TargetArgs(Args, CmdArgs);
2460 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002461
2462 case llvm::Triple::hexagon:
2463 AddHexagonTargetArgs(Args, CmdArgs);
2464 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002465 }
2466
Tony Linthicum76329bf2011-12-12 21:14:55 +00002467
2468
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002469 // Pass the linker version in use.
2470 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2471 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002472 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002473 }
2474
Eric Christopherb7d97e92013-04-03 01:58:53 +00002475 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002476 CmdArgs.push_back("-momit-leaf-frame-pointer");
2477
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002478 // Explicitly error on some things we know we don't support and can't just
2479 // ignore.
2480 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002481 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2482 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002483 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002484 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002485 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002486 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2487 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002488 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002489 << Unsupported->getOption().getName();
2490 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002491 }
2492
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002493 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002494 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002495 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002496 CmdArgs.push_back("-header-include-file");
2497 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2498 D.CCPrintHeadersFilename : "-");
2499 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002500 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002501 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002502
Chad Rosierbe10f982011-08-02 17:58:04 +00002503 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002504 CmdArgs.push_back("-diagnostic-log-file");
2505 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2506 D.CCLogDiagnosticsFilename : "-");
2507 }
2508
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002509 // Use the last option from "-g" group. "-gline-tables-only"
2510 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002511 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002512 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002513 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002514 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002515 else if (A->getOption().matches(options::OPT_gdwarf_2))
2516 CmdArgs.push_back("-gdwarf-2");
2517 else if (A->getOption().matches(options::OPT_gdwarf_3))
2518 CmdArgs.push_back("-gdwarf-3");
2519 else if (A->getOption().matches(options::OPT_gdwarf_4))
2520 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002521 else if (!A->getOption().matches(options::OPT_g0) &&
Manman Ren38db0922013-07-02 23:15:25 +00002522 !A->getOption().matches(options::OPT_ggdb0)) {
2523 // Default is dwarf-2 for darwin.
2524 if (getToolChain().getTriple().isOSDarwin())
2525 CmdArgs.push_back("-gdwarf-2");
2526 else
2527 CmdArgs.push_back("-g");
2528 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002529 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002530
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002531 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2532 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002533 if (Args.hasArg(options::OPT_gcolumn_info))
2534 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002535
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002536 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2537 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002538 // FIXME: Currently only works on Linux.
2539 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2540 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002541 CmdArgs.push_back("-g");
2542 CmdArgs.push_back("-backend-option");
2543 CmdArgs.push_back("-split-dwarf=Enable");
2544 }
2545
Eric Christophereec89c22013-06-18 00:03:50 +00002546
2547 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2548
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002549 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2550 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2551
Chris Lattner3c77a352010-06-22 00:03:40 +00002552 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2553
Nick Lewycky207bce32011-04-21 23:44:07 +00002554 if (Args.hasArg(options::OPT_ftest_coverage) ||
2555 Args.hasArg(options::OPT_coverage))
2556 CmdArgs.push_back("-femit-coverage-notes");
2557 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2558 Args.hasArg(options::OPT_coverage))
2559 CmdArgs.push_back("-femit-coverage-data");
2560
Nick Lewycky480cb992011-05-04 20:46:58 +00002561 if (C.getArgs().hasArg(options::OPT_c) ||
2562 C.getArgs().hasArg(options::OPT_S)) {
2563 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002564 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002565 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002566 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2567 if (const char *pwd = ::getenv("PWD")) {
2568 if (llvm::sys::path::is_absolute(pwd)) {
2569 SmallString<128> Pwd(pwd);
2570 llvm::sys::path::append(Pwd, CoverageFilename.str());
2571 CoverageFilename.swap(Pwd);
2572 }
2573 }
2574 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002575 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002576 }
2577 }
2578
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002579 // Pass options for controlling the default header search paths.
2580 if (Args.hasArg(options::OPT_nostdinc)) {
2581 CmdArgs.push_back("-nostdsysteminc");
2582 CmdArgs.push_back("-nobuiltininc");
2583 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002584 if (Args.hasArg(options::OPT_nostdlibinc))
2585 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002586 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2587 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2588 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002589
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002590 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002591 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002592 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002593
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002594 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2595
Ted Kremenekf7639e12012-03-06 20:06:33 +00002596 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002597 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002598 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002599 options::OPT_ccc_arcmt_modify,
2600 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002601 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002602 switch (A->getOption().getID()) {
2603 default:
2604 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002605 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002606 CmdArgs.push_back("-arcmt-check");
2607 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002608 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002609 CmdArgs.push_back("-arcmt-modify");
2610 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002611 case options::OPT_ccc_arcmt_migrate:
2612 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002613 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002614 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002615
2616 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2617 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002618 break;
John McCalld70fb982011-06-15 23:25:17 +00002619 }
2620 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002621 } else {
2622 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2623 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2624 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002625 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002626
Ted Kremenekf7639e12012-03-06 20:06:33 +00002627 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2628 if (ARCMTEnabled) {
2629 D.Diag(diag::err_drv_argument_not_allowed_with)
2630 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2631 }
2632 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002633 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002634
2635 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002636 options::OPT_objcmt_migrate_subscripting,
2637 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002638 // None specified, means enable them all.
2639 CmdArgs.push_back("-objcmt-migrate-literals");
2640 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002641 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002642 } else {
2643 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2644 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00002645 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00002646 }
2647 }
2648
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002649 // Add preprocessing options like -I, -D, etc. if we are using the
2650 // preprocessor.
2651 //
2652 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002653 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002654 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002655
Rafael Espindolaa7431922011-07-21 23:40:37 +00002656 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2657 // that "The compiler can only warn and ignore the option if not recognized".
2658 // When building with ccache, it will pass -D options to clang even on
2659 // preprocessed inputs and configure concludes that -fPIC is not supported.
2660 Args.ClaimAllArgs(options::OPT_D);
2661
Daniel Dunbar58f78332009-09-17 06:53:36 +00002662 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002663 // others.
2664 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002665 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002666 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002667 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002668 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002669 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002670 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002671 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002672 }
2673
Chad Rosier86b82082012-12-12 20:06:31 +00002674 // Don't warn about unused -flto. This can happen when we're preprocessing or
2675 // precompiling.
2676 Args.ClaimAllArgs(options::OPT_flto);
2677
Daniel Dunbar945577c2009-10-29 02:24:45 +00002678 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002679 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2680 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002681 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002682 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002683
2684 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2685 // (-ansi is equivalent to -std=c89).
2686 //
2687 // If a std is supplied, only add -trigraphs if it follows the
2688 // option.
2689 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2690 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002691 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002692 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002693 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002694 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002695 else
2696 Std->render(Args, CmdArgs);
2697
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002698 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2699 options::OPT_trigraphs))
2700 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002701 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002702 } else {
2703 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002704 //
2705 // FIXME: Clang doesn't correctly handle -std= when the input language
2706 // doesn't match. For the time being just ignore this for C++ inputs;
2707 // eventually we want to do all the standard defaulting here instead of
2708 // splitting it between the driver and clang -cc1.
2709 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002710 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2711 "-std=", /*Joined=*/true);
2712 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2713 CmdArgs.push_back("-std=c++11");
2714
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002715 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002716 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002717
Chandler Carruthb009b142011-04-23 06:30:43 +00002718 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2719 // '-fconst-strings'; this better indicates its actual behavior.
2720 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2721 false)) {
2722 // For perfect compatibility with GCC, we do this even in the presence of
2723 // '-w'. This flag names something other than a warning for GCC.
2724 CmdArgs.push_back("-fconst-strings");
2725 }
2726
Chandler Carruth61fbf622011-04-23 09:27:53 +00002727 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002728 // during C++ compilation, which it is by default. GCC keeps this define even
2729 // in the presence of '-w', match this behavior bug-for-bug.
2730 if (types::isCXX(InputType) &&
2731 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2732 true)) {
2733 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002734 }
2735
Chandler Carruthe0391482010-05-22 02:21:53 +00002736 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2737 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2738 if (Asm->getOption().matches(options::OPT_fasm))
2739 CmdArgs.push_back("-fgnu-keywords");
2740 else
2741 CmdArgs.push_back("-fno-gnu-keywords");
2742 }
2743
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002744 if (ShouldDisableCFI(Args, getToolChain()))
2745 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002746
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002747 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2748 CmdArgs.push_back("-fno-dwarf-directory-asm");
2749
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002750 if (ShouldDisableAutolink(Args, getToolChain()))
2751 CmdArgs.push_back("-fno-autolink");
2752
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002753 // Add in -fdebug-compilation-dir if necessary.
2754 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002755
Richard Smith9a568822011-11-21 19:36:32 +00002756 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2757 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002758 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002759 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002760 }
2761
Richard Smith9a568822011-11-21 19:36:32 +00002762 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2763 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002764 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002765 }
2766
Richard Smitha3d3bd22013-05-08 02:12:03 +00002767 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2768 CmdArgs.push_back("-fconstexpr-steps");
2769 CmdArgs.push_back(A->getValue());
2770 }
2771
Richard Smithb3a14522013-02-22 01:59:51 +00002772 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2773 CmdArgs.push_back("-fbracket-depth");
2774 CmdArgs.push_back(A->getValue());
2775 }
2776
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002777 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2778 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002779 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002780 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002781 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2782 } else
2783 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002784 }
2785
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002786
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002787 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002788 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002789
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002790 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2791 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002792 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002793 }
David Chisnall5778fce2009-08-31 16:41:57 +00002794
Chris Lattnere23003d2010-01-09 21:54:33 +00002795 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2796 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002797 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002798 }
2799
Chris Lattnerb35583d2010-04-07 20:49:23 +00002800 CmdArgs.push_back("-ferror-limit");
2801 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002802 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002803 else
2804 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002805
Chandler Carrutha77a7272010-05-06 04:55:18 +00002806 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2807 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002808 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002809 }
2810
2811 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2812 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002813 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002814 }
2815
Richard Smithf6f003a2011-12-16 19:06:07 +00002816 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2817 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002818 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002819 }
2820
Daniel Dunbar2c978472009-11-04 06:24:47 +00002821 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002822 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002823 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002824 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002825 } else {
2826 // If -fmessage-length=N was not specified, determine whether this is a
2827 // terminal and, if so, implicitly define -fmessage-length appropriately.
2828 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002829 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002830 }
2831
John McCallb4a99d32013-02-19 01:57:35 +00002832 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2833 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2834 options::OPT_fvisibility_ms_compat)) {
2835 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2836 CmdArgs.push_back("-fvisibility");
2837 CmdArgs.push_back(A->getValue());
2838 } else {
2839 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2840 CmdArgs.push_back("-fvisibility");
2841 CmdArgs.push_back("hidden");
2842 CmdArgs.push_back("-ftype-visibility");
2843 CmdArgs.push_back("default");
2844 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002845 }
2846
Douglas Gregor08329632010-06-15 17:05:35 +00002847 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002848
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002849 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2850
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002851 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002852 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2853 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002854 CmdArgs.push_back("-ffreestanding");
2855
Daniel Dunbare357d562009-12-03 18:42:11 +00002856 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002857 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002858 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002859 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002860 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002861 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00002862 // AltiVec language extensions aren't relevant for assembling.
2863 if (!isa<PreprocessJobAction>(JA) ||
2864 Output.getType() != types::TY_PP_Asm)
2865 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002866 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2867 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002868
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002869 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smith52be6192012-11-05 22:04:41 +00002870 Sanitize.addArgs(Args, CmdArgs);
2871
Will Dietz3676d562012-12-30 20:53:28 +00002872 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2873 options::OPT_fno_sanitize_recover,
2874 true))
2875 CmdArgs.push_back("-fno-sanitize-recover");
2876
Chad Rosierae229d52013-01-29 23:31:22 +00002877 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2878 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2879 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2880 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2881
Eric Christopher459d2712013-02-19 06:16:53 +00002882 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002883 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2884 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2885 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2886 D.Diag(diag::err_drv_argument_only_allowed_with)
2887 << A->getAsString(Args) << "ppc/ppc64";
2888
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002889 if (getToolChain().SupportsProfiling())
2890 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002891
2892 // -flax-vector-conversions is default.
2893 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2894 options::OPT_fno_lax_vector_conversions))
2895 CmdArgs.push_back("-fno-lax-vector-conversions");
2896
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002897 if (Args.getLastArg(options::OPT_fapple_kext))
2898 CmdArgs.push_back("-fapple-kext");
2899
David Blaikie690f21e2012-06-14 18:55:27 +00002900 if (Args.hasFlag(options::OPT_frewrite_includes,
2901 options::OPT_fno_rewrite_includes, false))
2902 CmdArgs.push_back("-frewrite-includes");
2903
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002904 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002905 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002906 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002907 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2908 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002909
2910 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2911 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002912 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002913 }
2914
Bob Wilson14adb362012-02-03 06:27:22 +00002915 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002916
Chandler Carruth6e501032011-03-27 00:04:55 +00002917 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2918 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2919 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2920 options::OPT_fno_wrapv)) {
2921 if (A->getOption().matches(options::OPT_fwrapv))
2922 CmdArgs.push_back("-fwrapv");
2923 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2924 options::OPT_fno_strict_overflow)) {
2925 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2926 CmdArgs.push_back("-fwrapv");
2927 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002928 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002929 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002930
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002931 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2932
Mahesha S6a682be42012-10-27 07:47:56 +00002933
Daniel Dunbar4930e332009-11-17 08:07:36 +00002934 // -stack-protector=0 is default.
2935 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002936 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2937 options::OPT_fstack_protector_all,
2938 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002939 if (A->getOption().matches(options::OPT_fstack_protector))
2940 StackProtectorLevel = 1;
2941 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2942 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002943 } else {
2944 StackProtectorLevel =
2945 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2946 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002947 if (StackProtectorLevel) {
2948 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002949 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002950 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002951
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002952 // --param ssp-buffer-size=
2953 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2954 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002955 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002956 if (Str.startswith("ssp-buffer-size=")) {
2957 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002958 CmdArgs.push_back("-stack-protector-buffer-size");
2959 // FIXME: Verify the argument is a valid integer.
2960 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002961 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002962 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002963 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002964 }
2965
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002966 // Translate -mstackrealign
2967 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2968 false)) {
2969 CmdArgs.push_back("-backend-option");
2970 CmdArgs.push_back("-force-align-stack");
2971 }
2972 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2973 false)) {
2974 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2975 }
2976
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002977 if (Args.hasArg(options::OPT_mstack_alignment)) {
2978 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2979 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002980 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002981 // -mkernel implies -mstrict-align; don't add the redundant option.
2982 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002983 CmdArgs.push_back("-backend-option");
2984 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002985 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002986
Daniel Dunbard18049a2009-04-07 21:16:11 +00002987 // Forward -f options with positive and negative forms; we translate
2988 // these by hand.
2989
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002990 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002991 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002992 CmdArgs.push_back("-fapple-kext");
2993 if (!Args.hasArg(options::OPT_fbuiltin))
2994 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002995 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002996 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002997 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002998 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002999 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003000
Nuno Lopes13c88c72009-12-16 16:59:22 +00003001 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3002 options::OPT_fno_assume_sane_operator_new))
3003 CmdArgs.push_back("-fno-assume-sane-operator-new");
3004
Daniel Dunbar4930e332009-11-17 08:07:36 +00003005 // -fblocks=0 is default.
3006 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003007 getToolChain().IsBlocksDefault()) ||
3008 (Args.hasArg(options::OPT_fgnu_runtime) &&
3009 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3010 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003011 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003012
3013 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3014 !getToolChain().hasBlocksRuntime())
3015 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003016 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003017
Douglas Gregor226173a2012-01-18 15:19:58 +00003018 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3019 // users must also pass -fcxx-modules. The latter flag will disappear once the
3020 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003021 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003022 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3023 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3024 options::OPT_fno_cxx_modules,
3025 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003026 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003027 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003028 HaveModules = true;
3029 }
3030 }
3031
Douglas Gregor35b04d62013-02-07 19:01:24 +00003032 // If a module path was provided, pass it along. Otherwise, use a temporary
3033 // directory.
3034 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3035 A->claim();
3036 if (HaveModules) {
3037 A->render(Args, CmdArgs);
3038 }
3039 } else if (HaveModules) {
3040 SmallString<128> DefaultModuleCache;
3041 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3042 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003043 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3044 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003045 const char Arg[] = "-fmodules-cache-path=";
3046 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3047 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003048 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3049 }
3050
3051 // Pass through all -fmodules-ignore-macro arguments.
3052 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003053 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3054 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003055
John McCalldfea9982010-04-09 19:12:06 +00003056 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003057 if (Args.hasFlag(options::OPT_fno_access_control,
3058 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003059 false))
John McCall3155f572010-04-09 19:03:51 +00003060 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003061
Anders Carlssond470fef2010-11-21 00:09:52 +00003062 // -felide-constructors is the default.
3063 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3064 options::OPT_felide_constructors,
3065 false))
3066 CmdArgs.push_back("-fno-elide-constructors");
3067
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003068 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003069 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003070 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003071 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003072
Richard Smith52be6192012-11-05 22:04:41 +00003073 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003074 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003075 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003076 Args.getLastArg(options::OPT_mkernel,
3077 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003078 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003079 D.Diag(diag::err_drv_argument_not_allowed_with)
3080 << "-fsanitize=vptr" << NoRttiArg;
3081 }
3082 }
3083
Tony Linthicum76329bf2011-12-12 21:14:55 +00003084 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003085 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003086 options::OPT_fno_short_enums,
3087 getToolChain().getTriple().getArch() ==
3088 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003089 CmdArgs.push_back("-fshort-enums");
3090
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003091 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003092 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003093 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003094 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003095
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003096 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003097 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003098 options::OPT_fno_threadsafe_statics))
3099 CmdArgs.push_back("-fno-threadsafe-statics");
3100
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003101 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003102 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3103 options::OPT_fno_use_cxa_atexit,
3104 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003105 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00003106 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
3107 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003108 CmdArgs.push_back("-fno-use-cxa-atexit");
3109
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003110 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003111 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003112 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3113 CmdArgs.push_back("-fms-extensions");
3114
Francois Pichet1b4f1632011-09-17 04:32:15 +00003115 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003116 if (Args.hasFlag(options::OPT_fms_compatibility,
3117 options::OPT_fno_ms_compatibility,
3118 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3119 Args.hasFlag(options::OPT_fms_extensions,
3120 options::OPT_fno_ms_extensions,
3121 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003122 CmdArgs.push_back("-fms-compatibility");
3123
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003124 // -fmsc-version=1300 is default.
3125 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3126 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3127 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003128 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003129 if (msc_ver.empty())
3130 CmdArgs.push_back("-fmsc-version=1300");
3131 else
3132 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3133 }
3134
3135
Eric Christopher5ecce122013-02-18 00:38:31 +00003136 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003137 if (Args.hasFlag(options::OPT_fborland_extensions,
3138 options::OPT_fno_borland_extensions, false))
3139 CmdArgs.push_back("-fborland-extensions");
3140
Francois Pichet02744872011-09-01 16:38:08 +00003141 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3142 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003143 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3144 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003145 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003146 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003147
Chandler Carruthe03aa552010-04-17 20:17:31 +00003148 // -fgnu-keywords default varies depending on language; only pass if
3149 // specified.
3150 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003151 options::OPT_fno_gnu_keywords))
3152 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003153
Rafael Espindola922a6242011-06-02 17:30:53 +00003154 if (Args.hasFlag(options::OPT_fgnu89_inline,
3155 options::OPT_fno_gnu89_inline,
3156 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003157 CmdArgs.push_back("-fgnu89-inline");
3158
Chad Rosier9c76d242012-03-15 22:31:42 +00003159 if (Args.hasArg(options::OPT_fno_inline))
3160 CmdArgs.push_back("-fno-inline");
3161
Chad Rosier64d6be92012-03-06 21:17:19 +00003162 if (Args.hasArg(options::OPT_fno_inline_functions))
3163 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003164
John McCall5fb5df92012-06-20 06:18:46 +00003165 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003166
John McCall5fb5df92012-06-20 06:18:46 +00003167 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3168 // legacy is the default.
3169 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003170 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3171 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003172 objcRuntime.isLegacyDispatchDefaultForArch(
3173 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003174 if (getToolChain().UseObjCMixedDispatch())
3175 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3176 else
3177 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3178 }
3179 }
3180
Nico Weber97bd94b2012-03-09 21:19:44 +00003181 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3182 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00003183 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00003184 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3185 }
3186
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003187 // -fencode-extended-block-signature=1 is default.
3188 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3189 CmdArgs.push_back("-fencode-extended-block-signature");
3190 }
3191
John McCall24fc0de2011-07-06 00:26:06 +00003192 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3193 // NOTE: This logic is duplicated in ToolChains.cpp.
3194 bool ARC = isObjCAutoRefCount(Args);
3195 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003196 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003197
John McCall24fc0de2011-07-06 00:26:06 +00003198 CmdArgs.push_back("-fobjc-arc");
3199
Chandler Carruth491db322011-11-04 07:34:47 +00003200 // FIXME: It seems like this entire block, and several around it should be
3201 // wrapped in isObjC, but for now we just use it here as this is where it
3202 // was being used previously.
3203 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3204 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3205 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3206 else
3207 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3208 }
3209
John McCall24fc0de2011-07-06 00:26:06 +00003210 // Allow the user to enable full exceptions code emission.
3211 // We define off for Objective-CC, on for Objective-C++.
3212 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3213 options::OPT_fno_objc_arc_exceptions,
3214 /*default*/ types::isCXX(InputType)))
3215 CmdArgs.push_back("-fobjc-arc-exceptions");
3216 }
3217
3218 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3219 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003220 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003221 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003222
John McCall24fc0de2011-07-06 00:26:06 +00003223 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3224 // takes precedence.
3225 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3226 if (!GCArg)
3227 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3228 if (GCArg) {
3229 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003230 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003231 << GCArg->getAsString(Args);
3232 } else if (getToolChain().SupportsObjCGC()) {
3233 GCArg->render(Args, CmdArgs);
3234 } else {
3235 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003236 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003237 << GCArg->getAsString(Args);
3238 }
3239 }
3240
John McCallb5f652e2011-06-22 00:53:57 +00003241 // Add exception args.
3242 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003243 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003244
3245 if (getToolChain().UseSjLjExceptions())
3246 CmdArgs.push_back("-fsjlj-exceptions");
3247
3248 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003249 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3250 options::OPT_fno_assume_sane_operator_new))
3251 CmdArgs.push_back("-fno-assume-sane-operator-new");
3252
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003253 // -fconstant-cfstrings is default, and may be subject to argument translation
3254 // on Darwin.
3255 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3256 options::OPT_fno_constant_cfstrings) ||
3257 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3258 options::OPT_mno_constant_cfstrings))
3259 CmdArgs.push_back("-fno-constant-cfstrings");
3260
John Thompsoned4e2952009-11-05 20:14:16 +00003261 // -fshort-wchar default varies depending on platform; only
3262 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003263 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3264 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003265
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003266 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3267 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003268 //
3269 // FIXME: This is gross; that translation should be pulled from the
3270 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003271 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003272 options::OPT_fno_pascal_strings,
3273 false) ||
3274 Args.hasFlag(options::OPT_mpascal_strings,
3275 options::OPT_mno_pascal_strings,
3276 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003277 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003278
Daniel Dunbar096ed292011-10-05 21:04:55 +00003279 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3280 // -fno-pack-struct doesn't apply to -fpack-struct=.
3281 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003282 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003283 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003284 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003285 } else if (Args.hasFlag(options::OPT_fpack_struct,
3286 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003287 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003288 }
3289
Eric Christopher8d56caa2013-02-18 01:16:37 +00003290 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003291 if (!Args.hasArg(options::OPT_fcommon))
3292 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003293 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003294 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003295
Daniel Dunbard18049a2009-04-07 21:16:11 +00003296 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003297 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003298 CmdArgs.push_back("-fno-common");
3299
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003300 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003301 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003302 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003303 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003304 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003305 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3306
Daniel Dunbar6358d682010-10-15 22:30:42 +00003307 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3308 if (!Args.hasFlag(options::OPT_ffor_scope,
3309 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003310 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003311 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3312
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003313 // -fcaret-diagnostics is default.
3314 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3315 options::OPT_fno_caret_diagnostics, true))
3316 CmdArgs.push_back("-fno-caret-diagnostics");
3317
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003318 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003319 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003320 options::OPT_fno_diagnostics_fixit_info))
3321 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003322
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003323 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003324 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003325 options::OPT_fno_diagnostics_show_option))
3326 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003327
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003328 if (const Arg *A =
3329 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3330 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003331 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003332 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003333
Douglas Gregor643c9222011-05-21 17:07:29 +00003334 if (const Arg *A =
3335 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3336 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003337 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003338 }
3339
Chandler Carruthb6766f02011-03-27 01:50:55 +00003340 if (Arg *A = Args.getLastArg(
3341 options::OPT_fdiagnostics_show_note_include_stack,
3342 options::OPT_fno_diagnostics_show_note_include_stack)) {
3343 if (A->getOption().matches(
3344 options::OPT_fdiagnostics_show_note_include_stack))
3345 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3346 else
3347 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3348 }
3349
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003350 // Color diagnostics are the default, unless the terminal doesn't support
3351 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003352 // Support both clang's -f[no-]color-diagnostics and gcc's
3353 // -f[no-]diagnostics-colors[=never|always|auto].
3354 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3355 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3356 it != ie; ++it) {
3357 const Option &O = (*it)->getOption();
3358 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3359 !O.matches(options::OPT_fdiagnostics_color) &&
3360 !O.matches(options::OPT_fno_color_diagnostics) &&
3361 !O.matches(options::OPT_fno_diagnostics_color) &&
3362 !O.matches(options::OPT_fdiagnostics_color_EQ))
3363 continue;
3364
3365 (*it)->claim();
3366 if (O.matches(options::OPT_fcolor_diagnostics) ||
3367 O.matches(options::OPT_fdiagnostics_color)) {
3368 ShowColors = Colors_On;
3369 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3370 O.matches(options::OPT_fno_diagnostics_color)) {
3371 ShowColors = Colors_Off;
3372 } else {
3373 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3374 StringRef value((*it)->getValue());
3375 if (value == "always")
3376 ShowColors = Colors_On;
3377 else if (value == "never")
3378 ShowColors = Colors_Off;
3379 else if (value == "auto")
3380 ShowColors = Colors_Auto;
3381 else
3382 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3383 << ("-fdiagnostics-color=" + value).str();
3384 }
3385 }
3386 if (ShowColors == Colors_On ||
3387 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003388 CmdArgs.push_back("-fcolor-diagnostics");
3389
Daniel Dunbardb097022009-06-08 21:13:54 +00003390 if (!Args.hasFlag(options::OPT_fshow_source_location,
3391 options::OPT_fno_show_source_location))
3392 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003393
Douglas Gregor643c9222011-05-21 17:07:29 +00003394 if (!Args.hasFlag(options::OPT_fshow_column,
3395 options::OPT_fno_show_column,
3396 true))
3397 CmdArgs.push_back("-fno-show-column");
3398
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003399 if (!Args.hasFlag(options::OPT_fspell_checking,
3400 options::OPT_fno_spell_checking))
3401 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003402
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003403
Chad Rosierc8e56e82012-12-05 21:08:21 +00003404 // -fno-asm-blocks is default.
3405 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3406 false))
3407 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003408
Chad Rosier679b0752013-04-24 18:29:59 +00003409 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3410 // This alias option is being used to simplify the hasFlag logic.
3411 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3412 options::OPT_fvectorize;
3413
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003414 // -fvectorize is default.
Chad Rosier679b0752013-04-24 18:29:59 +00003415 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003416 options::OPT_fno_vectorize, true))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003417 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003418
Hal Finkel061f1652012-12-11 19:59:32 +00003419 // -fno-slp-vectorize is default.
3420 if (Args.hasFlag(options::OPT_fslp_vectorize,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003421 options::OPT_fno_slp_vectorize, false))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003422 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003423
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003424 // -fno-slp-vectorize-aggressive is default.
3425 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003426 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003427 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003428
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003429 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3430 A->render(Args, CmdArgs);
3431
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003432 // -fdollars-in-identifiers default varies depending on platform and
3433 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003434 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003435 options::OPT_fno_dollars_in_identifiers)) {
3436 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003437 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003438 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003439 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003440 }
3441
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003442 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3443 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003444 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003445 options::OPT_fno_unit_at_a_time)) {
3446 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003447 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003448 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003449
Eli Friedman055c9702011-11-02 01:53:16 +00003450 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3451 options::OPT_fno_apple_pragma_pack, false))
3452 CmdArgs.push_back("-fapple-pragma-pack");
3453
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003454 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003455 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003456 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003457#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003458 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003459 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3460 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3461 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3462 CmdArgs.push_back("-fno-builtin-strcat");
3463 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3464 CmdArgs.push_back("-fno-builtin-strcpy");
3465 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003466#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003467
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003468 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003469 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003470 options::OPT_traditional_cpp)) {
3471 if (isa<PreprocessJobAction>(JA))
3472 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003473 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003474 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003475 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003476
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003477 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003478 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003479
3480 // Handle serialized diagnostics.
3481 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3482 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003483 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003484 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003485
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003486 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3487 CmdArgs.push_back("-fretain-comments-from-system-headers");
3488
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003489 // Forward -fcomment-block-commands to -cc1.
3490 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003491 // Forward -fparse-all-comments to -cc1.
3492 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003493
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003494 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3495 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003496 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003497 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3498 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003499 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003500
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003501 // We translate this by hand to the -cc1 argument, since nightly test uses
3502 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003503 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003504 CmdArgs.push_back("-disable-llvm-optzns");
3505 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003506 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003507 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003508
Daniel Dunbard67a3222009-03-30 06:36:42 +00003509 if (Output.getType() == types::TY_Dependencies) {
3510 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003511 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003512 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003513 CmdArgs.push_back(Output.getFilename());
3514 } else {
3515 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003516 }
3517
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003518 for (InputInfoList::const_iterator
3519 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3520 const InputInfo &II = *it;
3521 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003522 if (Args.hasArg(options::OPT_rewrite_objc))
3523 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3524 else
3525 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003526 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003527 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003528 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003529 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003530 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003531
Chris Lattnere9d7d782009-11-03 19:50:27 +00003532 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3533
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003534 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003535
3536 // Optionally embed the -cc1 level arguments into the debug info, for build
3537 // analysis.
3538 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003539 ArgStringList OriginalArgs;
3540 for (ArgList::const_iterator it = Args.begin(),
3541 ie = Args.end(); it != ie; ++it)
3542 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003543
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003544 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003545 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003546 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003547 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003548 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003549 }
3550 CmdArgs.push_back("-dwarf-debug-flags");
3551 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3552 }
3553
Eric Christopherd3804002013-02-22 20:12:52 +00003554 // Add the split debug info name to the command lines here so we
3555 // can propagate it to the backend.
3556 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3557 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003558 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003559 const char *SplitDwarfOut;
3560 if (SplitDwarf) {
3561 CmdArgs.push_back("-split-dwarf-file");
3562 SplitDwarfOut = SplitDebugName(Args, Inputs);
3563 CmdArgs.push_back(SplitDwarfOut);
3564 }
3565
3566 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003567 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003568
Eric Christopherf1545832013-02-22 23:50:16 +00003569 // Handle the debug info splitting at object creation time if we're
3570 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003571 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003572 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003573 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003574
Roman Divacky178e01602011-02-10 16:52:03 +00003575 if (Arg *A = Args.getLastArg(options::OPT_pg))
3576 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003577 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003578 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003579
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003580 // Claim some arguments which clang supports automatically.
3581
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003582 // -fpch-preprocess is used with gcc to add a special marker in the output to
3583 // include the PCH file. Clang's PTH solution is completely transparent, so we
3584 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003585 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003586
Daniel Dunbar17731772009-03-23 19:03:36 +00003587 // Claim some arguments which clang doesn't support, but we don't
3588 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003589 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3590 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003591
Rafael Espindolad95a8122011-03-01 05:25:27 +00003592 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003593 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003594 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003595}
3596
Jim Grosbach576452b2012-02-10 20:37:10 +00003597void ClangAs::AddARMTargetArgs(const ArgList &Args,
3598 ArgStringList &CmdArgs) const {
3599 const Driver &D = getToolChain().getDriver();
3600 llvm::Triple Triple = getToolChain().getTriple();
3601
3602 // Set the CPU based on -march= and -mcpu=.
3603 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003604 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003605
3606 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003607 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003608 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003609
3610 // Honor -mfpmath=.
3611 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003612 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003613}
3614
Benjamin Kramerb164d672013-02-22 20:55:17 +00003615void ClangAs::AddX86TargetArgs(const ArgList &Args,
3616 ArgStringList &CmdArgs) const {
3617 // Set the CPU based on -march=.
3618 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3619 CmdArgs.push_back("-target-cpu");
3620 CmdArgs.push_back(CPUName);
3621 }
3622}
3623
John McCall5fb5df92012-06-20 06:18:46 +00003624/// Add options related to the Objective-C runtime/ABI.
3625///
3626/// Returns true if the runtime is non-fragile.
3627ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3628 ArgStringList &cmdArgs,
3629 RewriteKind rewriteKind) const {
3630 // Look for the controlling runtime option.
3631 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3632 options::OPT_fgnu_runtime,
3633 options::OPT_fobjc_runtime_EQ);
3634
3635 // Just forward -fobjc-runtime= to the frontend. This supercedes
3636 // options about fragility.
3637 if (runtimeArg &&
3638 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3639 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003640 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003641 if (runtime.tryParse(value)) {
3642 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3643 << value;
3644 }
3645
3646 runtimeArg->render(args, cmdArgs);
3647 return runtime;
3648 }
3649
3650 // Otherwise, we'll need the ABI "version". Version numbers are
3651 // slightly confusing for historical reasons:
3652 // 1 - Traditional "fragile" ABI
3653 // 2 - Non-fragile ABI, version 1
3654 // 3 - Non-fragile ABI, version 2
3655 unsigned objcABIVersion = 1;
3656 // If -fobjc-abi-version= is present, use that to set the version.
3657 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003658 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003659 if (value == "1")
3660 objcABIVersion = 1;
3661 else if (value == "2")
3662 objcABIVersion = 2;
3663 else if (value == "3")
3664 objcABIVersion = 3;
3665 else
3666 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3667 << value;
3668 } else {
3669 // Otherwise, determine if we are using the non-fragile ABI.
3670 bool nonFragileABIIsDefault =
3671 (rewriteKind == RK_NonFragile ||
3672 (rewriteKind == RK_None &&
3673 getToolChain().IsObjCNonFragileABIDefault()));
3674 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3675 options::OPT_fno_objc_nonfragile_abi,
3676 nonFragileABIIsDefault)) {
3677 // Determine the non-fragile ABI version to use.
3678#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3679 unsigned nonFragileABIVersion = 1;
3680#else
3681 unsigned nonFragileABIVersion = 2;
3682#endif
3683
3684 if (Arg *abiArg = args.getLastArg(
3685 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003686 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003687 if (value == "1")
3688 nonFragileABIVersion = 1;
3689 else if (value == "2")
3690 nonFragileABIVersion = 2;
3691 else
3692 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3693 << value;
3694 }
3695
3696 objcABIVersion = 1 + nonFragileABIVersion;
3697 } else {
3698 objcABIVersion = 1;
3699 }
3700 }
3701
3702 // We don't actually care about the ABI version other than whether
3703 // it's non-fragile.
3704 bool isNonFragile = objcABIVersion != 1;
3705
3706 // If we have no runtime argument, ask the toolchain for its default runtime.
3707 // However, the rewriter only really supports the Mac runtime, so assume that.
3708 ObjCRuntime runtime;
3709 if (!runtimeArg) {
3710 switch (rewriteKind) {
3711 case RK_None:
3712 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3713 break;
3714 case RK_Fragile:
3715 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3716 break;
3717 case RK_NonFragile:
3718 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3719 break;
3720 }
3721
3722 // -fnext-runtime
3723 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3724 // On Darwin, make this use the default behavior for the toolchain.
3725 if (getToolChain().getTriple().isOSDarwin()) {
3726 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3727
3728 // Otherwise, build for a generic macosx port.
3729 } else {
3730 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3731 }
3732
3733 // -fgnu-runtime
3734 } else {
3735 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003736 // Legacy behaviour is to target the gnustep runtime if we are i
3737 // non-fragile mode or the GCC runtime in fragile mode.
3738 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003739 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003740 else
3741 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003742 }
3743
3744 cmdArgs.push_back(args.MakeArgString(
3745 "-fobjc-runtime=" + runtime.getAsString()));
3746 return runtime;
3747}
3748
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003749void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003750 const InputInfo &Output,
3751 const InputInfoList &Inputs,
3752 const ArgList &Args,
3753 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003754 ArgStringList CmdArgs;
3755
3756 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3757 const InputInfo &Input = Inputs[0];
3758
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003759 // Don't warn about "clang -w -c foo.s"
3760 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003761 // and "clang -emit-llvm -c foo.s"
3762 Args.ClaimAllArgs(options::OPT_emit_llvm);
3763 // and "clang -use-gold-plugin -c foo.s"
3764 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003765
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003766 // Invoke ourselves in -cc1as mode.
3767 //
3768 // FIXME: Implement custom jobs for internal actions.
3769 CmdArgs.push_back("-cc1as");
3770
3771 // Add the "effective" target triple.
3772 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003773 std::string TripleStr =
3774 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003775 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3776
3777 // Set the output mode, we currently only expect to be used as a real
3778 // assembler.
3779 CmdArgs.push_back("-filetype");
3780 CmdArgs.push_back("obj");
3781
Eric Christopher45f2e712012-12-18 00:31:10 +00003782 // Set the main file name, so that debug info works even with
3783 // -save-temps or preprocessed assembly.
3784 CmdArgs.push_back("-main-file-name");
3785 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3786
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003787 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003788 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003789
Jim Grosbach576452b2012-02-10 20:37:10 +00003790 // Add target specific cpu and features flags.
3791 switch(getToolChain().getTriple().getArch()) {
3792 default:
3793 break;
3794
3795 case llvm::Triple::arm:
3796 case llvm::Triple::thumb:
3797 AddARMTargetArgs(Args, CmdArgs);
3798 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003799
3800 case llvm::Triple::x86:
3801 case llvm::Triple::x86_64:
3802 AddX86TargetArgs(Args, CmdArgs);
3803 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003804 }
3805
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003806 // Ignore explicit -force_cpusubtype_ALL option.
3807 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003808
Eric Christopherfc3ee562012-01-10 00:38:01 +00003809 // Determine the original source input.
3810 const Action *SourceAction = &JA;
3811 while (SourceAction->getKind() != Action::InputClass) {
3812 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3813 SourceAction = SourceAction->getInputs()[0];
3814 }
3815
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003816 // Forward -g and handle debug info related flags, assuming we are dealing
3817 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003818 if (SourceAction->getType() == types::TY_Asm ||
3819 SourceAction->getType() == types::TY_PP_Asm) {
3820 Args.ClaimAllArgs(options::OPT_g_Group);
3821 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3822 if (!A->getOption().matches(options::OPT_g0))
3823 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003824
3825 // Add the -fdebug-compilation-dir flag if needed.
3826 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003827
3828 // Set the AT_producer to the clang version when using the integrated
3829 // assembler on assembly source files.
3830 CmdArgs.push_back("-dwarf-debug-producer");
3831 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003832 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003833
3834 // Optionally embed the -cc1as level arguments into the debug info, for build
3835 // analysis.
3836 if (getToolChain().UseDwarfDebugFlags()) {
3837 ArgStringList OriginalArgs;
3838 for (ArgList::const_iterator it = Args.begin(),
3839 ie = Args.end(); it != ie; ++it)
3840 (*it)->render(Args, OriginalArgs);
3841
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003842 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003843 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3844 Flags += Exec;
3845 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3846 Flags += " ";
3847 Flags += OriginalArgs[i];
3848 }
3849 CmdArgs.push_back("-dwarf-debug-flags");
3850 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3851 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003852
3853 // FIXME: Add -static support, once we have it.
3854
3855 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3856 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003857 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003858
3859 assert(Output.isFilename() && "Unexpected lipo output.");
3860 CmdArgs.push_back("-o");
3861 CmdArgs.push_back(Output.getFilename());
3862
Daniel Dunbarb440f562010-08-02 02:38:21 +00003863 assert(Input.isFilename() && "Invalid input.");
3864 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003865
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003866 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003867 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003868
3869 // Handle the debug info splitting at object creation time if we're
3870 // creating an object.
3871 // TODO: Currently only works on linux with newer objcopy.
3872 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3873 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3874 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3875 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003876}
3877
Daniel Dunbara3246a02009-03-18 08:07:30 +00003878void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003879 const InputInfo &Output,
3880 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003881 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003882 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003883 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003884 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003885
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003886 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003887 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003888 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003889 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003890 // Don't forward any -g arguments to assembly steps.
3891 if (isa<AssembleJobAction>(JA) &&
3892 A->getOption().matches(options::OPT_g_Group))
3893 continue;
3894
Daniel Dunbar2da02722009-03-19 07:55:12 +00003895 // It is unfortunate that we have to claim here, as this means
3896 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003897 // platforms using a generic gcc, even if we are just using gcc
3898 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003899 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003900 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003901 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003902 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003903
Daniel Dunbar4e295052010-01-25 22:35:08 +00003904 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003905
3906 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003907 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003908 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003909 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003910
3911 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003912 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003913 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003914 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003915 CmdArgs.push_back("ppc64");
3916 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003917 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003918 }
3919
Daniel Dunbar5716d872009-05-02 21:41:52 +00003920 // Try to force gcc to match the tool chain we want, if we recognize
3921 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003922 //
3923 // FIXME: The triple class should directly provide the information we want
3924 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003925 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003926 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003927 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003928 CmdArgs.push_back("-m64");
3929
Daniel Dunbarb440f562010-08-02 02:38:21 +00003930 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003931 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003932 CmdArgs.push_back(Output.getFilename());
3933 } else {
3934 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003935 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003936 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003937
Tony Linthicum76329bf2011-12-12 21:14:55 +00003938 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3939 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003940
3941 // Only pass -x if gcc will understand it; otherwise hope gcc
3942 // understands the suffix correctly. The main use case this would go
3943 // wrong in is for linker inputs if they happened to have an odd
3944 // suffix; really the only way to get this to happen is a command
3945 // like '-x foobar a.c' which will treat a.c like a linker input.
3946 //
3947 // FIXME: For the linker case specifically, can we safely convert
3948 // inputs into '-Wl,' options?
3949 for (InputInfoList::const_iterator
3950 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3951 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003952
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003953 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003954 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3955 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003956 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003957 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003958 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003959 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003960 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003961 else if (II.getType() == types::TY_ModuleFile)
3962 D.Diag(diag::err_drv_no_module_support)
3963 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003964
Daniel Dunbara3246a02009-03-18 08:07:30 +00003965 if (types::canTypeBeUserSpecified(II.getType())) {
3966 CmdArgs.push_back("-x");
3967 CmdArgs.push_back(types::getTypeName(II.getType()));
3968 }
3969
Daniel Dunbarb440f562010-08-02 02:38:21 +00003970 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003971 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003972 else {
3973 const Arg &A = II.getInputArg();
3974
3975 // Reverse translate some rewritten options.
3976 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3977 CmdArgs.push_back("-lstdc++");
3978 continue;
3979 }
3980
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003981 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003982 A.render(Args, CmdArgs);
3983 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003984 }
3985
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003986 const std::string customGCCName = D.getCCCGenericGCCName();
3987 const char *GCCName;
3988 if (!customGCCName.empty())
3989 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00003990 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003991 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003992 } else
3993 GCCName = "gcc";
3994
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003995 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003996 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003997 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003998}
3999
Daniel Dunbar4e295052010-01-25 22:35:08 +00004000void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4001 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004002 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004003}
4004
Daniel Dunbar4e295052010-01-25 22:35:08 +00004005void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
4006 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004007 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004008}
4009
Daniel Dunbar4e295052010-01-25 22:35:08 +00004010void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4011 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004012 const Driver &D = getToolChain().getDriver();
4013
Daniel Dunbar4e295052010-01-25 22:35:08 +00004014 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004015 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4016 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004017 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004018 else {
4019 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004020 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004021 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004022
Daniel Dunbar4e295052010-01-25 22:35:08 +00004023 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004024 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004025}
4026
Daniel Dunbar4e295052010-01-25 22:35:08 +00004027void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4028 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004029 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004030}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004031
Daniel Dunbar4e295052010-01-25 22:35:08 +00004032void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4033 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004034 // The types are (hopefully) good enough.
4035}
4036
Tony Linthicum76329bf2011-12-12 21:14:55 +00004037// Hexagon tools start.
4038void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4039 ArgStringList &CmdArgs) const {
4040
4041}
4042void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4043 const InputInfo &Output,
4044 const InputInfoList &Inputs,
4045 const ArgList &Args,
4046 const char *LinkingOutput) const {
4047
4048 const Driver &D = getToolChain().getDriver();
4049 ArgStringList CmdArgs;
4050
4051 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004052 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004053 CmdArgs.push_back(Args.MakeArgString(MarchString));
4054
4055 RenderExtraToolArgs(JA, CmdArgs);
4056
4057 if (Output.isFilename()) {
4058 CmdArgs.push_back("-o");
4059 CmdArgs.push_back(Output.getFilename());
4060 } else {
4061 assert(Output.isNothing() && "Unexpected output");
4062 CmdArgs.push_back("-fsyntax-only");
4063 }
4064
Matthew Curtise8f80a12012-12-06 17:49:03 +00004065 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4066 if (!SmallDataThreshold.empty())
4067 CmdArgs.push_back(
4068 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004069
Matthew Curtise5df3812012-12-07 17:23:04 +00004070 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4071 options::OPT_Xassembler);
4072
Tony Linthicum76329bf2011-12-12 21:14:55 +00004073 // Only pass -x if gcc will understand it; otherwise hope gcc
4074 // understands the suffix correctly. The main use case this would go
4075 // wrong in is for linker inputs if they happened to have an odd
4076 // suffix; really the only way to get this to happen is a command
4077 // like '-x foobar a.c' which will treat a.c like a linker input.
4078 //
4079 // FIXME: For the linker case specifically, can we safely convert
4080 // inputs into '-Wl,' options?
4081 for (InputInfoList::const_iterator
4082 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4083 const InputInfo &II = *it;
4084
4085 // Don't try to pass LLVM or AST inputs to a generic gcc.
4086 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4087 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4088 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4089 << getToolChain().getTripleString();
4090 else if (II.getType() == types::TY_AST)
4091 D.Diag(clang::diag::err_drv_no_ast_support)
4092 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004093 else if (II.getType() == types::TY_ModuleFile)
4094 D.Diag(diag::err_drv_no_module_support)
4095 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004096
4097 if (II.isFilename())
4098 CmdArgs.push_back(II.getFilename());
4099 else
4100 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4101 II.getInputArg().render(Args, CmdArgs);
4102 }
4103
4104 const char *GCCName = "hexagon-as";
4105 const char *Exec =
4106 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4107 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4108
4109}
4110void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4111 ArgStringList &CmdArgs) const {
4112 // The types are (hopefully) good enough.
4113}
4114
4115void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4116 const InputInfo &Output,
4117 const InputInfoList &Inputs,
4118 const ArgList &Args,
4119 const char *LinkingOutput) const {
4120
Matthew Curtise689b052012-12-06 15:46:07 +00004121 const toolchains::Hexagon_TC& ToolChain =
4122 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4123 const Driver &D = ToolChain.getDriver();
4124
Tony Linthicum76329bf2011-12-12 21:14:55 +00004125 ArgStringList CmdArgs;
4126
Matthew Curtise689b052012-12-06 15:46:07 +00004127 //----------------------------------------------------------------------------
4128 //
4129 //----------------------------------------------------------------------------
4130 bool hasStaticArg = Args.hasArg(options::OPT_static);
4131 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004132 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004133 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4134 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4135 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4136 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004137
Matthew Curtise689b052012-12-06 15:46:07 +00004138 //----------------------------------------------------------------------------
4139 // Silence warnings for various options
4140 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004141
Matthew Curtise689b052012-12-06 15:46:07 +00004142 Args.ClaimAllArgs(options::OPT_g_Group);
4143 Args.ClaimAllArgs(options::OPT_emit_llvm);
4144 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4145 // handled somewhere else.
4146 Args.ClaimAllArgs(options::OPT_static_libgcc);
4147
4148 //----------------------------------------------------------------------------
4149 //
4150 //----------------------------------------------------------------------------
4151 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4152 e = ToolChain.ExtraOpts.end();
4153 i != e; ++i)
4154 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004155
Matthew Curtisf10a5952012-12-06 14:16:43 +00004156 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4157 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004158
Matthew Curtise689b052012-12-06 15:46:07 +00004159 if (buildingLib) {
4160 CmdArgs.push_back("-shared");
4161 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4162 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004163 }
4164
Matthew Curtise689b052012-12-06 15:46:07 +00004165 if (hasStaticArg)
4166 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004167
Matthew Curtise8f80a12012-12-06 17:49:03 +00004168 if (buildPIE && !buildingLib)
4169 CmdArgs.push_back("-pie");
4170
4171 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4172 if (!SmallDataThreshold.empty()) {
4173 CmdArgs.push_back(
4174 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4175 }
4176
Matthew Curtise689b052012-12-06 15:46:07 +00004177 //----------------------------------------------------------------------------
4178 //
4179 //----------------------------------------------------------------------------
4180 CmdArgs.push_back("-o");
4181 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004182
Matthew Curtise689b052012-12-06 15:46:07 +00004183 const std::string MarchSuffix = "/" + MarchString;
4184 const std::string G0Suffix = "/G0";
4185 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4186 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4187 + "/";
4188 const std::string StartFilesDir = RootDir
4189 + "hexagon/lib"
4190 + (buildingLib
4191 ? MarchG0Suffix : MarchSuffix);
4192
4193 //----------------------------------------------------------------------------
4194 // moslib
4195 //----------------------------------------------------------------------------
4196 std::vector<std::string> oslibs;
4197 bool hasStandalone= false;
4198
4199 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4200 ie = Args.filtered_end(); it != ie; ++it) {
4201 (*it)->claim();
4202 oslibs.push_back((*it)->getValue());
4203 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004204 }
Matthew Curtise689b052012-12-06 15:46:07 +00004205 if (oslibs.empty()) {
4206 oslibs.push_back("standalone");
4207 hasStandalone = true;
4208 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004209
Matthew Curtise689b052012-12-06 15:46:07 +00004210 //----------------------------------------------------------------------------
4211 // Start Files
4212 //----------------------------------------------------------------------------
4213 if (incStdLib && incStartFiles) {
4214
4215 if (!buildingLib) {
4216 if (hasStandalone) {
4217 CmdArgs.push_back(
4218 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4219 }
4220 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4221 }
4222 std::string initObj = useShared ? "/initS.o" : "/init.o";
4223 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4224 }
4225
4226 //----------------------------------------------------------------------------
4227 // Library Search Paths
4228 //----------------------------------------------------------------------------
4229 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4230 for (ToolChain::path_list::const_iterator
4231 i = LibPaths.begin(),
4232 e = LibPaths.end();
4233 i != e;
4234 ++i)
4235 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4236
4237 //----------------------------------------------------------------------------
4238 //
4239 //----------------------------------------------------------------------------
4240 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4241 Args.AddAllArgs(CmdArgs, options::OPT_e);
4242 Args.AddAllArgs(CmdArgs, options::OPT_s);
4243 Args.AddAllArgs(CmdArgs, options::OPT_t);
4244 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4245
4246 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4247
4248 //----------------------------------------------------------------------------
4249 // Libraries
4250 //----------------------------------------------------------------------------
4251 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004252 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004253 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4254 CmdArgs.push_back("-lm");
4255 }
4256
4257 CmdArgs.push_back("--start-group");
4258
4259 if (!buildingLib) {
4260 for(std::vector<std::string>::iterator i = oslibs.begin(),
4261 e = oslibs.end(); i != e; ++i)
4262 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4263 CmdArgs.push_back("-lc");
4264 }
4265 CmdArgs.push_back("-lgcc");
4266
4267 CmdArgs.push_back("--end-group");
4268 }
4269
4270 //----------------------------------------------------------------------------
4271 // End files
4272 //----------------------------------------------------------------------------
4273 if (incStdLib && incStartFiles) {
4274 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4275 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4276 }
4277
4278 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4279 C.addCommand(
4280 new Command(
4281 JA, *this,
4282 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004283}
4284// Hexagon tools end.
4285
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004286llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4287 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4288 // archs which Darwin doesn't use.
4289
4290 // The matching this routine does is fairly pointless, since it is neither the
4291 // complete architecture list, nor a reasonable subset. The problem is that
4292 // historically the driver driver accepts this and also ties its -march=
4293 // handling to the architecture name, so we need to be careful before removing
4294 // support for it.
4295
4296 // This code must be kept in sync with Clang's Darwin specific argument
4297 // translation.
4298
4299 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4300 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4301 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4302 .Case("ppc64", llvm::Triple::ppc64)
4303 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4304 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4305 llvm::Triple::x86)
4306 .Case("x86_64", llvm::Triple::x86_64)
4307 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004308 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4309 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4310 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004311 .Case("r600", llvm::Triple::r600)
4312 .Case("nvptx", llvm::Triple::nvptx)
4313 .Case("nvptx64", llvm::Triple::nvptx64)
4314 .Case("amdil", llvm::Triple::amdil)
4315 .Case("spir", llvm::Triple::spir)
4316 .Default(llvm::Triple::UnknownArch);
4317}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004318
Bob Wilsondecc03e2012-11-23 06:14:39 +00004319const char *Clang::getBaseInputName(const ArgList &Args,
4320 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004321 return Args.MakeArgString(
4322 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004323}
4324
Bob Wilsondecc03e2012-11-23 06:14:39 +00004325const char *Clang::getBaseInputStem(const ArgList &Args,
4326 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004327 const char *Str = getBaseInputName(Args, Inputs);
4328
Chris Lattner906bb902011-01-16 08:14:11 +00004329 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004330 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004331
4332 return Str;
4333}
4334
Bob Wilsondecc03e2012-11-23 06:14:39 +00004335const char *Clang::getDependencyFileName(const ArgList &Args,
4336 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004337 // FIXME: Think about this more.
4338 std::string Res;
4339
4340 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004341 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004342 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004343 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004344 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004345 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004346 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004347}
4348
Daniel Dunbarbe220842009-03-20 16:06:39 +00004349void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004350 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004351 const InputInfoList &Inputs,
4352 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004353 const char *LinkingOutput) const {
4354 ArgStringList CmdArgs;
4355
4356 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4357 const InputInfo &Input = Inputs[0];
4358
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004359 // Determine the original source input.
4360 const Action *SourceAction = &JA;
4361 while (SourceAction->getKind() != Action::InputClass) {
4362 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4363 SourceAction = SourceAction->getInputs()[0];
4364 }
4365
4366 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004367 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004368 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004369 if (Args.hasArg(options::OPT_gstabs))
4370 CmdArgs.push_back("--gstabs");
4371 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004372 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004373 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004374
Daniel Dunbarbe220842009-03-20 16:06:39 +00004375 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004376 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004377
Daniel Dunbar6d484762010-07-22 01:47:22 +00004378 // Use -force_cpusubtype_ALL on x86 by default.
4379 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4380 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004381 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4382 CmdArgs.push_back("-force_cpusubtype_ALL");
4383
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004384 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004385 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004386 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004387 (!getDarwinToolChain().isTargetIPhoneOS() ||
4388 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4389 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004390 CmdArgs.push_back("-static");
4391
Daniel Dunbarbe220842009-03-20 16:06:39 +00004392 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4393 options::OPT_Xassembler);
4394
4395 assert(Output.isFilename() && "Unexpected lipo output.");
4396 CmdArgs.push_back("-o");
4397 CmdArgs.push_back(Output.getFilename());
4398
Daniel Dunbarb440f562010-08-02 02:38:21 +00004399 assert(Input.isFilename() && "Invalid input.");
4400 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004401
4402 // asm_final spec is empty.
4403
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004404 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004405 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004406 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004407}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004408
David Blaikie68e081d2011-12-20 02:48:34 +00004409void darwin::DarwinTool::anchor() {}
4410
Daniel Dunbare9ded432009-09-09 18:36:20 +00004411void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4412 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004413 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004414
Daniel Dunbarc1964212009-03-26 16:23:12 +00004415 // Derived from darwin_arch spec.
4416 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004417 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004418
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004419 // FIXME: Is this needed anymore?
4420 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004421 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004422}
4423
Bill Wendling3b2000f2012-10-02 18:02:50 +00004424bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4425 // We only need to generate a temp path for LTO if we aren't compiling object
4426 // files. When compiling source files, we run 'dsymutil' after linking. We
4427 // don't run 'dsymutil' when compiling object files.
4428 for (InputInfoList::const_iterator
4429 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4430 if (it->getType() != types::TY_Object)
4431 return true;
4432
4433 return false;
4434}
4435
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004436void darwin::Link::AddLinkArgs(Compilation &C,
4437 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004438 ArgStringList &CmdArgs,
4439 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004440 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004441 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004442
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004443 unsigned Version[3] = { 0, 0, 0 };
4444 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4445 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004446 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004447 Version[1], Version[2], HadExtra) ||
4448 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004449 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004450 << A->getAsString(Args);
4451 }
4452
4453 // Newer linkers support -demangle, pass it if supported and not disabled by
4454 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004455 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004456 // Don't pass -demangle to ld_classic.
4457 //
4458 // FIXME: This is a temporary workaround, ld should be handling this.
4459 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4460 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004461 if (getToolChain().getArch() == llvm::Triple::x86) {
4462 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4463 options::OPT_Wl_COMMA),
4464 ie = Args.filtered_end(); it != ie; ++it) {
4465 const Arg *A = *it;
4466 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004467 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004468 UsesLdClassic = true;
4469 }
4470 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004471 if (!UsesLdClassic)
4472 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004473 }
4474
Bill Wendling313b6bf2012-11-16 23:03:00 +00004475 // If we are using LTO, then automatically create a temporary file path for
4476 // the linker to use, so that it's lifetime will extend past a possible
4477 // dsymutil step.
4478 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4479 const char *TmpPath = C.getArgs().MakeArgString(
4480 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4481 C.addTempFile(TmpPath);
4482 CmdArgs.push_back("-object_path_lto");
4483 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004484 }
4485
Daniel Dunbarc1964212009-03-26 16:23:12 +00004486 // Derived from the "link" spec.
4487 Args.AddAllArgs(CmdArgs, options::OPT_static);
4488 if (!Args.hasArg(options::OPT_static))
4489 CmdArgs.push_back("-dynamic");
4490 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4491 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4492 // here. How do we wish to handle such things?
4493 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004494
Daniel Dunbarc1964212009-03-26 16:23:12 +00004495 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004496 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004497 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004498 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004499
4500 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4501 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4502 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4503
4504 Arg *A;
4505 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4506 (A = Args.getLastArg(options::OPT_current__version)) ||
4507 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004508 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004509 << A->getAsString(Args) << "-dynamiclib";
4510
4511 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4512 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4513 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4514 } else {
4515 CmdArgs.push_back("-dylib");
4516
4517 Arg *A;
4518 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4519 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4520 (A = Args.getLastArg(options::OPT_client__name)) ||
4521 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4522 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4523 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004524 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004525 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004526
Daniel Dunbarc1964212009-03-26 16:23:12 +00004527 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4528 "-dylib_compatibility_version");
4529 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4530 "-dylib_current_version");
4531
Daniel Dunbara48823f2010-01-22 02:04:52 +00004532 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004533
4534 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4535 "-dylib_install_name");
4536 }
4537
4538 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4539 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4540 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004541 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004542 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004543 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4544 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4545 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4546 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4547 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4548 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004549 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004550 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4551 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4552 Args.AddAllArgs(CmdArgs, options::OPT_init);
4553
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004554 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004555 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004556
4557 // If we had an explicit -mios-simulator-version-min argument, honor that,
4558 // otherwise use the traditional deployment targets. We can't just check the
4559 // is-sim attribute because existing code follows this path, and the linker
4560 // may not handle the argument.
4561 //
4562 // FIXME: We may be able to remove this, once we can verify no one depends on
4563 // it.
4564 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4565 CmdArgs.push_back("-ios_simulator_version_min");
4566 else if (DarwinTC.isTargetIPhoneOS())
4567 CmdArgs.push_back("-iphoneos_version_min");
4568 else
4569 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004570 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004571
Daniel Dunbarc1964212009-03-26 16:23:12 +00004572 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4573 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4574 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4575 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4576 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004577
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004578 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4579 options::OPT_fno_pie,
4580 options::OPT_fno_PIE)) {
4581 if (A->getOption().matches(options::OPT_fpie) ||
4582 A->getOption().matches(options::OPT_fPIE))
4583 CmdArgs.push_back("-pie");
4584 else
4585 CmdArgs.push_back("-no_pie");
4586 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004587
4588 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4589 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4590 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4591 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4592 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4593 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4594 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4595 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4596 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4597 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4598 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4599 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4600 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4601 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4602 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4603 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004604
Daniel Dunbar84384642011-05-02 21:03:47 +00004605 // Give --sysroot= preference, over the Apple specific behavior to also use
4606 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004607 StringRef sysroot = C.getSysRoot();
4608 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004609 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004610 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004611 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4612 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004613 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004614 }
4615
Daniel Dunbarc1964212009-03-26 16:23:12 +00004616 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4617 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4618 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4619 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4620 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004621 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004622 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4623 Args.AddAllArgs(CmdArgs, options::OPT_y);
4624 Args.AddLastArg(CmdArgs, options::OPT_w);
4625 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4626 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4627 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4628 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4629 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4630 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4631 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4632 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4633 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4634 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4635 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4636 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4637}
4638
4639void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004640 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004641 const InputInfoList &Inputs,
4642 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004643 const char *LinkingOutput) const {
4644 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004645
Daniel Dunbarc1964212009-03-26 16:23:12 +00004646 // The logic here is derived from gcc's behavior; most of which
4647 // comes from specs (starting with link_command). Consult gcc for
4648 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004649 ArgStringList CmdArgs;
4650
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004651 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4652 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4653 options::OPT_ccc_arcmt_migrate)) {
4654 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4655 (*I)->claim();
4656 const char *Exec =
4657 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4658 CmdArgs.push_back(Output.getFilename());
4659 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4660 return;
4661 }
4662
Daniel Dunbarc1964212009-03-26 16:23:12 +00004663 // I'm not sure why this particular decomposition exists in gcc, but
4664 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004665 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004666
Daniel Dunbarc1964212009-03-26 16:23:12 +00004667 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4668 Args.AddAllArgs(CmdArgs, options::OPT_s);
4669 Args.AddAllArgs(CmdArgs, options::OPT_t);
4670 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4671 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004672 Args.AddLastArg(CmdArgs, options::OPT_e);
4673 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4674 Args.AddAllArgs(CmdArgs, options::OPT_r);
4675
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004676 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4677 // members of static archive libraries which implement Objective-C classes or
4678 // categories.
4679 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4680 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004681
Bill Wendling58979742012-12-10 21:48:41 +00004682 if (Args.hasArg(options::OPT_rdynamic))
4683 CmdArgs.push_back("-export_dynamic");
4684
Daniel Dunbarc1964212009-03-26 16:23:12 +00004685 CmdArgs.push_back("-o");
4686 CmdArgs.push_back(Output.getFilename());
4687
Chad Rosier06fd3c62012-05-16 23:45:12 +00004688 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004689 !Args.hasArg(options::OPT_nostartfiles)) {
4690 // Derived from startfile spec.
4691 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004692 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004693 if (getDarwinToolChain().isTargetIOSSimulator()) {
4694 // The simulator doesn't have a versioned crt1 file.
4695 CmdArgs.push_back("-ldylib1.o");
4696 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004697 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4698 CmdArgs.push_back("-ldylib1.o");
4699 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004700 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004701 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004702 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004703 CmdArgs.push_back("-ldylib1.10.5.o");
4704 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004705 } else {
4706 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004707 if (!Args.hasArg(options::OPT_static)) {
4708 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004709 if (getDarwinToolChain().isTargetIOSSimulator()) {
4710 // The simulator doesn't have a versioned crt1 file.
4711 CmdArgs.push_back("-lbundle1.o");
4712 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004713 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4714 CmdArgs.push_back("-lbundle1.o");
4715 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004716 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004717 CmdArgs.push_back("-lbundle1.o");
4718 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004719 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004720 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004721 if (Args.hasArg(options::OPT_pg) &&
4722 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004723 if (Args.hasArg(options::OPT_static) ||
4724 Args.hasArg(options::OPT_object) ||
4725 Args.hasArg(options::OPT_preload)) {
4726 CmdArgs.push_back("-lgcrt0.o");
4727 } else {
4728 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004729
Daniel Dunbarc1964212009-03-26 16:23:12 +00004730 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004731 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004732 // By default on OS X 10.8 and later, we don't link with a crt1.o
4733 // file and the linker knows to use _main as the entry point. But,
4734 // when compiling with -pg, we need to link with the gcrt1.o file,
4735 // so pass the -no_new_main option to tell the linker to use the
4736 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004737 if (getDarwinToolChain().isTargetMacOS() &&
4738 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4739 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004740 } else {
4741 if (Args.hasArg(options::OPT_static) ||
4742 Args.hasArg(options::OPT_object) ||
4743 Args.hasArg(options::OPT_preload)) {
4744 CmdArgs.push_back("-lcrt0.o");
4745 } else {
4746 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004747 if (getDarwinToolChain().isTargetIOSSimulator()) {
4748 // The simulator doesn't have a versioned crt1 file.
4749 CmdArgs.push_back("-lcrt1.o");
4750 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004751 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4752 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004753 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004754 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004755 } else {
4756 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4757 CmdArgs.push_back("-lcrt1.o");
4758 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4759 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004760 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004761 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004762
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004763 // darwin_crt2 spec is empty.
4764 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004765 }
4766 }
4767 }
4768 }
4769
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004770 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4771 Args.hasArg(options::OPT_shared_libgcc) &&
4772 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004773 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004774 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004775 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004776 }
4777 }
4778
4779 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004780
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004781 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004782 // If we're building a dynamic lib with -fsanitize=address,
4783 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004784 // of them as dynamic_lookup. Linking executables is handled in
4785 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004786 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004787 if (Args.hasArg(options::OPT_dynamiclib) ||
4788 Args.hasArg(options::OPT_bundle)) {
4789 CmdArgs.push_back("-undefined");
4790 CmdArgs.push_back("dynamic_lookup");
4791 }
4792 }
4793
Daniel Dunbarc1964212009-03-26 16:23:12 +00004794 if (Args.hasArg(options::OPT_fopenmp))
4795 // This is more complicated in gcc...
4796 CmdArgs.push_back("-lgomp");
4797
Douglas Gregor9295df02012-05-15 21:00:27 +00004798 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4799
Bob Wilson16d93952012-05-15 18:57:39 +00004800 if (isObjCRuntimeLinked(Args) &&
4801 !Args.hasArg(options::OPT_nostdlib) &&
4802 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004803 // Avoid linking compatibility stubs on i386 mac.
4804 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004805 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004806 // If we don't have ARC or subscripting runtime support, link in the
4807 // runtime stubs. We have to do this *before* adding any of the normal
4808 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004809 ObjCRuntime runtime =
4810 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004811 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004812 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004813 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004814 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004815 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004816 CmdArgs.push_back("-framework");
4817 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004818 // Link libobj.
4819 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004820 }
John McCall31168b02011-06-15 23:02:42 +00004821
Daniel Dunbarc1964212009-03-26 16:23:12 +00004822 if (LinkingOutput) {
4823 CmdArgs.push_back("-arch_multiple");
4824 CmdArgs.push_back("-final_output");
4825 CmdArgs.push_back(LinkingOutput);
4826 }
4827
Daniel Dunbarc1964212009-03-26 16:23:12 +00004828 if (Args.hasArg(options::OPT_fnested_functions))
4829 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004830
Daniel Dunbarc1964212009-03-26 16:23:12 +00004831 if (!Args.hasArg(options::OPT_nostdlib) &&
4832 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004833 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004834 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004835
Daniel Dunbarc1964212009-03-26 16:23:12 +00004836 // link_ssp spec is empty.
4837
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004838 // Let the tool chain choose which runtime library to link.
4839 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004840 }
4841
Chad Rosier06fd3c62012-05-16 23:45:12 +00004842 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004843 !Args.hasArg(options::OPT_nostartfiles)) {
4844 // endfile_spec is empty.
4845 }
4846
4847 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4848 Args.AddAllArgs(CmdArgs, options::OPT_F);
4849
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004850 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004851 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004852 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004853}
4854
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004855void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004856 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004857 const InputInfoList &Inputs,
4858 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004859 const char *LinkingOutput) const {
4860 ArgStringList CmdArgs;
4861
4862 CmdArgs.push_back("-create");
4863 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004864
4865 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004866 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004867
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004868 for (InputInfoList::const_iterator
4869 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4870 const InputInfo &II = *it;
4871 assert(II.isFilename() && "Unexpected lipo input.");
4872 CmdArgs.push_back(II.getFilename());
4873 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004874 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004875 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004876 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004877}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004878
Daniel Dunbar88299622010-06-04 18:28:36 +00004879void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004880 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004881 const InputInfoList &Inputs,
4882 const ArgList &Args,
4883 const char *LinkingOutput) const {
4884 ArgStringList CmdArgs;
4885
Daniel Dunbareb86b042011-05-09 17:23:16 +00004886 CmdArgs.push_back("-o");
4887 CmdArgs.push_back(Output.getFilename());
4888
Daniel Dunbar88299622010-06-04 18:28:36 +00004889 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4890 const InputInfo &Input = Inputs[0];
4891 assert(Input.isFilename() && "Unexpected dsymutil input.");
4892 CmdArgs.push_back(Input.getFilename());
4893
Daniel Dunbar88299622010-06-04 18:28:36 +00004894 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004895 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004896 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004897}
4898
Eric Christopher551ef452011-08-23 17:56:55 +00004899void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004900 const InputInfo &Output,
4901 const InputInfoList &Inputs,
4902 const ArgList &Args,
4903 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004904 ArgStringList CmdArgs;
4905 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004906 CmdArgs.push_back("--debug-info");
4907 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004908 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004909
4910 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4911 const InputInfo &Input = Inputs[0];
4912 assert(Input.isFilename() && "Unexpected verify input");
4913
4914 // Grabbing the output of the earlier dsymutil run.
4915 CmdArgs.push_back(Input.getFilename());
4916
4917 const char *Exec =
4918 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4919 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4920}
4921
David Chisnallf571cde2012-02-15 13:39:01 +00004922void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4923 const InputInfo &Output,
4924 const InputInfoList &Inputs,
4925 const ArgList &Args,
4926 const char *LinkingOutput) const {
4927 ArgStringList CmdArgs;
4928
4929 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4930 options::OPT_Xassembler);
4931
4932 CmdArgs.push_back("-o");
4933 CmdArgs.push_back(Output.getFilename());
4934
4935 for (InputInfoList::const_iterator
4936 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4937 const InputInfo &II = *it;
4938 CmdArgs.push_back(II.getFilename());
4939 }
4940
4941 const char *Exec =
4942 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4943 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4944}
4945
4946
4947void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4948 const InputInfo &Output,
4949 const InputInfoList &Inputs,
4950 const ArgList &Args,
4951 const char *LinkingOutput) const {
4952 // FIXME: Find a real GCC, don't hard-code versions here
4953 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4954 const llvm::Triple &T = getToolChain().getTriple();
4955 std::string LibPath = "/usr/lib/";
4956 llvm::Triple::ArchType Arch = T.getArch();
4957 switch (Arch) {
4958 case llvm::Triple::x86:
4959 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4960 T.getOSName()).str() + "/4.5.2/";
4961 break;
4962 case llvm::Triple::x86_64:
4963 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4964 T.getOSName()).str();
4965 GCCLibPath += "/4.5.2/amd64/";
4966 LibPath += "amd64/";
4967 break;
4968 default:
4969 assert(0 && "Unsupported architecture");
4970 }
4971
4972 ArgStringList CmdArgs;
4973
David Chisnall272a0712012-02-29 15:06:12 +00004974 // Demangle C++ names in errors
4975 CmdArgs.push_back("-C");
4976
David Chisnallf571cde2012-02-15 13:39:01 +00004977 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4978 (!Args.hasArg(options::OPT_shared))) {
4979 CmdArgs.push_back("-e");
4980 CmdArgs.push_back("_start");
4981 }
4982
4983 if (Args.hasArg(options::OPT_static)) {
4984 CmdArgs.push_back("-Bstatic");
4985 CmdArgs.push_back("-dn");
4986 } else {
4987 CmdArgs.push_back("-Bdynamic");
4988 if (Args.hasArg(options::OPT_shared)) {
4989 CmdArgs.push_back("-shared");
4990 } else {
4991 CmdArgs.push_back("--dynamic-linker");
4992 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4993 }
4994 }
4995
4996 if (Output.isFilename()) {
4997 CmdArgs.push_back("-o");
4998 CmdArgs.push_back(Output.getFilename());
4999 } else {
5000 assert(Output.isNothing() && "Invalid output.");
5001 }
5002
5003 if (!Args.hasArg(options::OPT_nostdlib) &&
5004 !Args.hasArg(options::OPT_nostartfiles)) {
5005 if (!Args.hasArg(options::OPT_shared)) {
5006 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5007 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005008 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005009 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5010 } else {
5011 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005012 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5013 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005014 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005015 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005016 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005017 }
5018
5019 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5020
5021 Args.AddAllArgs(CmdArgs, options::OPT_L);
5022 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5023 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005024 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005025
5026 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5027
5028 if (!Args.hasArg(options::OPT_nostdlib) &&
5029 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005030 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005031 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005032 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005033 if (!Args.hasArg(options::OPT_shared)) {
5034 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005035 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005036 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005037 }
David Chisnallf571cde2012-02-15 13:39:01 +00005038 }
5039
5040 if (!Args.hasArg(options::OPT_nostdlib) &&
5041 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005042 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005043 }
David Chisnall96de9932012-02-16 16:00:47 +00005044 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005045
5046 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5047
5048 const char *Exec =
5049 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5050 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5051}
5052
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005053void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005054 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005055 const InputInfoList &Inputs,
5056 const ArgList &Args,
5057 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005058 ArgStringList CmdArgs;
5059
5060 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5061 options::OPT_Xassembler);
5062
5063 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005064 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005065
5066 for (InputInfoList::const_iterator
5067 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5068 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005069 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005070 }
5071
5072 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005073 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005074 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005075}
5076
5077void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005078 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005079 const InputInfoList &Inputs,
5080 const ArgList &Args,
5081 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005082 ArgStringList CmdArgs;
5083
5084 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005085 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005086 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005087 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005088 }
5089
5090 if (Args.hasArg(options::OPT_static)) {
5091 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005092 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005093 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005094// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005095 CmdArgs.push_back("-Bdynamic");
5096 if (Args.hasArg(options::OPT_shared)) {
5097 CmdArgs.push_back("-shared");
5098 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005099 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005100 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5101 }
5102 }
5103
Daniel Dunbarb440f562010-08-02 02:38:21 +00005104 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005105 CmdArgs.push_back("-o");
5106 CmdArgs.push_back(Output.getFilename());
5107 } else {
5108 assert(Output.isNothing() && "Invalid output.");
5109 }
5110
5111 if (!Args.hasArg(options::OPT_nostdlib) &&
5112 !Args.hasArg(options::OPT_nostartfiles)) {
5113 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005114 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005115 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005116 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005117 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005118 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005119 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005120 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005121 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005122 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005123 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005124 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005125 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005126 }
5127
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005128 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5129 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005130 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005131
5132 Args.AddAllArgs(CmdArgs, options::OPT_L);
5133 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5134 Args.AddAllArgs(CmdArgs, options::OPT_e);
5135
Daniel Dunbar54423b22010-09-17 00:24:54 +00005136 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005137
5138 if (!Args.hasArg(options::OPT_nostdlib) &&
5139 !Args.hasArg(options::OPT_nodefaultlibs)) {
5140 // FIXME: For some reason GCC passes -lgcc before adding
5141 // the default system libraries. Just mimic this for now.
5142 CmdArgs.push_back("-lgcc");
5143
5144 if (Args.hasArg(options::OPT_pthread))
5145 CmdArgs.push_back("-pthread");
5146 if (!Args.hasArg(options::OPT_shared))
5147 CmdArgs.push_back("-lc");
5148 CmdArgs.push_back("-lgcc");
5149 }
5150
5151 if (!Args.hasArg(options::OPT_nostdlib) &&
5152 !Args.hasArg(options::OPT_nostartfiles)) {
5153 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005154 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005155 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005156 }
5157
Bill Wendling08760582011-06-27 19:15:03 +00005158 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005159
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005160 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005161 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005162 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005163}
5164
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005165void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005166 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005167 const InputInfoList &Inputs,
5168 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005169 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005170 ArgStringList CmdArgs;
5171
5172 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5173 options::OPT_Xassembler);
5174
5175 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005176 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005177
5178 for (InputInfoList::const_iterator
5179 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5180 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005181 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005182 }
5183
5184 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005185 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005186 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005187}
5188
5189void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005190 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005191 const InputInfoList &Inputs,
5192 const ArgList &Args,
5193 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005194 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005195 ArgStringList CmdArgs;
5196
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005197 // Silence warning for "clang -g foo.o -o foo"
5198 Args.ClaimAllArgs(options::OPT_g_Group);
5199 // and "clang -emit-llvm foo.o -o foo"
5200 Args.ClaimAllArgs(options::OPT_emit_llvm);
5201 // and for "clang -w foo.o -o foo". Other warning options are already
5202 // handled somewhere else.
5203 Args.ClaimAllArgs(options::OPT_w);
5204
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005205 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005206 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005207 CmdArgs.push_back("-e");
5208 CmdArgs.push_back("__start");
5209 }
5210
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005211 if (Args.hasArg(options::OPT_static)) {
5212 CmdArgs.push_back("-Bstatic");
5213 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005214 if (Args.hasArg(options::OPT_rdynamic))
5215 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005216 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005217 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005218 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005219 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005220 } else {
5221 CmdArgs.push_back("-dynamic-linker");
5222 CmdArgs.push_back("/usr/libexec/ld.so");
5223 }
5224 }
5225
Rafael Espindola044f7832013-06-05 04:28:55 +00005226 if (Args.hasArg(options::OPT_nopie))
5227 CmdArgs.push_back("-nopie");
5228
Daniel Dunbarb440f562010-08-02 02:38:21 +00005229 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005230 CmdArgs.push_back("-o");
5231 CmdArgs.push_back(Output.getFilename());
5232 } else {
5233 assert(Output.isNothing() && "Invalid output.");
5234 }
5235
5236 if (!Args.hasArg(options::OPT_nostdlib) &&
5237 !Args.hasArg(options::OPT_nostartfiles)) {
5238 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005239 if (Args.hasArg(options::OPT_pg))
5240 CmdArgs.push_back(Args.MakeArgString(
5241 getToolChain().GetFilePath("gcrt0.o")));
5242 else
5243 CmdArgs.push_back(Args.MakeArgString(
5244 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005245 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005246 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005247 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005248 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005249 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005250 }
5251 }
5252
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005253 std::string Triple = getToolChain().getTripleString();
5254 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005255 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005256 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005257 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005258
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005259 Args.AddAllArgs(CmdArgs, options::OPT_L);
5260 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5261 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005262 Args.AddAllArgs(CmdArgs, options::OPT_s);
5263 Args.AddAllArgs(CmdArgs, options::OPT_t);
5264 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5265 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005266
Daniel Dunbar54423b22010-09-17 00:24:54 +00005267 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005268
5269 if (!Args.hasArg(options::OPT_nostdlib) &&
5270 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005271 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005272 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005273 if (Args.hasArg(options::OPT_pg))
5274 CmdArgs.push_back("-lm_p");
5275 else
5276 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005277 }
5278
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005279 // FIXME: For some reason GCC passes -lgcc before adding
5280 // the default system libraries. Just mimic this for now.
5281 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005282
Eric Christopher17674ec2012-09-13 06:32:34 +00005283 if (Args.hasArg(options::OPT_pthread)) {
5284 if (!Args.hasArg(options::OPT_shared) &&
5285 Args.hasArg(options::OPT_pg))
5286 CmdArgs.push_back("-lpthread_p");
5287 else
5288 CmdArgs.push_back("-lpthread");
5289 }
5290
Chandler Carruth45661652011-12-17 22:32:42 +00005291 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005292 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005293 CmdArgs.push_back("-lc_p");
5294 else
5295 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005296 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005297
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005298 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005299 }
5300
5301 if (!Args.hasArg(options::OPT_nostdlib) &&
5302 !Args.hasArg(options::OPT_nostartfiles)) {
5303 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005304 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005305 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005306 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005307 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005308 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005309 }
5310
5311 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005312 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005313 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005314}
Ed Schoutene33194b2009-04-02 19:13:12 +00005315
Eli Friedman9fa28852012-08-08 23:57:20 +00005316void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5317 const InputInfo &Output,
5318 const InputInfoList &Inputs,
5319 const ArgList &Args,
5320 const char *LinkingOutput) const {
5321 ArgStringList CmdArgs;
5322
5323 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5324 options::OPT_Xassembler);
5325
5326 CmdArgs.push_back("-o");
5327 CmdArgs.push_back(Output.getFilename());
5328
5329 for (InputInfoList::const_iterator
5330 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5331 const InputInfo &II = *it;
5332 CmdArgs.push_back(II.getFilename());
5333 }
5334
5335 const char *Exec =
5336 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5337 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5338}
5339
5340void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5341 const InputInfo &Output,
5342 const InputInfoList &Inputs,
5343 const ArgList &Args,
5344 const char *LinkingOutput) const {
5345 const Driver &D = getToolChain().getDriver();
5346 ArgStringList CmdArgs;
5347
5348 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5349 (!Args.hasArg(options::OPT_shared))) {
5350 CmdArgs.push_back("-e");
5351 CmdArgs.push_back("__start");
5352 }
5353
5354 if (Args.hasArg(options::OPT_static)) {
5355 CmdArgs.push_back("-Bstatic");
5356 } else {
5357 if (Args.hasArg(options::OPT_rdynamic))
5358 CmdArgs.push_back("-export-dynamic");
5359 CmdArgs.push_back("--eh-frame-hdr");
5360 CmdArgs.push_back("-Bdynamic");
5361 if (Args.hasArg(options::OPT_shared)) {
5362 CmdArgs.push_back("-shared");
5363 } else {
5364 CmdArgs.push_back("-dynamic-linker");
5365 CmdArgs.push_back("/usr/libexec/ld.so");
5366 }
5367 }
5368
5369 if (Output.isFilename()) {
5370 CmdArgs.push_back("-o");
5371 CmdArgs.push_back(Output.getFilename());
5372 } else {
5373 assert(Output.isNothing() && "Invalid output.");
5374 }
5375
5376 if (!Args.hasArg(options::OPT_nostdlib) &&
5377 !Args.hasArg(options::OPT_nostartfiles)) {
5378 if (!Args.hasArg(options::OPT_shared)) {
5379 if (Args.hasArg(options::OPT_pg))
5380 CmdArgs.push_back(Args.MakeArgString(
5381 getToolChain().GetFilePath("gcrt0.o")));
5382 else
5383 CmdArgs.push_back(Args.MakeArgString(
5384 getToolChain().GetFilePath("crt0.o")));
5385 CmdArgs.push_back(Args.MakeArgString(
5386 getToolChain().GetFilePath("crtbegin.o")));
5387 } else {
5388 CmdArgs.push_back(Args.MakeArgString(
5389 getToolChain().GetFilePath("crtbeginS.o")));
5390 }
5391 }
5392
5393 Args.AddAllArgs(CmdArgs, options::OPT_L);
5394 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5395 Args.AddAllArgs(CmdArgs, options::OPT_e);
5396
5397 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5398
5399 if (!Args.hasArg(options::OPT_nostdlib) &&
5400 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005401 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00005402 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5403 if (Args.hasArg(options::OPT_pg))
5404 CmdArgs.push_back("-lm_p");
5405 else
5406 CmdArgs.push_back("-lm");
5407 }
5408
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005409 if (Args.hasArg(options::OPT_pthread)) {
5410 if (!Args.hasArg(options::OPT_shared) &&
5411 Args.hasArg(options::OPT_pg))
5412 CmdArgs.push_back("-lpthread_p");
5413 else
5414 CmdArgs.push_back("-lpthread");
5415 }
5416
Eli Friedman9fa28852012-08-08 23:57:20 +00005417 if (!Args.hasArg(options::OPT_shared)) {
5418 if (Args.hasArg(options::OPT_pg))
5419 CmdArgs.push_back("-lc_p");
5420 else
5421 CmdArgs.push_back("-lc");
5422 }
5423
5424 std::string myarch = "-lclang_rt.";
5425 const llvm::Triple &T = getToolChain().getTriple();
5426 llvm::Triple::ArchType Arch = T.getArch();
5427 switch (Arch) {
5428 case llvm::Triple::arm:
5429 myarch += ("arm");
5430 break;
5431 case llvm::Triple::x86:
5432 myarch += ("i386");
5433 break;
5434 case llvm::Triple::x86_64:
5435 myarch += ("amd64");
5436 break;
5437 default:
5438 assert(0 && "Unsupported architecture");
5439 }
5440 CmdArgs.push_back(Args.MakeArgString(myarch));
5441 }
5442
5443 if (!Args.hasArg(options::OPT_nostdlib) &&
5444 !Args.hasArg(options::OPT_nostartfiles)) {
5445 if (!Args.hasArg(options::OPT_shared))
5446 CmdArgs.push_back(Args.MakeArgString(
5447 getToolChain().GetFilePath("crtend.o")));
5448 else
5449 CmdArgs.push_back(Args.MakeArgString(
5450 getToolChain().GetFilePath("crtendS.o")));
5451 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005452
5453 const char *Exec =
5454 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5455 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005456}
5457
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005458void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005459 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005460 const InputInfoList &Inputs,
5461 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005462 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005463 ArgStringList CmdArgs;
5464
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005465 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5466 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005467 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005468 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005469 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005470 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005471 else if (getToolChain().getArch() == llvm::Triple::mips ||
5472 getToolChain().getArch() == llvm::Triple::mipsel ||
5473 getToolChain().getArch() == llvm::Triple::mips64 ||
5474 getToolChain().getArch() == llvm::Triple::mips64el) {
5475 StringRef CPUName;
5476 StringRef ABIName;
5477 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005478
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005479 CmdArgs.push_back("-march");
5480 CmdArgs.push_back(CPUName.data());
5481
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005482 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005483 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005484
5485 if (getToolChain().getArch() == llvm::Triple::mips ||
5486 getToolChain().getArch() == llvm::Triple::mips64)
5487 CmdArgs.push_back("-EB");
5488 else
5489 CmdArgs.push_back("-EL");
5490
5491 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5492 options::OPT_fpic, options::OPT_fno_pic,
5493 options::OPT_fPIE, options::OPT_fno_PIE,
5494 options::OPT_fpie, options::OPT_fno_pie);
5495 if (LastPICArg &&
5496 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5497 LastPICArg->getOption().matches(options::OPT_fpic) ||
5498 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5499 LastPICArg->getOption().matches(options::OPT_fpie))) {
5500 CmdArgs.push_back("-KPIC");
5501 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005502 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5503 getToolChain().getArch() == llvm::Triple::thumb) {
5504 CmdArgs.push_back("-mfpu=softvfp");
5505 switch(getToolChain().getTriple().getEnvironment()) {
5506 case llvm::Triple::GNUEABI:
5507 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005508 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005509 break;
5510
5511 default:
5512 CmdArgs.push_back("-matpcs");
5513 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005514 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005515
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005516 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5517 options::OPT_Xassembler);
5518
5519 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005520 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005521
5522 for (InputInfoList::const_iterator
5523 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5524 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005525 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005526 }
5527
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005528 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005529 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005530 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005531}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005532
5533void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005534 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005535 const InputInfoList &Inputs,
5536 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005537 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005538 const toolchains::FreeBSD& ToolChain =
5539 static_cast<const toolchains::FreeBSD&>(getToolChain());
5540 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005541 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005542
5543 // Silence warning for "clang -g foo.o -o foo"
5544 Args.ClaimAllArgs(options::OPT_g_Group);
5545 // and "clang -emit-llvm foo.o -o foo"
5546 Args.ClaimAllArgs(options::OPT_emit_llvm);
5547 // and for "clang -w foo.o -o foo". Other warning options are already
5548 // handled somewhere else.
5549 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005550
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005551 if (!D.SysRoot.empty())
5552 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5553
Roman Divackyafe2f232012-08-28 15:09:03 +00005554 if (Args.hasArg(options::OPT_pie))
5555 CmdArgs.push_back("-pie");
5556
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005557 if (Args.hasArg(options::OPT_static)) {
5558 CmdArgs.push_back("-Bstatic");
5559 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005560 if (Args.hasArg(options::OPT_rdynamic))
5561 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005562 CmdArgs.push_back("--eh-frame-hdr");
5563 if (Args.hasArg(options::OPT_shared)) {
5564 CmdArgs.push_back("-Bshareable");
5565 } else {
5566 CmdArgs.push_back("-dynamic-linker");
5567 CmdArgs.push_back("/libexec/ld-elf.so.1");
5568 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005569 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5570 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005571 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5572 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5573 CmdArgs.push_back("--hash-style=both");
5574 }
5575 }
5576 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005577 }
5578
5579 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5580 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005581 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005582 CmdArgs.push_back("-m");
5583 CmdArgs.push_back("elf_i386_fbsd");
5584 }
5585
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005586 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005587 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005588 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005589 }
5590
Daniel Dunbarb440f562010-08-02 02:38:21 +00005591 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005592 CmdArgs.push_back("-o");
5593 CmdArgs.push_back(Output.getFilename());
5594 } else {
5595 assert(Output.isNothing() && "Invalid output.");
5596 }
5597
5598 if (!Args.hasArg(options::OPT_nostdlib) &&
5599 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005600 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005601 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005602 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005603 crt1 = "gcrt1.o";
5604 else if (Args.hasArg(options::OPT_pie))
5605 crt1 = "Scrt1.o";
5606 else
5607 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005608 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005609 if (crt1)
5610 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5611
5612 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5613
5614 const char *crtbegin = NULL;
5615 if (Args.hasArg(options::OPT_static))
5616 crtbegin = "crtbeginT.o";
5617 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5618 crtbegin = "crtbeginS.o";
5619 else
5620 crtbegin = "crtbegin.o";
5621
5622 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005623 }
5624
5625 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005626 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005627 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5628 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005629 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005630 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5631 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005632 Args.AddAllArgs(CmdArgs, options::OPT_s);
5633 Args.AddAllArgs(CmdArgs, options::OPT_t);
5634 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5635 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005636
Roman Divackyafe2f232012-08-28 15:09:03 +00005637 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005638
5639 if (!Args.hasArg(options::OPT_nostdlib) &&
5640 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005641 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005642 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005643 if (Args.hasArg(options::OPT_pg))
5644 CmdArgs.push_back("-lm_p");
5645 else
5646 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005647 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005648 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5649 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005650 if (Args.hasArg(options::OPT_pg))
5651 CmdArgs.push_back("-lgcc_p");
5652 else
5653 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005654 if (Args.hasArg(options::OPT_static)) {
5655 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005656 } else if (Args.hasArg(options::OPT_pg)) {
5657 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005658 } else {
5659 CmdArgs.push_back("--as-needed");
5660 CmdArgs.push_back("-lgcc_s");
5661 CmdArgs.push_back("--no-as-needed");
5662 }
5663
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005664 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005665 if (Args.hasArg(options::OPT_pg))
5666 CmdArgs.push_back("-lpthread_p");
5667 else
5668 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005669 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005670
Roman Divacky66f22762011-02-10 16:59:40 +00005671 if (Args.hasArg(options::OPT_pg)) {
5672 if (Args.hasArg(options::OPT_shared))
5673 CmdArgs.push_back("-lc");
5674 else
5675 CmdArgs.push_back("-lc_p");
5676 CmdArgs.push_back("-lgcc_p");
5677 } else {
5678 CmdArgs.push_back("-lc");
5679 CmdArgs.push_back("-lgcc");
5680 }
5681
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005682 if (Args.hasArg(options::OPT_static)) {
5683 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005684 } else if (Args.hasArg(options::OPT_pg)) {
5685 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005686 } else {
5687 CmdArgs.push_back("--as-needed");
5688 CmdArgs.push_back("-lgcc_s");
5689 CmdArgs.push_back("--no-as-needed");
5690 }
5691 }
5692
5693 if (!Args.hasArg(options::OPT_nostdlib) &&
5694 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005695 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005696 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005697 else
5698 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005699 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005700 }
5701
Roman Divackyafe2f232012-08-28 15:09:03 +00005702 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005703
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005704 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005705 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005706 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005707}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005708
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005709void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5710 const InputInfo &Output,
5711 const InputInfoList &Inputs,
5712 const ArgList &Args,
5713 const char *LinkingOutput) const {
5714 ArgStringList CmdArgs;
5715
5716 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5717 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005718 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005719 CmdArgs.push_back("--32");
5720
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005721 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005722 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005723 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005724 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005725 CmdArgs.push_back("-EL");
5726
5727 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5728 options::OPT_Xassembler);
5729
5730 CmdArgs.push_back("-o");
5731 CmdArgs.push_back(Output.getFilename());
5732
5733 for (InputInfoList::const_iterator
5734 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5735 const InputInfo &II = *it;
5736 CmdArgs.push_back(II.getFilename());
5737 }
5738
David Chisnallddbd68f2011-09-27 22:03:18 +00005739 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005740 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5741}
5742
5743void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5744 const InputInfo &Output,
5745 const InputInfoList &Inputs,
5746 const ArgList &Args,
5747 const char *LinkingOutput) const {
5748 const Driver &D = getToolChain().getDriver();
5749 ArgStringList CmdArgs;
5750
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005751 if (!D.SysRoot.empty())
5752 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5753
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005754 if (Args.hasArg(options::OPT_static)) {
5755 CmdArgs.push_back("-Bstatic");
5756 } else {
5757 if (Args.hasArg(options::OPT_rdynamic))
5758 CmdArgs.push_back("-export-dynamic");
5759 CmdArgs.push_back("--eh-frame-hdr");
5760 if (Args.hasArg(options::OPT_shared)) {
5761 CmdArgs.push_back("-Bshareable");
5762 } else {
5763 CmdArgs.push_back("-dynamic-linker");
5764 CmdArgs.push_back("/libexec/ld.elf_so");
5765 }
5766 }
5767
5768 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5769 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005770 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005771 CmdArgs.push_back("-m");
5772 CmdArgs.push_back("elf_i386");
5773 }
5774
5775 if (Output.isFilename()) {
5776 CmdArgs.push_back("-o");
5777 CmdArgs.push_back(Output.getFilename());
5778 } else {
5779 assert(Output.isNothing() && "Invalid output.");
5780 }
5781
5782 if (!Args.hasArg(options::OPT_nostdlib) &&
5783 !Args.hasArg(options::OPT_nostartfiles)) {
5784 if (!Args.hasArg(options::OPT_shared)) {
5785 CmdArgs.push_back(Args.MakeArgString(
5786 getToolChain().GetFilePath("crt0.o")));
5787 CmdArgs.push_back(Args.MakeArgString(
5788 getToolChain().GetFilePath("crti.o")));
5789 CmdArgs.push_back(Args.MakeArgString(
5790 getToolChain().GetFilePath("crtbegin.o")));
5791 } else {
5792 CmdArgs.push_back(Args.MakeArgString(
5793 getToolChain().GetFilePath("crti.o")));
5794 CmdArgs.push_back(Args.MakeArgString(
5795 getToolChain().GetFilePath("crtbeginS.o")));
5796 }
5797 }
5798
5799 Args.AddAllArgs(CmdArgs, options::OPT_L);
5800 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5801 Args.AddAllArgs(CmdArgs, options::OPT_e);
5802 Args.AddAllArgs(CmdArgs, options::OPT_s);
5803 Args.AddAllArgs(CmdArgs, options::OPT_t);
5804 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5805 Args.AddAllArgs(CmdArgs, options::OPT_r);
5806
5807 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5808
5809 if (!Args.hasArg(options::OPT_nostdlib) &&
5810 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005811 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005812 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5813 CmdArgs.push_back("-lm");
5814 }
5815 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5816 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005817 if (Args.hasArg(options::OPT_static)) {
5818 CmdArgs.push_back("-lgcc_eh");
5819 } else {
5820 CmdArgs.push_back("--as-needed");
5821 CmdArgs.push_back("-lgcc_s");
5822 CmdArgs.push_back("--no-as-needed");
5823 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005824 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005825
5826 if (Args.hasArg(options::OPT_pthread))
5827 CmdArgs.push_back("-lpthread");
5828 CmdArgs.push_back("-lc");
5829
5830 CmdArgs.push_back("-lgcc");
5831 if (Args.hasArg(options::OPT_static)) {
5832 CmdArgs.push_back("-lgcc_eh");
5833 } else {
5834 CmdArgs.push_back("--as-needed");
5835 CmdArgs.push_back("-lgcc_s");
5836 CmdArgs.push_back("--no-as-needed");
5837 }
5838 }
5839
5840 if (!Args.hasArg(options::OPT_nostdlib) &&
5841 !Args.hasArg(options::OPT_nostartfiles)) {
5842 if (!Args.hasArg(options::OPT_shared))
5843 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5844 "crtend.o")));
5845 else
5846 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5847 "crtendS.o")));
5848 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5849 "crtn.o")));
5850 }
5851
Bill Wendling08760582011-06-27 19:15:03 +00005852 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005853
David Chisnallddbd68f2011-09-27 22:03:18 +00005854 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005855 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5856}
5857
Thomas Schwinge4e555262013-03-28 19:04:25 +00005858void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5859 const InputInfo &Output,
5860 const InputInfoList &Inputs,
5861 const ArgList &Args,
5862 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005863 ArgStringList CmdArgs;
5864
5865 // Add --32/--64 to make sure we get the format we want.
5866 // This is incomplete
5867 if (getToolChain().getArch() == llvm::Triple::x86) {
5868 CmdArgs.push_back("--32");
5869 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5870 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005871 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5872 CmdArgs.push_back("-a32");
5873 CmdArgs.push_back("-mppc");
5874 CmdArgs.push_back("-many");
5875 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5876 CmdArgs.push_back("-a64");
5877 CmdArgs.push_back("-mppc64");
5878 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005879 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005880 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005881 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5882 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005883
5884 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5885 getToolChain().getTriple());
5886 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005887
5888 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5889 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5890 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005891 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5892 getToolChain().getArch() == llvm::Triple::mipsel ||
5893 getToolChain().getArch() == llvm::Triple::mips64 ||
5894 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005895 StringRef CPUName;
5896 StringRef ABIName;
5897 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005898
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005899 CmdArgs.push_back("-march");
5900 CmdArgs.push_back(CPUName.data());
5901
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005902 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005903 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005904
5905 if (getToolChain().getArch() == llvm::Triple::mips ||
5906 getToolChain().getArch() == llvm::Triple::mips64)
5907 CmdArgs.push_back("-EB");
5908 else
5909 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005910
Simon Atanasyan036d16d2013-04-30 07:47:13 +00005911 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5912 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5913 options::OPT_mno_micromips);
5914 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5915 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5916
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005917 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5918 options::OPT_fpic, options::OPT_fno_pic,
5919 options::OPT_fPIE, options::OPT_fno_PIE,
5920 options::OPT_fpie, options::OPT_fno_pie);
5921 if (LastPICArg &&
5922 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5923 LastPICArg->getOption().matches(options::OPT_fpic) ||
5924 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5925 LastPICArg->getOption().matches(options::OPT_fpie))) {
5926 CmdArgs.push_back("-KPIC");
5927 }
Ulrich Weigand47445072013-05-06 16:26:41 +00005928 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
5929 // At the moment we always produce z10 code.
5930 CmdArgs.push_back("-march=z10");
Rafael Espindola92b00932010-08-10 00:25:48 +00005931 }
5932
5933 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5934 options::OPT_Xassembler);
5935
5936 CmdArgs.push_back("-o");
5937 CmdArgs.push_back(Output.getFilename());
5938
5939 for (InputInfoList::const_iterator
5940 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5941 const InputInfo &II = *it;
5942 CmdArgs.push_back(II.getFilename());
5943 }
5944
5945 const char *Exec =
5946 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5947 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00005948
5949 // Handle the debug info splitting at object creation time if we're
5950 // creating an object.
5951 // TODO: Currently only works on linux with newer objcopy.
5952 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
5953 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
5954 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5955 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00005956}
5957
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005958static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5959 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005960 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005961 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5962 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00005963 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00005964 CmdArgs.push_back("-lgcc");
5965
Logan Chien3d3373c2012-11-19 12:04:11 +00005966 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005967 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00005968 CmdArgs.push_back("-lgcc");
5969 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00005970 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00005971 CmdArgs.push_back("--as-needed");
5972 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00005973 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00005974 CmdArgs.push_back("--no-as-needed");
5975 }
5976
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005977 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005978 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00005979 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00005980 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005981
5982 // According to Android ABI, we have to link with libdl if we are
5983 // linking with non-static libgcc.
5984 //
5985 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5986 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5987 if (isAndroid && !StaticLibgcc)
5988 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005989}
5990
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005991static bool hasMipsN32ABIArg(const ArgList &Args) {
5992 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005993 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005994}
5995
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00005996static StringRef getLinuxDynamicLinker(const ArgList &Args,
5997 const toolchains::Linux &ToolChain) {
5998 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
5999 return "/system/bin/linker";
6000 else if (ToolChain.getArch() == llvm::Triple::x86)
6001 return "/lib/ld-linux.so.2";
6002 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6003 return "/lib/ld-linux-aarch64.so.1";
6004 else if (ToolChain.getArch() == llvm::Triple::arm ||
6005 ToolChain.getArch() == llvm::Triple::thumb) {
6006 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6007 return "/lib/ld-linux-armhf.so.3";
6008 else
6009 return "/lib/ld-linux.so.3";
6010 } else if (ToolChain.getArch() == llvm::Triple::mips ||
6011 ToolChain.getArch() == llvm::Triple::mipsel)
6012 return "/lib/ld.so.1";
6013 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
6014 ToolChain.getArch() == llvm::Triple::mips64el) {
6015 if (hasMipsN32ABIArg(Args))
6016 return "/lib32/ld.so.1";
6017 else
6018 return "/lib64/ld.so.1";
6019 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6020 return "/lib/ld.so.1";
6021 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6022 ToolChain.getArch() == llvm::Triple::systemz)
6023 return "/lib64/ld64.so.1";
6024 else
6025 return "/lib64/ld-linux-x86-64.so.2";
6026}
6027
Thomas Schwinge4e555262013-03-28 19:04:25 +00006028void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6029 const InputInfo &Output,
6030 const InputInfoList &Inputs,
6031 const ArgList &Args,
6032 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006033 const toolchains::Linux& ToolChain =
6034 static_cast<const toolchains::Linux&>(getToolChain());
6035 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006036 const bool isAndroid =
6037 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006038 SanitizerArgs Sanitize(getToolChain(), Args);
6039 const bool IsPIE =
6040 !Args.hasArg(options::OPT_shared) &&
6041 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006042
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006043 ArgStringList CmdArgs;
6044
Rafael Espindolad1002f62010-11-15 18:28:16 +00006045 // Silence warning for "clang -g foo.o -o foo"
6046 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006047 // and "clang -emit-llvm foo.o -o foo"
6048 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006049 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006050 // handled somewhere else.
6051 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006052
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006053 if (!D.SysRoot.empty())
6054 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006055
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006056 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006057 CmdArgs.push_back("-pie");
6058
Rafael Espindola1c76c592010-11-07 22:57:16 +00006059 if (Args.hasArg(options::OPT_rdynamic))
6060 CmdArgs.push_back("-export-dynamic");
6061
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006062 if (Args.hasArg(options::OPT_s))
6063 CmdArgs.push_back("-s");
6064
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006065 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6066 e = ToolChain.ExtraOpts.end();
6067 i != e; ++i)
6068 CmdArgs.push_back(i->c_str());
6069
6070 if (!Args.hasArg(options::OPT_static)) {
6071 CmdArgs.push_back("--eh-frame-hdr");
6072 }
6073
6074 CmdArgs.push_back("-m");
6075 if (ToolChain.getArch() == llvm::Triple::x86)
6076 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006077 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6078 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006079 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006080 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006081 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006082 else if (ToolChain.getArch() == llvm::Triple::ppc)
6083 CmdArgs.push_back("elf32ppclinux");
6084 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6085 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006086 else if (ToolChain.getArch() == llvm::Triple::mips)
6087 CmdArgs.push_back("elf32btsmip");
6088 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6089 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006090 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6091 if (hasMipsN32ABIArg(Args))
6092 CmdArgs.push_back("elf32btsmipn32");
6093 else
6094 CmdArgs.push_back("elf64btsmip");
6095 }
6096 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6097 if (hasMipsN32ABIArg(Args))
6098 CmdArgs.push_back("elf32ltsmipn32");
6099 else
6100 CmdArgs.push_back("elf64ltsmip");
6101 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006102 else if (ToolChain.getArch() == llvm::Triple::systemz)
6103 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006104 else
6105 CmdArgs.push_back("elf_x86_64");
6106
6107 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006108 if (ToolChain.getArch() == llvm::Triple::arm
6109 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006110 CmdArgs.push_back("-Bstatic");
6111 else
6112 CmdArgs.push_back("-static");
6113 } else if (Args.hasArg(options::OPT_shared)) {
6114 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006115 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006116 CmdArgs.push_back("-Bsymbolic");
6117 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006118 }
6119
6120 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006121 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006122 (!Args.hasArg(options::OPT_static) &&
6123 !Args.hasArg(options::OPT_shared))) {
6124 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006125 CmdArgs.push_back(Args.MakeArgString(
6126 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006127 }
6128
6129 CmdArgs.push_back("-o");
6130 CmdArgs.push_back(Output.getFilename());
6131
Rafael Espindola81937ec2010-12-01 01:52:43 +00006132 if (!Args.hasArg(options::OPT_nostdlib) &&
6133 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006134 if (!isAndroid) {
6135 const char *crt1 = NULL;
6136 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006137 if (Args.hasArg(options::OPT_pg))
6138 crt1 = "gcrt1.o";
6139 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006140 crt1 = "Scrt1.o";
6141 else
6142 crt1 = "crt1.o";
6143 }
6144 if (crt1)
6145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006146
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006147 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6148 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006149
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006150 const char *crtbegin;
6151 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006152 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006153 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006154 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006155 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006156 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006157 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006158 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006159 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006160
6161 // Add crtfastmath.o if available and fast math is enabled.
6162 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006163 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006164
6165 Args.AddAllArgs(CmdArgs, options::OPT_L);
6166
6167 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6168
Roman Divackyee8188a2011-03-01 17:53:14 +00006169 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6170 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006171 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006172
Rafael Espindola9446d762012-04-09 23:53:34 +00006173 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6174 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6175 // forward.
6176 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6177 CmdArgs.push_back("-plugin");
6178 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6179 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006180
6181 // Try to pass driver level flags relevant to LTO code generation down to
6182 // the plugin.
6183
6184 // Handle architecture-specific flags for selecting CPU variants.
6185 if (ToolChain.getArch() == llvm::Triple::x86 ||
6186 ToolChain.getArch() == llvm::Triple::x86_64)
6187 CmdArgs.push_back(
6188 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6189 getX86TargetCPU(Args, ToolChain.getTriple())));
6190 else if (ToolChain.getArch() == llvm::Triple::arm ||
6191 ToolChain.getArch() == llvm::Triple::thumb)
6192 CmdArgs.push_back(
6193 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6194 getARMTargetCPU(Args, ToolChain.getTriple())));
6195
6196 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6197 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00006198 }
6199
Chandler Carruth953fb082013-01-13 11:46:33 +00006200
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006201 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6202 CmdArgs.push_back("--no-demangle");
6203
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006204 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6205
Eric Christopher04997782012-11-29 18:51:05 +00006206 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006207 if (Sanitize.needsUbsanRt())
Hans Wennborg70850d82013-07-18 20:29:38 +00006208 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX(),
Richard Smithcff3cde2013-03-20 23:49:07 +00006209 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006210 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006211 if (Sanitize.needsAsanRt())
6212 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6213 if (Sanitize.needsTsanRt())
6214 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006215 if (Sanitize.needsMsanRt())
6216 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006217 if (Sanitize.needsLsanRt())
6218 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006219
Chandler Carruthe4458b32013-06-24 09:38:45 +00006220 // The profile runtime also needs access to system libraries.
6221 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6222
Hans Wennborg70850d82013-07-18 20:29:38 +00006223 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00006224 !Args.hasArg(options::OPT_nostdlib) &&
6225 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006226 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6227 !Args.hasArg(options::OPT_static);
6228 if (OnlyLibstdcxxStatic)
6229 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006230 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006231 if (OnlyLibstdcxxStatic)
6232 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006233 CmdArgs.push_back("-lm");
6234 }
6235
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006236 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006237 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6238 if (Args.hasArg(options::OPT_static))
6239 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006240
Chandler Carruth01538002013-01-17 13:19:29 +00006241 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6242 if (OpenMP) {
6243 CmdArgs.push_back("-lgomp");
6244
6245 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6246 // librt. Most modern Linux platfroms require it, but some may not.
6247 CmdArgs.push_back("-lrt");
6248 }
6249
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006250 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006251
Chandler Carruth94a32012012-05-14 18:31:18 +00006252 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006253 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006254 CmdArgs.push_back("-lpthread");
6255
6256 CmdArgs.push_back("-lc");
6257
6258 if (Args.hasArg(options::OPT_static))
6259 CmdArgs.push_back("--end-group");
6260 else
6261 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6262 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006263
Rafael Espindola81937ec2010-12-01 01:52:43 +00006264 if (!Args.hasArg(options::OPT_nostartfiles)) {
6265 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006266 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006267 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006268 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006269 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006270 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006271 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006272
Rafael Espindola81937ec2010-12-01 01:52:43 +00006273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006274 if (!isAndroid)
6275 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006276 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006277 }
6278
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006279 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6280}
Rafael Espindola92b00932010-08-10 00:25:48 +00006281
Chris Lattner3e2ee142010-07-07 16:01:42 +00006282void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006283 const InputInfo &Output,
6284 const InputInfoList &Inputs,
6285 const ArgList &Args,
6286 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006287 ArgStringList CmdArgs;
6288
6289 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6290 options::OPT_Xassembler);
6291
6292 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006293 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006294
6295 for (InputInfoList::const_iterator
6296 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6297 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006298 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006299 }
6300
6301 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006302 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006303 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006304}
6305
6306void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006307 const InputInfo &Output,
6308 const InputInfoList &Inputs,
6309 const ArgList &Args,
6310 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006311 const Driver &D = getToolChain().getDriver();
6312 ArgStringList CmdArgs;
6313
Daniel Dunbarb440f562010-08-02 02:38:21 +00006314 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006315 CmdArgs.push_back("-o");
6316 CmdArgs.push_back(Output.getFilename());
6317 } else {
6318 assert(Output.isNothing() && "Invalid output.");
6319 }
6320
6321 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006322 !Args.hasArg(options::OPT_nostartfiles)) {
6323 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6324 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6325 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6326 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6327 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006328
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);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006334
Eli Friedman83de5132011-12-08 23:54:21 +00006335 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6336
Chris Lattner3e2ee142010-07-07 16:01:42 +00006337 if (!Args.hasArg(options::OPT_nostdlib) &&
6338 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006339 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006340 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006341 CmdArgs.push_back("-lm");
6342 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006343 }
6344
6345 if (!Args.hasArg(options::OPT_nostdlib) &&
6346 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006347 if (Args.hasArg(options::OPT_pthread))
6348 CmdArgs.push_back("-lpthread");
6349 CmdArgs.push_back("-lc");
6350 CmdArgs.push_back("-lCompilerRT-Generic");
6351 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6352 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006353 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006354 }
6355
Eli Friedman83de5132011-12-08 23:54:21 +00006356 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006357 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006358}
6359
Daniel Dunbarcc912342009-05-02 18:28:39 +00006360/// DragonFly Tools
6361
6362// For now, DragonFly Assemble does just about the same as for
6363// FreeBSD, but this may change soon.
6364void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006365 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006366 const InputInfoList &Inputs,
6367 const ArgList &Args,
6368 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006369 ArgStringList CmdArgs;
6370
6371 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6372 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006373 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006374 CmdArgs.push_back("--32");
6375
6376 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6377 options::OPT_Xassembler);
6378
6379 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006380 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006381
6382 for (InputInfoList::const_iterator
6383 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6384 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006385 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006386 }
6387
6388 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006389 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006390 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006391}
6392
6393void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006394 const InputInfo &Output,
6395 const InputInfoList &Inputs,
6396 const ArgList &Args,
6397 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006398 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006399 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006400 ArgStringList CmdArgs;
6401
John McCall65b8da02013-04-11 22:55:55 +00006402 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6403 UseGCC47 = false;
6404
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006405 if (!D.SysRoot.empty())
6406 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6407
John McCall65b8da02013-04-11 22:55:55 +00006408 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006409 if (Args.hasArg(options::OPT_static)) {
6410 CmdArgs.push_back("-Bstatic");
6411 } else {
John McCall65b8da02013-04-11 22:55:55 +00006412 if (Args.hasArg(options::OPT_rdynamic))
6413 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006414 if (Args.hasArg(options::OPT_shared))
6415 CmdArgs.push_back("-Bshareable");
6416 else {
6417 CmdArgs.push_back("-dynamic-linker");
6418 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6419 }
John McCall65b8da02013-04-11 22:55:55 +00006420 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006421 }
6422
6423 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6424 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006425 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006426 CmdArgs.push_back("-m");
6427 CmdArgs.push_back("elf_i386");
6428 }
6429
Daniel Dunbarb440f562010-08-02 02:38:21 +00006430 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006431 CmdArgs.push_back("-o");
6432 CmdArgs.push_back(Output.getFilename());
6433 } else {
6434 assert(Output.isNothing() && "Invalid output.");
6435 }
6436
6437 if (!Args.hasArg(options::OPT_nostdlib) &&
6438 !Args.hasArg(options::OPT_nostartfiles)) {
6439 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006440 if (Args.hasArg(options::OPT_pg))
6441 CmdArgs.push_back(Args.MakeArgString(
6442 getToolChain().GetFilePath("gcrt1.o")));
6443 else {
6444 if (Args.hasArg(options::OPT_pie))
6445 CmdArgs.push_back(Args.MakeArgString(
6446 getToolChain().GetFilePath("Scrt1.o")));
6447 else
6448 CmdArgs.push_back(Args.MakeArgString(
6449 getToolChain().GetFilePath("crt1.o")));
6450 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006451 }
John McCall65b8da02013-04-11 22:55:55 +00006452 CmdArgs.push_back(Args.MakeArgString(
6453 getToolChain().GetFilePath("crti.o")));
6454 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6455 CmdArgs.push_back(Args.MakeArgString(
6456 getToolChain().GetFilePath("crtbeginS.o")));
6457 else
6458 CmdArgs.push_back(Args.MakeArgString(
6459 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006460 }
6461
6462 Args.AddAllArgs(CmdArgs, options::OPT_L);
6463 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6464 Args.AddAllArgs(CmdArgs, options::OPT_e);
6465
Daniel Dunbar54423b22010-09-17 00:24:54 +00006466 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006467
6468 if (!Args.hasArg(options::OPT_nostdlib) &&
6469 !Args.hasArg(options::OPT_nodefaultlibs)) {
6470 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6471 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006472 if (UseGCC47)
6473 CmdArgs.push_back("-L/usr/lib/gcc47");
6474 else
6475 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006476
6477 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006478 if (UseGCC47) {
6479 CmdArgs.push_back("-rpath");
6480 CmdArgs.push_back("/usr/lib/gcc47");
6481 } else {
6482 CmdArgs.push_back("-rpath");
6483 CmdArgs.push_back("/usr/lib/gcc44");
6484 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006485 }
6486
Hans Wennborg70850d82013-07-18 20:29:38 +00006487 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006488 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006489 CmdArgs.push_back("-lm");
6490 }
6491
Daniel Dunbarcc912342009-05-02 18:28:39 +00006492 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006493 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006494
6495 if (!Args.hasArg(options::OPT_nolibc)) {
6496 CmdArgs.push_back("-lc");
6497 }
6498
John McCall65b8da02013-04-11 22:55:55 +00006499 if (UseGCC47) {
6500 if (Args.hasArg(options::OPT_static) ||
6501 Args.hasArg(options::OPT_static_libgcc)) {
6502 CmdArgs.push_back("-lgcc");
6503 CmdArgs.push_back("-lgcc_eh");
6504 } else {
6505 if (Args.hasArg(options::OPT_shared_libgcc)) {
6506 CmdArgs.push_back("-lgcc_pic");
6507 if (!Args.hasArg(options::OPT_shared))
6508 CmdArgs.push_back("-lgcc");
6509 } else {
6510 CmdArgs.push_back("-lgcc");
6511 CmdArgs.push_back("--as-needed");
6512 CmdArgs.push_back("-lgcc_pic");
6513 CmdArgs.push_back("--no-as-needed");
6514 }
6515 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006516 } else {
John McCall65b8da02013-04-11 22:55:55 +00006517 if (Args.hasArg(options::OPT_shared)) {
6518 CmdArgs.push_back("-lgcc_pic");
6519 } else {
6520 CmdArgs.push_back("-lgcc");
6521 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006522 }
6523 }
6524
6525 if (!Args.hasArg(options::OPT_nostdlib) &&
6526 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006527 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006528 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006529 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006530 else
6531 CmdArgs.push_back(Args.MakeArgString(
6532 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006533 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006534 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006535 }
6536
Bill Wendling08760582011-06-27 19:15:03 +00006537 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006538
Daniel Dunbarcc912342009-05-02 18:28:39 +00006539 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006540 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006541 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006542}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006543
6544void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6545 const InputInfo &Output,
6546 const InputInfoList &Inputs,
6547 const ArgList &Args,
6548 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006549 ArgStringList CmdArgs;
6550
6551 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006552 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6553 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006554 } else {
6555 assert(Output.isNothing() && "Invalid output.");
6556 }
6557
6558 if (!Args.hasArg(options::OPT_nostdlib) &&
6559 !Args.hasArg(options::OPT_nostartfiles)) {
6560 CmdArgs.push_back("-defaultlib:libcmt");
6561 }
6562
6563 CmdArgs.push_back("-nologo");
6564
Michael J. Spencere2f49362012-06-18 16:56:04 +00006565 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6566
6567 // Add filenames immediately.
6568 for (InputInfoList::const_iterator
6569 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6570 if (it->isFilename())
6571 CmdArgs.push_back(it->getFilename());
6572 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006573
6574 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006575 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006576 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6577}