blob: 6d468ab85eb91cd94a8f2c575b82644b97bca31c [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))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +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")
531 .Case("ep9312", "ep9312")
532 .Case("iwmmxt", "iwmmxt")
533 .Case("xscale", "xscale")
Tim Northover92509c12013-06-13 15:02:46 +0000534 // If all else failed, return the most base CPU with thumb interworking
535 // supported by LLVM.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000536 .Default("arm7tdmi");
537}
538
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000539// FIXME: Move to target hook.
540static bool isSignedCharDefault(const llvm::Triple &Triple) {
541 switch (Triple.getArch()) {
542 default:
543 return true;
544
Tim Northover9bb857a2013-01-31 12:13:10 +0000545 case llvm::Triple::aarch64:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000546 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000547 case llvm::Triple::ppc:
548 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000549 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000550 return true;
551 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000552
553 case llvm::Triple::systemz:
554 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000555 }
556}
557
Chad Rosiercfbfc582012-04-04 20:51:35 +0000558// Handle -mfpu=.
559//
560// FIXME: Centralize feature selection, defaulting shouldn't be also in the
561// frontend target.
562static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
563 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000564 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000565
566 // Set the target features based on the FPU.
567 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
568 // Disable any default FPU support.
569 CmdArgs.push_back("-target-feature");
570 CmdArgs.push_back("-vfp2");
571 CmdArgs.push_back("-target-feature");
572 CmdArgs.push_back("-vfp3");
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-neon");
575 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+vfp3");
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("+d16");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("-neon");
582 } else if (FPU == "vfp") {
583 CmdArgs.push_back("-target-feature");
584 CmdArgs.push_back("+vfp2");
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neon");
587 } else if (FPU == "vfp3" || FPU == "vfpv3") {
588 CmdArgs.push_back("-target-feature");
589 CmdArgs.push_back("+vfp3");
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("-neon");
592 } else if (FPU == "neon") {
593 CmdArgs.push_back("-target-feature");
594 CmdArgs.push_back("+neon");
595 } else
596 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
597}
598
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000599// Handle -mfpmath=.
600static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000601 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000602 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000603
604 // Set the target features based on the FPMath.
605 if (FPMath == "neon") {
606 CmdArgs.push_back("-target-feature");
607 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000608
Bob Wilsonf643afc2013-03-04 22:37:46 +0000609 if (CPU != "cortex-a5" && CPU != "cortex-a7" &&
610 CPU != "cortex-a8" && CPU != "cortex-a9" &&
611 CPU != "cortex-a9-mp" && CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000612 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
613
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000614 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
615 FPMath == "vfp4") {
616 CmdArgs.push_back("-target-feature");
617 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000618
619 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000620 } else
621 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
622}
623
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000624// Select the float ABI as determined by -msoft-float, -mhard-float, and
625// -mfloat-abi=.
626static StringRef getARMFloatABI(const Driver &D,
627 const ArgList &Args,
628 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000629 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000630 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
631 options::OPT_mhard_float,
632 options::OPT_mfloat_abi_EQ)) {
633 if (A->getOption().matches(options::OPT_msoft_float))
634 FloatABI = "soft";
635 else if (A->getOption().matches(options::OPT_mhard_float))
636 FloatABI = "hard";
637 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000638 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000640 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000641 << A->getAsString(Args);
642 FloatABI = "soft";
643 }
644 }
645 }
646
647 // If unspecified, choose the default based on the platform.
648 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000649 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000650 case llvm::Triple::Darwin:
651 case llvm::Triple::MacOSX:
652 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000653 // Darwin defaults to "softfp" for v6 and v7.
654 //
655 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000656 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000657 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000658 if (StringRef(ArchName).startswith("v6") ||
659 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000660 FloatABI = "softfp";
661 else
662 FloatABI = "soft";
663 break;
664 }
665
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000666 case llvm::Triple::FreeBSD:
667 // FreeBSD defaults to soft float
668 FloatABI = "soft";
669 break;
670
Daniel Dunbar78485922009-09-10 23:00:09 +0000671 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000672 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000673 case llvm::Triple::GNUEABIHF:
674 FloatABI = "hard";
675 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000676 case llvm::Triple::GNUEABI:
677 FloatABI = "softfp";
678 break;
679 case llvm::Triple::EABI:
680 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
681 FloatABI = "softfp";
682 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000683 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000684 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000685 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000686 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000687 FloatABI = "softfp";
688 else
689 FloatABI = "soft";
690 break;
691 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000692 default:
693 // Assume "soft", but warn the user we are guessing.
694 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000695 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000696 break;
697 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000698 }
699 }
700
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000701 return FloatABI;
702}
703
704
705void Clang::AddARMTargetArgs(const ArgList &Args,
706 ArgStringList &CmdArgs,
707 bool KernelOrKext) const {
708 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000709 // Get the effective triple, which takes into account the deployment target.
710 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
711 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000712 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000713
714 // Select the ABI to use.
715 //
716 // FIXME: Support -meabi.
717 const char *ABIName = 0;
718 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000719 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000720 } else if (Triple.isOSDarwin()) {
721 // The backend is hardwired to assume AAPCS for M-class processors, ensure
722 // the frontend matches that.
723 if (StringRef(CPUName).startswith("cortex-m")) {
724 ABIName = "aapcs";
725 } else {
726 ABIName = "apcs-gnu";
727 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000728 } else {
729 // Select the default based on the platform.
730 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000731 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000732 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000733 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000734 ABIName = "aapcs-linux";
735 break;
736 case llvm::Triple::EABI:
737 ABIName = "aapcs";
738 break;
739 default:
740 ABIName = "apcs-gnu";
741 }
742 }
743 CmdArgs.push_back("-target-abi");
744 CmdArgs.push_back(ABIName);
745
746 // Set the CPU based on -march= and -mcpu=.
747 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000748 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000749
750 // Determine floating point ABI from the options & target defaults.
751 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 if (FloatABI == "soft") {
753 // Floating point operations and argument passing are soft.
754 //
755 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000756 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000757 CmdArgs.push_back("-mfloat-abi");
758 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000759 } else if (FloatABI == "softfp") {
760 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000761 CmdArgs.push_back("-mfloat-abi");
762 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000763 } else {
764 // Floating point operations and argument passing are hard.
765 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000766 CmdArgs.push_back("-mfloat-abi");
767 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000768 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000769
770 // Set appropriate target features for floating point mode.
771 //
772 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
773 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
774 // stripped out by the ARM target.
775
776 // Use software floating point operations?
777 if (FloatABI == "soft") {
778 CmdArgs.push_back("-target-feature");
779 CmdArgs.push_back("+soft-float");
780 }
781
782 // Use software floating point argument passing?
783 if (FloatABI != "hard") {
784 CmdArgs.push_back("-target-feature");
785 CmdArgs.push_back("+soft-float-abi");
786 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000787
788 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000789 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000790 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000791
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000792 // Honor -mfpmath=.
793 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000794 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000795
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000796 // Setting -msoft-float effectively disables NEON because of the GCC
797 // implementation, although the same isn't true of VFP or VFP3.
798 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000799 CmdArgs.push_back("-target-feature");
800 CmdArgs.push_back("-neon");
801 }
802
803 // Kernel code has more strict alignment requirements.
804 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000805 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
806 CmdArgs.push_back("-backend-option");
807 CmdArgs.push_back("-arm-long-calls");
808 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000809
Daniel Dunbar12100e22011-03-22 16:48:17 +0000810 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000811 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000812
813 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000814 CmdArgs.push_back("-backend-option");
815 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000816 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000817
818 // Setting -mno-global-merge disables the codegen global merge pass. Setting
819 // -mglobal-merge has no effect as the pass is enabled by default.
820 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
821 options::OPT_mno_global_merge)) {
822 if (A->getOption().matches(options::OPT_mno_global_merge))
823 CmdArgs.push_back("-mno-global-merge");
824 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000825
Bob Wilson9c8af452013-04-11 18:53:25 +0000826 if (!Args.hasFlag(options::OPT_mimplicit_float,
827 options::OPT_mno_implicit_float,
828 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000829 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000830}
831
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000832// Translate MIPS CPU name alias option to CPU name.
833static StringRef getMipsCPUFromAlias(const Arg &A) {
834 if (A.getOption().matches(options::OPT_mips32))
835 return "mips32";
836 if (A.getOption().matches(options::OPT_mips32r2))
837 return "mips32r2";
838 if (A.getOption().matches(options::OPT_mips64))
839 return "mips64";
840 if (A.getOption().matches(options::OPT_mips64r2))
841 return "mips64r2";
842 llvm_unreachable("Unexpected option");
843 return "";
844}
845
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000846// Get CPU and ABI names. They are not independent
847// so we have to calculate them together.
848static void getMipsCPUAndABI(const ArgList &Args,
849 const ToolChain &TC,
850 StringRef &CPUName,
851 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000852 const char *DefMips32CPU = "mips32";
853 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000854
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000855 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000856 options::OPT_mcpu_EQ,
857 options::OPT_mips_CPUs_Group)) {
858 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
859 CPUName = getMipsCPUFromAlias(*A);
860 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000861 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000862 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000863
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000864 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000865 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000866 // Convert a GNU style Mips ABI name to the name
867 // accepted by LLVM Mips backend.
868 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
869 .Case("32", "o32")
870 .Case("64", "n64")
871 .Default(ABIName);
872 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000873
874 // Setup default CPU and ABI names.
875 if (CPUName.empty() && ABIName.empty()) {
876 switch (TC.getTriple().getArch()) {
877 default:
878 llvm_unreachable("Unexpected triple arch name");
879 case llvm::Triple::mips:
880 case llvm::Triple::mipsel:
881 CPUName = DefMips32CPU;
882 break;
883 case llvm::Triple::mips64:
884 case llvm::Triple::mips64el:
885 CPUName = DefMips64CPU;
886 break;
887 }
888 }
889
890 if (!ABIName.empty()) {
891 // Deduce CPU name from ABI name.
892 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000893 .Cases("32", "o32", "eabi", DefMips32CPU)
894 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000895 .Default("");
896 }
897 else if (!CPUName.empty()) {
898 // Deduce ABI name from CPU name.
899 ABIName = llvm::StringSwitch<const char *>(CPUName)
900 .Cases("mips32", "mips32r2", "o32")
901 .Cases("mips64", "mips64r2", "n64")
902 .Default("");
903 }
904
905 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000906}
907
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000908// Convert ABI name to the GNU tools acceptable variant.
909static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
910 return llvm::StringSwitch<llvm::StringRef>(ABI)
911 .Case("o32", "32")
912 .Case("n64", "64")
913 .Default(ABI);
914}
915
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000916// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
917// and -mfloat-abi=.
918static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000919 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000920 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000921 options::OPT_mhard_float,
922 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000923 if (A->getOption().matches(options::OPT_msoft_float))
924 FloatABI = "soft";
925 else if (A->getOption().matches(options::OPT_mhard_float))
926 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000927 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000928 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000929 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000930 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000931 FloatABI = "hard";
932 }
933 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000934 }
935
936 // If unspecified, choose the default based on the platform.
937 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000938 // Assume "hard", because it's a default value used by gcc.
939 // When we start to recognize specific target MIPS processors,
940 // we will be able to select the default more correctly.
941 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000942 }
943
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000944 return FloatABI;
945}
946
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000947static void AddTargetFeature(const ArgList &Args,
948 ArgStringList &CmdArgs,
949 OptSpecifier OnOpt,
950 OptSpecifier OffOpt,
951 StringRef FeatureName) {
952 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
953 CmdArgs.push_back("-target-feature");
954 if (A->getOption().matches(OnOpt))
955 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
956 else
957 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
958 }
959}
960
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000961void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +0000962 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000963 const Driver &D = getToolChain().getDriver();
964 StringRef CPUName;
965 StringRef ABIName;
966 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
967
968 CmdArgs.push_back("-target-cpu");
969 CmdArgs.push_back(CPUName.data());
970
971 CmdArgs.push_back("-target-abi");
972 CmdArgs.push_back(ABIName.data());
973
974 StringRef FloatABI = getMipsFloatABI(D, Args);
975
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000976 bool IsMips16 = Args.getLastArg(options::OPT_mips16) != NULL;
977
978 if (FloatABI == "soft" || (FloatABI == "hard" && IsMips16)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000979 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000980 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000981 CmdArgs.push_back("-mfloat-abi");
982 CmdArgs.push_back("soft");
983
984 // FIXME: Note, this is a hack. We need to pass the selected float
985 // mode to the MipsTargetInfoBase to define appropriate macros there.
986 // Now it is the only method.
987 CmdArgs.push_back("-target-feature");
988 CmdArgs.push_back("+soft-float");
Simon Atanasyan81c423c2013-01-10 12:36:19 +0000989
990 if (FloatABI == "hard" && IsMips16) {
991 CmdArgs.push_back("-mllvm");
992 CmdArgs.push_back("-mips16-hard-float");
993 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000994 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000995 else {
996 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000997 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000998 CmdArgs.push_back("-mfloat-abi");
999 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001000 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001001
Simon Atanasyan82eec3a2013-04-14 14:07:36 +00001002 AddTargetFeature(Args, CmdArgs,
1003 options::OPT_msingle_float, options::OPT_mdouble_float,
1004 "single-float");
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001005 AddTargetFeature(Args, CmdArgs,
1006 options::OPT_mips16, options::OPT_mno_mips16,
1007 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001008 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan60777612013-04-14 14:07:51 +00001009 options::OPT_mmicromips, options::OPT_mno_micromips,
1010 "micromips");
1011 AddTargetFeature(Args, CmdArgs,
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00001012 options::OPT_mdsp, options::OPT_mno_dsp,
1013 "dsp");
1014 AddTargetFeature(Args, CmdArgs,
1015 options::OPT_mdspr2, options::OPT_mno_dspr2,
1016 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001017
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1019 if (A->getOption().matches(options::OPT_mxgot)) {
1020 CmdArgs.push_back("-mllvm");
1021 CmdArgs.push_back("-mxgot");
1022 }
1023 }
1024
Simon Atanasyanc580b322013-05-11 06:33:44 +00001025 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1026 options::OPT_mno_ldc1_sdc1)) {
1027 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1028 CmdArgs.push_back("-mllvm");
1029 CmdArgs.push_back("-mno-ldc1-sdc1");
1030 }
1031 }
1032
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001033 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001034 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001035 CmdArgs.push_back("-mllvm");
1036 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1037 A->claim();
1038 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001039}
1040
Hal Finkel8eb59282012-06-11 22:35:19 +00001041/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1042static std::string getPPCTargetCPU(const ArgList &Args) {
1043 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001044 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001045
1046 if (CPUName == "native") {
1047 std::string CPU = llvm::sys::getHostCPUName();
1048 if (!CPU.empty() && CPU != "generic")
1049 return CPU;
1050 else
1051 return "";
1052 }
1053
1054 return llvm::StringSwitch<const char *>(CPUName)
1055 .Case("common", "generic")
1056 .Case("440", "440")
1057 .Case("440fp", "440")
1058 .Case("450", "450")
1059 .Case("601", "601")
1060 .Case("602", "602")
1061 .Case("603", "603")
1062 .Case("603e", "603e")
1063 .Case("603ev", "603ev")
1064 .Case("604", "604")
1065 .Case("604e", "604e")
1066 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001067 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001068 .Case("G3", "g3")
1069 .Case("7400", "7400")
1070 .Case("G4", "g4")
1071 .Case("7450", "7450")
1072 .Case("G4+", "g4+")
1073 .Case("750", "750")
1074 .Case("970", "970")
1075 .Case("G5", "g5")
1076 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001077 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001078 .Case("e500mc", "e500mc")
1079 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001080 .Case("power3", "pwr3")
1081 .Case("power4", "pwr4")
1082 .Case("power5", "pwr5")
1083 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001084 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001085 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001086 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001087 .Case("pwr3", "pwr3")
1088 .Case("pwr4", "pwr4")
1089 .Case("pwr5", "pwr5")
1090 .Case("pwr5x", "pwr5x")
1091 .Case("pwr6", "pwr6")
1092 .Case("pwr6x", "pwr6x")
1093 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001094 .Case("powerpc", "ppc")
1095 .Case("powerpc64", "ppc64")
1096 .Default("");
1097 }
1098
1099 return "";
1100}
1101
1102void Clang::AddPPCTargetArgs(const ArgList &Args,
1103 ArgStringList &CmdArgs) const {
1104 std::string TargetCPUName = getPPCTargetCPU(Args);
1105
1106 // LLVM may default to generating code for the native CPU,
1107 // but, like gcc, we default to a more generic option for
1108 // each architecture. (except on Darwin)
1109 llvm::Triple Triple = getToolChain().getTriple();
1110 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1111 if (Triple.getArch() == llvm::Triple::ppc64)
1112 TargetCPUName = "ppc64";
1113 else
1114 TargetCPUName = "ppc";
1115 }
1116
1117 if (!TargetCPUName.empty()) {
1118 CmdArgs.push_back("-target-cpu");
1119 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1120 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001121
1122 // Allow override of the Altivec feature.
Hal Finkel279ca4d2013-03-28 08:38:53 +00001123 AddTargetFeature(Args, CmdArgs,
1124 options::OPT_faltivec, options::OPT_fno_altivec,
1125 "altivec");
Hal Finkelb58ce852013-02-01 18:44:19 +00001126
Hal Finkel7d458592013-03-30 13:47:44 +00001127 AddTargetFeature(Args, CmdArgs,
1128 options::OPT_mfprnd, options::OPT_mno_fprnd,
1129 "fprnd");
1130
Hal Finkel279ca4d2013-03-28 08:38:53 +00001131 // Note that gcc calls this mfcrf and LLVM calls this mfocrf.
1132 AddTargetFeature(Args, CmdArgs,
1133 options::OPT_mmfcrf, options::OPT_mno_mfcrf,
1134 "mfocrf");
1135
Hal Finkel1fe8b3d2013-03-28 13:51:36 +00001136 AddTargetFeature(Args, CmdArgs,
1137 options::OPT_mpopcntd, options::OPT_mno_popcntd,
1138 "popcntd");
1139
Hal Finkel279ca4d2013-03-28 08:38:53 +00001140 // It is really only possible to turn qpx off because turning qpx on is tied
1141 // to using the a2q CPU.
Hal Finkelb58ce852013-02-01 18:44:19 +00001142 if (Args.hasFlag(options::OPT_mno_qpx, options::OPT_mqpx, false)) {
1143 CmdArgs.push_back("-target-feature");
1144 CmdArgs.push_back("-qpx");
1145 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001146}
1147
Tom Stellard6674c702013-04-01 20:56:53 +00001148/// Get the (LLVM) name of the R600 gpu we are targeting.
1149static std::string getR600TargetGPU(const ArgList &Args) {
1150 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1151 std::string GPUName = A->getValue();
1152 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001153 .Cases("rv630", "rv635", "r600")
1154 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001155 .Case("rv740", "rv770")
1156 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001157 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001158 .Case("hemlock", "cypress")
1159 .Case("aruba", "cayman")
1160 .Default(GPUName.c_str());
1161 }
1162 return "";
1163}
1164
1165void Clang::AddR600TargetArgs(const ArgList &Args,
1166 ArgStringList &CmdArgs) const {
1167 std::string TargetGPUName = getR600TargetGPU(Args);
1168 CmdArgs.push_back("-target-cpu");
1169 CmdArgs.push_back(Args.MakeArgString(TargetGPUName.c_str()));
1170}
1171
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001172void Clang::AddSparcTargetArgs(const ArgList &Args,
1173 ArgStringList &CmdArgs) const {
1174 const Driver &D = getToolChain().getDriver();
1175
1176 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001177 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001178 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001179 }
1180
1181 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001182 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001183 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1184 options::OPT_mhard_float)) {
1185 if (A->getOption().matches(options::OPT_msoft_float))
1186 FloatABI = "soft";
1187 else if (A->getOption().matches(options::OPT_mhard_float))
1188 FloatABI = "hard";
1189 }
1190
1191 // If unspecified, choose the default based on the platform.
1192 if (FloatABI.empty()) {
1193 switch (getToolChain().getTriple().getOS()) {
1194 default:
1195 // Assume "soft", but warn the user we are guessing.
1196 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001197 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001198 break;
1199 }
1200 }
1201
1202 if (FloatABI == "soft") {
1203 // Floating point operations and argument passing are soft.
1204 //
1205 // FIXME: This changes CPP defines, we need -target-soft-float.
1206 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001207 CmdArgs.push_back("-target-feature");
1208 CmdArgs.push_back("+soft-float");
1209 } else {
1210 assert(FloatABI == "hard" && "Invalid float abi!");
1211 CmdArgs.push_back("-mhard-float");
1212 }
1213}
1214
Chandler Carruth953fb082013-01-13 11:46:33 +00001215static const char *getX86TargetCPU(const ArgList &Args,
1216 const llvm::Triple &Triple) {
1217 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1218 if (StringRef(A->getValue()) != "native")
1219 return A->getValue();
1220
1221 // FIXME: Reject attempts to use -march=native unless the target matches
1222 // the host.
1223 //
1224 // FIXME: We should also incorporate the detected target features for use
1225 // with -native.
1226 std::string CPU = llvm::sys::getHostCPUName();
1227 if (!CPU.empty() && CPU != "generic")
1228 return Args.MakeArgString(CPU);
1229 }
1230
1231 // Select the default CPU if none was given (or detection failed).
1232
1233 if (Triple.getArch() != llvm::Triple::x86_64 &&
1234 Triple.getArch() != llvm::Triple::x86)
1235 return 0; // This routine is only handling x86 targets.
1236
1237 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1238
1239 // FIXME: Need target hooks.
1240 if (Triple.isOSDarwin())
1241 return Is64Bit ? "core2" : "yonah";
1242
1243 // Everything else goes to x86-64 in 64-bit mode.
1244 if (Is64Bit)
1245 return "x86-64";
1246
1247 if (Triple.getOSName().startswith("haiku"))
1248 return "i586";
1249 if (Triple.getOSName().startswith("openbsd"))
1250 return "i486";
1251 if (Triple.getOSName().startswith("bitrig"))
1252 return "i686";
1253 if (Triple.getOSName().startswith("freebsd"))
1254 return "i486";
1255 if (Triple.getOSName().startswith("netbsd"))
1256 return "i486";
1257 // All x86 devices running Android have core2 as their common
1258 // denominator. This makes a better choice than pentium4.
1259 if (Triple.getEnvironment() == llvm::Triple::Android)
1260 return "core2";
1261
1262 // Fallback to p4.
1263 return "pentium4";
1264}
1265
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001266void Clang::AddX86TargetArgs(const ArgList &Args,
1267 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001268 if (!Args.hasFlag(options::OPT_mred_zone,
1269 options::OPT_mno_red_zone,
1270 true) ||
1271 Args.hasArg(options::OPT_mkernel) ||
1272 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001273 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001274
Bob Wilson2616e2e2013-02-10 16:01:41 +00001275 // Default to avoid implicit floating-point for kernel/kext code, but allow
1276 // that to be overridden with -mno-soft-float.
1277 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1278 Args.hasArg(options::OPT_fapple_kext));
1279 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1280 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001281 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001282 options::OPT_mno_implicit_float)) {
1283 const Option &O = A->getOption();
1284 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1285 O.matches(options::OPT_msoft_float));
1286 }
1287 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001288 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001289
Chandler Carruth953fb082013-01-13 11:46:33 +00001290 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001291 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001292 CmdArgs.push_back(CPUName);
1293 }
1294
Eli Friedmanad811f02011-07-02 00:34:19 +00001295 // The required algorithm here is slightly strange: the options are applied
1296 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1297 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1298 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1299 // former correctly, but not the latter; handle directly-overridden
1300 // attributes here.
1301 llvm::StringMap<unsigned> PrevFeature;
1302 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001303 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1304 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001305 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001306 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001307
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001308 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001309 assert(Name.startswith("m") && "Invalid feature name.");
1310 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001311
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001312 bool IsNegative = Name.startswith("no-");
1313 if (IsNegative)
1314 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001315
Eli Friedmanad811f02011-07-02 00:34:19 +00001316 unsigned& Prev = PrevFeature[Name];
1317 if (Prev)
1318 Features[Prev - 1] = 0;
1319 Prev = Features.size() + 1;
1320 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1321 }
1322 for (unsigned i = 0; i < Features.size(); i++) {
1323 if (Features[i]) {
1324 CmdArgs.push_back("-target-feature");
1325 CmdArgs.push_back(Features[i]);
1326 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001327 }
1328}
1329
Matthew Curtise8f80a12012-12-06 17:49:03 +00001330static inline bool HasPICArg(const ArgList &Args) {
1331 return Args.hasArg(options::OPT_fPIC)
1332 || Args.hasArg(options::OPT_fpic);
1333}
1334
1335static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1336 return Args.getLastArg(options::OPT_G,
1337 options::OPT_G_EQ,
1338 options::OPT_msmall_data_threshold_EQ);
1339}
1340
1341static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1342 std::string value;
1343 if (HasPICArg(Args))
1344 value = "0";
1345 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1346 value = A->getValue();
1347 A->claim();
1348 }
1349 return value;
1350}
1351
Tony Linthicum76329bf2011-12-12 21:14:55 +00001352void Clang::AddHexagonTargetArgs(const ArgList &Args,
1353 ArgStringList &CmdArgs) const {
1354 llvm::Triple Triple = getToolChain().getTriple();
1355
1356 CmdArgs.push_back("-target-cpu");
Matthew Curtisf10a5952012-12-06 14:16:43 +00001357 CmdArgs.push_back(Args.MakeArgString(
1358 "hexagon"
1359 + toolchains::Hexagon_TC::GetTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001360 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001361 CmdArgs.push_back("-mqdsp6-compat");
1362 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001363
Matthew Curtise8f80a12012-12-06 17:49:03 +00001364 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1365 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001366 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001367 CmdArgs.push_back(Args.MakeArgString(
1368 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001369 }
1370
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001371 if (!Args.hasArg(options::OPT_fno_short_enums))
1372 CmdArgs.push_back("-fshort-enums");
1373 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1374 CmdArgs.push_back ("-mllvm");
1375 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1376 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001377 CmdArgs.push_back ("-mllvm");
1378 CmdArgs.push_back ("-machine-sink-split=0");
1379}
1380
Eric Christopher84fbdb42011-08-19 00:30:14 +00001381static bool
John McCall5fb5df92012-06-20 06:18:46 +00001382shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001383 const llvm::Triple &Triple) {
1384 // We use the zero-cost exception tables for Objective-C if the non-fragile
1385 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1386 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001387 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001388 return true;
1389
Bob Wilson6524dd32011-10-14 05:03:44 +00001390 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001391 return false;
1392
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001393 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001394 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001395 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001396}
1397
Anders Carlssone96ab552011-02-28 02:27:16 +00001398/// addExceptionArgs - Adds exception related arguments to the driver command
1399/// arguments. There's a master flag, -fexceptions and also language specific
1400/// flags to enable/disable C++ and Objective-C exceptions.
1401/// This makes it possible to for example disable C++ exceptions but enable
1402/// Objective-C exceptions.
1403static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1404 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001405 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001406 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001407 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001408 if (KernelOrKext) {
1409 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1410 // arguments now to avoid warnings about unused arguments.
1411 Args.ClaimAllArgs(options::OPT_fexceptions);
1412 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1413 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1414 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1415 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1416 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001417 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001418 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001419
1420 // Exceptions are enabled by default.
1421 bool ExceptionsEnabled = true;
1422
1423 // This keeps track of whether exceptions were explicitly turned on or off.
1424 bool DidHaveExplicitExceptionFlag = false;
1425
Rafael Espindola00a66572009-10-01 13:33:33 +00001426 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1427 options::OPT_fno_exceptions)) {
1428 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001429 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001430 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001431 ExceptionsEnabled = false;
1432
1433 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001434 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001435
Anders Carlssone96ab552011-02-28 02:27:16 +00001436 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001437
Anders Carlssone96ab552011-02-28 02:27:16 +00001438 // Exception tables and cleanups can be enabled with -fexceptions even if the
1439 // language itself doesn't support exceptions.
1440 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1441 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001442
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001443 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1444 // is not necessarily sensible, but follows GCC.
1445 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001446 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001447 options::OPT_fno_objc_exceptions,
1448 true)) {
1449 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001450
Eric Christopher84fbdb42011-08-19 00:30:14 +00001451 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001452 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001453 }
1454
1455 if (types::isCXX(InputType)) {
1456 bool CXXExceptionsEnabled = ExceptionsEnabled;
1457
Eric Christopher84fbdb42011-08-19 00:30:14 +00001458 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1459 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001460 options::OPT_fexceptions,
1461 options::OPT_fno_exceptions)) {
1462 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1463 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001464 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001465 CXXExceptionsEnabled = false;
1466 }
1467
1468 if (CXXExceptionsEnabled) {
1469 CmdArgs.push_back("-fcxx-exceptions");
1470
1471 ShouldUseExceptionTables = true;
1472 }
1473 }
1474
1475 if (ShouldUseExceptionTables)
1476 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001477}
1478
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001479static bool ShouldDisableAutolink(const ArgList &Args,
1480 const ToolChain &TC) {
1481 bool Default = true;
1482 if (TC.getTriple().isOSDarwin()) {
1483 // The native darwin assembler doesn't support the linker_option directives,
1484 // so we disable them if we think the .s file will be passed to it.
1485 Default = TC.useIntegratedAs();
1486 }
1487 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1488 Default);
1489}
1490
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001491static bool ShouldDisableCFI(const ArgList &Args,
1492 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001493 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001494 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001495 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001496 // we disable them if we think the .s file will be passed to it.
Rafael Espindola84b588b2013-03-18 18:10:27 +00001497 Default = TC.useIntegratedAs();
Rafael Espindolaf934f982011-05-17 16:26:17 +00001498 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001499 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
Eric Christopher45f2e712012-12-18 00:31:10 +00001500 options::OPT_fno_dwarf2_cfi_asm,
1501 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001502}
1503
Ted Kremenek62093662013-03-12 17:02:12 +00001504static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1505 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001506 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1507 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001508 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001509 return !UseDwarfDirectory;
1510}
1511
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001512/// \brief Check whether the given input tree contains any compilation actions.
1513static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001514 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001515 return true;
1516
1517 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1518 if (ContainsCompileAction(*it))
1519 return true;
1520
1521 return false;
1522}
1523
1524/// \brief Check if -relax-all should be passed to the internal assembler.
1525/// This is done by default when compiling non-assembler source with -O0.
1526static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1527 bool RelaxDefault = true;
1528
1529 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1530 RelaxDefault = A->getOption().matches(options::OPT_O0);
1531
1532 if (RelaxDefault) {
1533 RelaxDefault = false;
1534 for (ActionList::const_iterator it = C.getActions().begin(),
1535 ie = C.getActions().end(); it != ie; ++it) {
1536 if (ContainsCompileAction(*it)) {
1537 RelaxDefault = true;
1538 break;
1539 }
1540 }
1541 }
1542
1543 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1544 RelaxDefault);
1545}
1546
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001547SanitizerArgs::SanitizerArgs(const ToolChain &TC, const ArgList &Args)
Alexey Samsonov29524a92013-01-20 13:12:12 +00001548 : Kind(0), BlacklistFile(""), MsanTrackOrigins(false),
1549 AsanZeroBaseShadow(false) {
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001550 unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
1551 // at least once (possibly, disabled further).
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001552 const Driver &D = TC.getDriver();
Richard Smith52be6192012-11-05 22:04:41 +00001553 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
Alexey Samsonov53f7e122012-11-28 17:34:24 +00001554 unsigned Add, Remove;
1555 if (!parse(D, Args, *I, Add, Remove, true))
Richard Smith52be6192012-11-05 22:04:41 +00001556 continue;
Richard Smith52be6192012-11-05 22:04:41 +00001557 (*I)->claim();
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001558 Kind |= Add;
1559 Kind &= ~Remove;
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001560 AllKinds |= Add;
Richard Smith52be6192012-11-05 22:04:41 +00001561 }
1562
Chad Rosierae229d52013-01-29 23:31:22 +00001563 UbsanTrapOnError =
1564 Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
1565 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1566 options::OPT_fno_sanitize_undefined_trap_on_error, false);
1567
1568 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) &&
1569 !Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1570 options::OPT_fno_sanitize_undefined_trap_on_error, true)) {
1571 D.Diag(diag::err_drv_argument_not_allowed_with)
1572 << "-fcatch-undefined-behavior"
1573 << "-fno-sanitize-undefined-trap-on-error";
1574 }
1575
1576 // Warn about undefined sanitizer options that require runtime support.
1577 if (UbsanTrapOnError && notAllowedWithTrap()) {
1578 if (Args.hasArg(options::OPT_fcatch_undefined_behavior))
1579 D.Diag(diag::err_drv_argument_not_allowed_with)
1580 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1581 << "-fcatch-undefined-behavior";
1582 else if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
1583 options::OPT_fno_sanitize_undefined_trap_on_error,
1584 false))
1585 D.Diag(diag::err_drv_argument_not_allowed_with)
1586 << lastArgumentForKind(D, Args, NotAllowedWithTrap)
1587 << "-fsanitize-undefined-trap-on-error";
1588 }
1589
Richard Smith52be6192012-11-05 22:04:41 +00001590 // Only one runtime library can be used at once.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00001591 bool NeedsAsan = needsAsanRt();
1592 bool NeedsTsan = needsTsanRt();
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001593 bool NeedsMsan = needsMsanRt();
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001594 bool NeedsLsan = needsLeakDetection();
Richard Smith06d87f12012-12-01 01:02:45 +00001595 if (NeedsAsan && NeedsTsan)
Richard Smith52be6192012-11-05 22:04:41 +00001596 D.Diag(diag::err_drv_argument_not_allowed_with)
Richard Smith06d87f12012-12-01 01:02:45 +00001597 << lastArgumentForKind(D, Args, NeedsAsanRt)
1598 << lastArgumentForKind(D, Args, NeedsTsanRt);
Evgeniy Stepanovcdc22552012-12-05 13:37:12 +00001599 if (NeedsAsan && NeedsMsan)
1600 D.Diag(diag::err_drv_argument_not_allowed_with)
1601 << lastArgumentForKind(D, Args, NeedsAsanRt)
1602 << lastArgumentForKind(D, Args, NeedsMsanRt);
1603 if (NeedsTsan && NeedsMsan)
1604 D.Diag(diag::err_drv_argument_not_allowed_with)
1605 << lastArgumentForKind(D, Args, NeedsTsanRt)
1606 << lastArgumentForKind(D, Args, NeedsMsanRt);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001607 if (NeedsLsan && NeedsTsan)
1608 D.Diag(diag::err_drv_argument_not_allowed_with)
1609 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1610 << lastArgumentForKind(D, Args, NeedsTsanRt);
1611 if (NeedsLsan && NeedsMsan)
1612 D.Diag(diag::err_drv_argument_not_allowed_with)
1613 << lastArgumentForKind(D, Args, NeedsLeakDetection)
1614 << lastArgumentForKind(D, Args, NeedsMsanRt);
1615 // FIXME: Currenly -fsanitize=leak is silently ignored in the presence of
1616 // -fsanitize=address. Perhaps it should print an error, or perhaps
1617 // -f(-no)sanitize=leak should change whether leak detection is enabled by
1618 // default in ASan?
Alexey Samsonov0e96bec2012-11-29 22:36:21 +00001619
1620 // If -fsanitize contains extra features of ASan, it should also
Alexey Samsonov2cbcf1a2013-01-28 07:20:44 +00001621 // explicitly contain -fsanitize=address (probably, turned off later in the
1622 // command line).
1623 if ((Kind & AddressFull) != 0 && (AllKinds & Address) == 0)
1624 D.Diag(diag::warn_drv_unused_sanitizer)
1625 << lastArgumentForKind(D, Args, AddressFull)
1626 << "-fsanitize=address";
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001627
1628 // Parse -f(no-)sanitize-blacklist options.
1629 if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist,
1630 options::OPT_fno_sanitize_blacklist)) {
1631 if (BLArg->getOption().matches(options::OPT_fsanitize_blacklist)) {
1632 std::string BLPath = BLArg->getValue();
Rafael Espindola54bbaad2013-06-25 14:48:00 +00001633 if (llvm::sys::fs::exists(BLPath))
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001634 BlacklistFile = BLPath;
1635 else
1636 D.Diag(diag::err_drv_no_such_file) << BLPath;
1637 }
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001638 } else {
1639 // If no -fsanitize-blacklist option is specified, try to look up for
1640 // blacklist in the resource directory.
1641 std::string BLPath;
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001642 if (getDefaultBlacklistForKind(D, Kind, BLPath) &&
Rafael Espindola54bbaad2013-06-25 14:48:00 +00001643 llvm::sys::fs::exists(BLPath))
Alexey Samsonovd26b3332013-02-19 11:25:29 +00001644 BlacklistFile = BLPath;
Alexey Samsonov9ab73622012-12-03 19:12:58 +00001645 }
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001646
1647 // Parse -f(no-)sanitize-memory-track-origins options.
Alexey Samsonov29524a92013-01-20 13:12:12 +00001648 if (NeedsMsan)
Evgeniy Stepanovad8ab3d2012-12-24 08:42:34 +00001649 MsanTrackOrigins =
1650 Args.hasFlag(options::OPT_fsanitize_memory_track_origins,
1651 options::OPT_fno_sanitize_memory_track_origins,
1652 /* Default */false);
Alexey Samsonov29524a92013-01-20 13:12:12 +00001653
1654 // Parse -f(no-)sanitize-address-zero-base-shadow options.
Alexey Samsonov7e434072013-04-09 07:27:44 +00001655 if (NeedsAsan) {
1656 bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
1657 bool ZeroBaseShadowDefault = IsAndroid;
Alexey Samsonov29524a92013-01-20 13:12:12 +00001658 AsanZeroBaseShadow =
Alexey Samsonov7e434072013-04-09 07:27:44 +00001659 Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
1660 options::OPT_fno_sanitize_address_zero_base_shadow,
1661 ZeroBaseShadowDefault);
1662 // Zero-base shadow is a requirement on Android.
1663 if (IsAndroid && !AsanZeroBaseShadow) {
1664 D.Diag(diag::err_drv_argument_not_allowed_with)
1665 << "-fno-sanitize-address-zero-base-shadow"
1666 << lastArgumentForKind(D, Args, Address);
1667 }
1668 }
Richard Smith52be6192012-11-05 22:04:41 +00001669}
1670
Chandler Carruth36381702013-06-23 11:28:48 +00001671static void addProfileRTLinux(
1672 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1673 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1674 Args.hasArg(options::OPT_fprofile_generate) ||
1675 Args.hasArg(options::OPT_fcreate_profile) ||
1676 Args.hasArg(options::OPT_coverage)))
1677 return;
1678
1679 // The profile runtime is located in the Linux library directory and has name
1680 // "libclang_rt.profile-<ArchName>.a".
1681 SmallString<128> LibProfile(TC.getDriver().ResourceDir);
1682 llvm::sys::path::append(
1683 LibProfile, "lib", "linux",
1684 Twine("libclang_rt.profile-") + TC.getArchName() + ".a");
1685
1686 CmdArgs.push_back(Args.MakeArgString(LibProfile));
1687}
1688
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001689static void addSanitizerRTLinkFlagsLinux(
1690 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs,
Richard Smithf3e624c2013-03-23 00:30:08 +00001691 const StringRef Sanitizer, bool BeforeLibStdCXX,
1692 bool ExportSymbols = true) {
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001693 // Sanitizer runtime is located in the Linux library directory and
1694 // has name "libclang_rt.<Sanitizer>-<ArchName>.a".
1695 SmallString<128> LibSanitizer(TC.getDriver().ResourceDir);
1696 llvm::sys::path::append(
1697 LibSanitizer, "lib", "linux",
1698 (Twine("libclang_rt.") + Sanitizer + "-" + TC.getArchName() + ".a"));
Richard Smithcff3cde2013-03-20 23:49:07 +00001699
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001700 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1701 // etc.) so that the linker picks custom versions of the global 'operator
1702 // new' and 'operator delete' symbols. We take the extreme (but simple)
1703 // strategy of inserting it at the front of the link command. It also
1704 // needs to be forced to end up in the executable, so wrap it in
1705 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001706 SmallVector<const char *, 3> LibSanitizerArgs;
1707 LibSanitizerArgs.push_back("-whole-archive");
1708 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
1709 LibSanitizerArgs.push_back("-no-whole-archive");
1710
1711 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1712 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1713
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001714 CmdArgs.push_back("-lpthread");
Evgeniy Stepanov758b5072013-05-24 14:28:03 +00001715 CmdArgs.push_back("-lrt");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001716 CmdArgs.push_back("-ldl");
Richard Smithf3e624c2013-03-23 00:30:08 +00001717
1718 // If possible, use a dynamic symbols file to export the symbols from the
1719 // runtime library. If we can't do so, use -export-dynamic instead to export
1720 // all symbols from the binary.
1721 if (ExportSymbols) {
1722 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1723 CmdArgs.push_back(
1724 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1725 else
1726 CmdArgs.push_back("-export-dynamic");
1727 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001728}
1729
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001730/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1731/// This needs to be called before we add the C run-time (malloc, etc).
1732static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001733 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001734 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001735 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1736 llvm::sys::path::append(LibAsan, "lib", "linux",
1737 (Twine("libclang_rt.asan-") +
1738 TC.getArchName() + "-android.so"));
Matt Beaumont-Gay35439df2012-12-04 21:18:26 +00001739 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001740 } else {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001741 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001742 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "asan", true);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001743 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001744}
1745
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001746/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1747/// This needs to be called before we add the C run-time (malloc, etc).
1748static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1749 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001750 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001751 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001752}
1753
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001754/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
1755/// This needs to be called before we add the C run-time (malloc, etc).
1756static void addMsanRTLinux(const ToolChain &TC, const ArgList &Args,
1757 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001758 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001759 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00001760}
1761
1762/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
1763/// This needs to be called before we add the C run-time (malloc, etc).
1764static void addLsanRTLinux(const ToolChain &TC, const ArgList &Args,
1765 ArgStringList &CmdArgs) {
1766 if (!Args.hasArg(options::OPT_shared))
1767 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00001768}
1769
Richard Smithe30752c2012-10-09 19:52:38 +00001770/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1771/// (Linux).
1772static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
Richard Smithcff3cde2013-03-20 23:49:07 +00001773 ArgStringList &CmdArgs, bool IsCXX,
1774 bool HasOtherSanitizerRt) {
1775 if (Args.hasArg(options::OPT_shared))
1776 return;
1777
1778 // Need a copy of sanitizer_common. This could come from another sanitizer
1779 // runtime; if we're not including one, include our own copy.
1780 if (!HasOtherSanitizerRt)
Richard Smithf3e624c2013-03-23 00:30:08 +00001781 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "san", true, false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001782
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001783 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan", false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001784
1785 // Only include the bits of the runtime which need a C++ ABI library if
1786 // we're linking in C++ mode.
1787 if (IsCXX)
1788 addSanitizerRTLinkFlagsLinux(TC, Args, CmdArgs, "ubsan_cxx", false);
Richard Smithe30752c2012-10-09 19:52:38 +00001789}
1790
Rafael Espindola224dd632011-12-14 21:02:23 +00001791static bool shouldUseFramePointer(const ArgList &Args,
1792 const llvm::Triple &Triple) {
1793 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1794 options::OPT_fomit_frame_pointer))
1795 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1796
Rafael Espindola00b29182011-12-14 21:50:24 +00001797 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001798 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1799 Triple.getArch() == llvm::Triple::x86) &&
1800 Triple.getOS() == llvm::Triple::Linux) {
1801 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1802 if (!A->getOption().matches(options::OPT_O0))
1803 return false;
1804 }
1805
1806 return true;
1807}
1808
Eric Christopherb7d97e92013-04-03 01:58:53 +00001809static bool shouldUseLeafFramePointer(const ArgList &Args,
1810 const llvm::Triple &Triple) {
1811 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
1812 options::OPT_momit_leaf_frame_pointer))
1813 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
1814
1815 // Don't use a leaf frame pointer on linux x86 and x86_64 if optimizing.
1816 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1817 Triple.getArch() == llvm::Triple::x86) &&
1818 Triple.getOS() == llvm::Triple::Linux) {
1819 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1820 if (!A->getOption().matches(options::OPT_O0))
1821 return false;
1822 }
1823
1824 return true;
1825}
1826
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001827/// If the PWD environment variable is set, add a CC1 option to specify the
1828/// debug compilation directory.
1829static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001830 struct stat StatPWDBuf, StatDotBuf;
1831
Benjamin Kramer85f5aa12013-04-27 08:42:33 +00001832 const char *pwd = ::getenv("PWD");
1833 if (!pwd)
1834 return;
1835
1836 if (llvm::sys::path::is_absolute(pwd) &&
Chad Rosiera35d5a32013-04-26 20:49:50 +00001837 stat(pwd, &StatPWDBuf) == 0 &&
1838 stat(".", &StatDotBuf) == 0 &&
1839 StatPWDBuf.st_ino == StatDotBuf.st_ino &&
1840 StatPWDBuf.st_dev == StatDotBuf.st_dev) {
1841 CmdArgs.push_back("-fdebug-compilation-dir");
1842 CmdArgs.push_back(Args.MakeArgString(pwd));
1843 return;
1844 }
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001845
Chad Rosiera35d5a32013-04-26 20:49:50 +00001846 // Fall back to using getcwd.
Benjamin Kramer698d7c82013-04-27 08:12:29 +00001847 SmallString<128> cwd;
1848 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00001849 CmdArgs.push_back("-fdebug-compilation-dir");
1850 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00001851 }
1852}
1853
Eric Christopherd3804002013-02-22 20:12:52 +00001854static const char *SplitDebugName(const ArgList &Args,
1855 const InputInfoList &Inputs) {
1856 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1857 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1858 SmallString<128> T(FinalOutput->getValue());
1859 llvm::sys::path::replace_extension(T, "dwo");
1860 return Args.MakeArgString(T);
1861 } else {
1862 // Use the compilation dir.
1863 SmallString<128> T(Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
1864 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
1865 llvm::sys::path::replace_extension(F, "dwo");
1866 T += F;
1867 return Args.MakeArgString(F);
1868 }
1869}
1870
1871static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
1872 const Tool &T, const JobAction &JA,
1873 const ArgList &Args, const InputInfo &Output,
1874 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00001875 ArgStringList ExtractArgs;
1876 ExtractArgs.push_back("--extract-dwo");
1877
1878 ArgStringList StripArgs;
1879 StripArgs.push_back("--strip-dwo");
1880
1881 // Grabbing the output of the earlier compile step.
1882 StripArgs.push_back(Output.getFilename());
1883 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00001884 ExtractArgs.push_back(OutFile);
1885
1886 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00001887 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00001888
1889 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00001890 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001891
1892 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00001893 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00001894}
1895
Chad Rosierb71f6aa2013-04-24 18:09:54 +00001896static bool isOptimizationLevelFast(const ArgList &Args) {
1897 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1898 if (A->getOption().matches(options::OPT_Ofast))
1899 return true;
1900 return false;
1901}
1902
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001903void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001904 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001905 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001906 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001907 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001908 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1909 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001910 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001911 ArgStringList CmdArgs;
1912
Daniel Dunbare521a892009-03-31 20:53:55 +00001913 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1914
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001915 // Invoke ourselves in -cc1 mode.
1916 //
1917 // FIXME: Implement custom jobs for internal actions.
1918 CmdArgs.push_back("-cc1");
1919
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001920 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001921 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001922 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001923 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001924
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001925 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001926 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001927
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001928 if (isa<AnalyzeJobAction>(JA)) {
1929 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1930 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001931 } else if (isa<MigrateJobAction>(JA)) {
1932 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001933 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001934 if (Output.getType() == types::TY_Dependencies)
1935 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001936 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001937 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00001938 if (Args.hasArg(options::OPT_rewrite_objc) &&
1939 !Args.hasArg(options::OPT_g_Group))
1940 CmdArgs.push_back("-P");
1941 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00001942 } else if (isa<AssembleJobAction>(JA)) {
1943 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001944
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001945 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001946 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001947
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001948 // When using an integrated assembler, translate -Wa, and -Xassembler
1949 // options.
1950 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1951 options::OPT_Xassembler),
1952 ie = Args.filtered_end(); it != ie; ++it) {
1953 const Arg *A = *it;
1954 A->claim();
1955
1956 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001957 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001958
1959 if (Value == "-force_cpusubtype_ALL") {
1960 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001961 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001962 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001963 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001964 CmdArgs.push_back("-mllvm");
1965 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001966 } else if (Value == "--noexecstack") {
1967 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001968 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001969 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001970 << A->getOption().getName() << Value;
1971 }
1972 }
1973 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001974
1975 // Also ignore explicit -force_cpusubtype_ALL option.
1976 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001977 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001978 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001979 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001980
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001981 if (JA.getType() == types::TY_Nothing)
1982 CmdArgs.push_back("-fsyntax-only");
1983 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001984 CmdArgs.push_back("-emit-pch");
1985 else
1986 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001987 } else {
1988 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001989
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001990 if (JA.getType() == types::TY_Nothing) {
1991 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001992 } else if (JA.getType() == types::TY_LLVM_IR ||
1993 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001994 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001995 } else if (JA.getType() == types::TY_LLVM_BC ||
1996 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001997 CmdArgs.push_back("-emit-llvm-bc");
1998 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001999 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002000 } else if (JA.getType() == types::TY_AST) {
2001 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002002 } else if (JA.getType() == types::TY_ModuleFile) {
2003 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002004 } else if (JA.getType() == types::TY_RewrittenObjC) {
2005 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002006 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002007 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2008 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002009 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002010 } else {
2011 assert(JA.getType() == types::TY_PP_Asm &&
2012 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002013 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002014 }
2015
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002016 // The make clang go fast button.
2017 CmdArgs.push_back("-disable-free");
2018
John McCallbb79b5f2010-02-13 03:50:24 +00002019 // Disable the verification pass in -asserts builds.
2020#ifdef NDEBUG
2021 CmdArgs.push_back("-disable-llvm-verifier");
2022#endif
2023
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002024 // Set the main file name, so that debug info works even with
2025 // -save-temps.
2026 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002027 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002028
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002029 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002030 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002031 if (Args.hasArg(options::OPT_static))
2032 CmdArgs.push_back("-static-define");
2033
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002034 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002035 // Enable region store model by default.
2036 CmdArgs.push_back("-analyzer-store=region");
2037
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002038 // Treat blocks as analysis entry points.
2039 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2040
Ted Kremenek49c79792011-03-24 00:28:47 +00002041 CmdArgs.push_back("-analyzer-eagerly-assume");
2042
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002043 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002044 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002045 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002046
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002047 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
2048 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002049
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002050 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002051 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002052
2053 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002054
Jordan Rose10ad0812013-04-05 17:55:07 +00002055 if (types::isCXX(Inputs[0].getType()))
2056 CmdArgs.push_back("-analyzer-checker=cplusplus");
2057
Ted Kremenek37e96522012-01-26 02:27:38 +00002058 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00002059 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
2060 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2061 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2062 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2063 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2064 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002065 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002066
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002067 // Set the output format. The default is plist, for (lame) historical
2068 // reasons.
2069 CmdArgs.push_back("-analyzer-output");
2070 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002071 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002072 else
2073 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002074
Ted Kremenekfe449a22010-03-22 22:32:05 +00002075 // Disable the presentation of standard compiler warnings when
2076 // using --analyze. We only want to show static analyzer diagnostics
2077 // or frontend errors.
2078 CmdArgs.push_back("-w");
2079
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002080 // Add -Xanalyzer arguments when running as analyzer.
2081 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002082 }
2083
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002084 CheckCodeGenerationOptions(D, Args);
2085
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002086 bool PIE = getToolChain().isPIEDefault();
2087 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002088 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002089
Alexey Samsonov090301e2013-04-09 12:28:19 +00002090 // For the PIC and PIE flag options, this logic is different from the
2091 // legacy logic in very old versions of GCC, as that logic was just
2092 // a bug no one had ever fixed. This logic is both more rational and
2093 // consistent with GCC's new logic now that the bugs are fixed. The last
2094 // argument relating to either PIC or PIE wins, and no other argument is
2095 // used. If the last argument is any flavor of the '-fno-...' arguments,
2096 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2097 // at the same level.
2098 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2099 options::OPT_fpic, options::OPT_fno_pic,
2100 options::OPT_fPIE, options::OPT_fno_PIE,
2101 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002102 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2103 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002104 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002105 if (LastPICArg) {
2106 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002107 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2108 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2109 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2110 PIC = PIE || O.matches(options::OPT_fPIC) ||
2111 O.matches(options::OPT_fpic);
2112 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2113 O.matches(options::OPT_fPIC);
2114 } else {
2115 PIE = PIC = false;
2116 }
2117 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002118 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002119
2120 // Inroduce a Darwin-specific hack. If the default is PIC but the flags
2121 // specified while enabling PIC enabled level 1 PIC, just force it back to
2122 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2123 // informal testing).
2124 if (PIC && getToolChain().getTriple().isOSDarwin())
2125 IsPICLevelTwo |= getToolChain().isPICDefault();
2126
Chandler Carruthc0c04552012-04-08 16:40:35 +00002127 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2128 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002129 llvm::Triple Triple(TripleStr);
Eric Christopher8d56caa2013-02-18 01:16:37 +00002130 if (KernelOrKext &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002131 (Triple.getOS() != llvm::Triple::IOS ||
2132 Triple.isOSVersionLT(6)))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002133 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002134 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002135 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002136
Chandler Carruth76a943b2012-11-19 03:52:03 +00002137 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2138 // This is a very special mode. It trumps the other modes, almost no one
2139 // uses it, and it isn't even valid on any OS but Darwin.
2140 if (!getToolChain().getTriple().isOSDarwin())
2141 D.Diag(diag::err_drv_unsupported_opt_for_target)
2142 << A->getSpelling() << getToolChain().getTriple().str();
2143
2144 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2145
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002146 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002147 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002148
Chandler Carruth76a943b2012-11-19 03:52:03 +00002149 // Only a forced PIC mode can cause the actual compile to have PIC defines
2150 // etc., no flags are sufficient. This behavior was selected to closely
2151 // match that of llvm-gcc and Apple GCC before that.
2152 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2153 CmdArgs.push_back("-pic-level");
2154 CmdArgs.push_back("2");
2155 }
2156 } else {
2157 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2158 // handled in Clang's IRGen by the -pie-level flag.
2159 CmdArgs.push_back("-mrelocation-model");
2160 CmdArgs.push_back(PIC ? "pic" : "static");
2161
2162 if (PIC) {
2163 CmdArgs.push_back("-pic-level");
2164 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2165 if (PIE) {
2166 CmdArgs.push_back("-pie-level");
2167 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2168 }
2169 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002170 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002171
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002172 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2173 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002174 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002175
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002176 // LLVM Code Generator Options.
2177
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002178 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2179 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002180 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002181 }
2182
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002183 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2184 options::OPT_freg_struct_return)) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002185 if (getToolChain().getTriple().getArch() != llvm::Triple::x86) {
2186 D.Diag(diag::err_drv_unsupported_opt_for_target)
2187 << A->getSpelling() << getToolChain().getTriple().str();
2188 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2189 CmdArgs.push_back("-fpcc-struct-return");
2190 } else {
2191 assert(A->getOption().matches(options::OPT_freg_struct_return));
2192 CmdArgs.push_back("-freg-struct-return");
2193 }
2194 }
2195
Roman Divacky65b88cd2011-03-01 17:40:53 +00002196 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2197 CmdArgs.push_back("-mrtd");
2198
Rafael Espindola224dd632011-12-14 21:02:23 +00002199 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002200 CmdArgs.push_back("-mdisable-fp-elim");
2201 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2202 options::OPT_fno_zero_initialized_in_bss))
2203 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002204
2205 bool OFastEnabled = isOptimizationLevelFast(Args);
2206 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2207 // enabled. This alias option is being used to simplify the hasFlag logic.
2208 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2209 options::OPT_fstrict_aliasing;
2210 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00002211 options::OPT_fno_strict_aliasing,
2212 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00002213 CmdArgs.push_back("-relaxed-aliasing");
Manman Renc451e572013-04-04 21:53:22 +00002214 if (Args.hasArg(options::OPT_fstruct_path_tbaa))
2215 CmdArgs.push_back("-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002216 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2217 false))
2218 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002219 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2220 options::OPT_fno_optimize_sibling_calls))
2221 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002222
Eric Christopher006208c2013-04-04 06:29:47 +00002223 // Handle segmented stacks.
2224 if (Args.hasArg(options::OPT_fsplit_stack))
2225 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002226
2227 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2228 // This alias option is being used to simplify the getLastArg logic.
2229 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2230 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002231
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002232 // Handle various floating point optimization flags, mapping them to the
2233 // appropriate LLVM code generation flags. The pattern for all of these is to
2234 // default off the codegen optimizations, and if any flag enables them and no
2235 // flag disables them after the flag enabling them, enable the codegen
2236 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002237 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002238 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002239 options::OPT_ffinite_math_only,
2240 options::OPT_fno_finite_math_only,
2241 options::OPT_fhonor_infinities,
2242 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002243 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2244 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002245 A->getOption().getID() != options::OPT_fhonor_infinities)
2246 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002247 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002248 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002249 options::OPT_ffinite_math_only,
2250 options::OPT_fno_finite_math_only,
2251 options::OPT_fhonor_nans,
2252 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002253 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2254 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002255 A->getOption().getID() != options::OPT_fhonor_nans)
2256 CmdArgs.push_back("-menable-no-nans");
2257
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002258 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2259 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002261 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002262 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002263 options::OPT_fno_math_errno)) {
2264 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2265 // However, turning *off* -ffast_math merely restores the toolchain default
2266 // (which may be false).
2267 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2268 A->getOption().getID() == options::OPT_ffast_math ||
2269 A->getOption().getID() == options::OPT_Ofast)
2270 MathErrno = false;
2271 else if (A->getOption().getID() == options::OPT_fmath_errno)
2272 MathErrno = true;
2273 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002274 if (MathErrno)
2275 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002276
2277 // There are several flags which require disabling very specific
2278 // optimizations. Any of these being disabled forces us to turn off the
2279 // entire set of LLVM optimizations, so collect them through all the flag
2280 // madness.
2281 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002282 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002283 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002284 options::OPT_funsafe_math_optimizations,
2285 options::OPT_fno_unsafe_math_optimizations,
2286 options::OPT_fassociative_math,
2287 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002288 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2289 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002290 A->getOption().getID() != options::OPT_fno_associative_math)
2291 AssociativeMath = true;
2292 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002293 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002294 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002295 options::OPT_funsafe_math_optimizations,
2296 options::OPT_fno_unsafe_math_optimizations,
2297 options::OPT_freciprocal_math,
2298 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002299 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2300 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002301 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2302 ReciprocalMath = true;
2303 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002304 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002305 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002306 options::OPT_funsafe_math_optimizations,
2307 options::OPT_fno_unsafe_math_optimizations,
2308 options::OPT_fsigned_zeros,
2309 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002310 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2311 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002312 A->getOption().getID() != options::OPT_fsigned_zeros)
2313 SignedZeros = false;
2314 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002315 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002316 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002317 options::OPT_funsafe_math_optimizations,
2318 options::OPT_fno_unsafe_math_optimizations,
2319 options::OPT_ftrapping_math,
2320 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002321 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2322 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002323 A->getOption().getID() != options::OPT_ftrapping_math)
2324 TrappingMath = false;
2325 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2326 !TrappingMath)
2327 CmdArgs.push_back("-menable-unsafe-fp-math");
2328
Lang Hamesaa53b932012-07-06 00:59:19 +00002329
2330 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002331 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002332 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002333 options::OPT_ffp_contract)) {
2334 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002335 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002336 if (Val == "fast" || Val == "on" || Val == "off") {
2337 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2338 } else {
2339 D.Diag(diag::err_drv_unsupported_option_argument)
2340 << A->getOption().getName() << Val;
2341 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002342 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2343 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002344 // If fast-math is set then set the fp-contract mode to fast.
2345 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2346 }
2347 }
2348
Bob Wilson6a039162012-07-19 03:52:53 +00002349 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2350 // and if we find them, tell the frontend to provide the appropriate
2351 // preprocessor macros. This is distinct from enabling any optimizations as
2352 // these options induce language changes which must survive serialization
2353 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002354 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2355 options::OPT_fno_fast_math))
2356 if (!A->getOption().matches(options::OPT_fno_fast_math))
2357 CmdArgs.push_back("-ffast-math");
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002358 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2359 if (A->getOption().matches(options::OPT_ffinite_math_only))
2360 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002361
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002362 // Decide whether to use verbose asm. Verbose assembly is the default on
2363 // toolchains which have the integrated assembler on by default.
2364 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2365 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002366 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002367 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002368 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002369
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002370 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2371 CmdArgs.push_back("-mdebug-pass");
2372 CmdArgs.push_back("Structure");
2373 }
2374 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2375 CmdArgs.push_back("-mdebug-pass");
2376 CmdArgs.push_back("Arguments");
2377 }
2378
John McCall8517abc2010-02-19 02:45:38 +00002379 // Enable -mconstructor-aliases except on darwin, where we have to
2380 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002381 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002382 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002383
John McCall7ef5cb32011-03-18 02:56:14 +00002384 // Darwin's kernel doesn't support guard variables; just die if we
2385 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002386 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002387 CmdArgs.push_back("-fforbid-guard-variables");
2388
Douglas Gregordbe39272011-02-01 15:15:22 +00002389 if (Args.hasArg(options::OPT_mms_bitfields)) {
2390 CmdArgs.push_back("-mms-bitfields");
2391 }
John McCall8517abc2010-02-19 02:45:38 +00002392
Daniel Dunbar306945d2009-09-16 06:17:29 +00002393 // This is a coarse approximation of what llvm-gcc actually does, both
2394 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2395 // complicated ways.
2396 bool AsynchronousUnwindTables =
2397 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2398 options::OPT_fno_asynchronous_unwind_tables,
2399 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002400 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002401 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2402 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002403 CmdArgs.push_back("-munwind-tables");
2404
Chandler Carruth05fb5852012-11-21 23:40:23 +00002405 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002406
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002407 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2408 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002409 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002410 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002411
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002412 // FIXME: Handle -mtune=.
2413 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002414
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002415 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002416 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002417 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002418 }
2419
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002420 // Add target specific cpu and features flags.
2421 switch(getToolChain().getTriple().getArch()) {
2422 default:
2423 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002424
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002425 case llvm::Triple::arm:
2426 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002427 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002428 break;
2429
Eric Christopher0b26a612010-03-02 02:41:08 +00002430 case llvm::Triple::mips:
2431 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002432 case llvm::Triple::mips64:
2433 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002434 AddMIPSTargetArgs(Args, CmdArgs);
2435 break;
2436
Hal Finkel8eb59282012-06-11 22:35:19 +00002437 case llvm::Triple::ppc:
2438 case llvm::Triple::ppc64:
2439 AddPPCTargetArgs(Args, CmdArgs);
2440 break;
2441
Tom Stellard6674c702013-04-01 20:56:53 +00002442 case llvm::Triple::r600:
2443 AddR600TargetArgs(Args, CmdArgs);
2444 break;
2445
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002446 case llvm::Triple::sparc:
2447 AddSparcTargetArgs(Args, CmdArgs);
2448 break;
2449
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002450 case llvm::Triple::x86:
2451 case llvm::Triple::x86_64:
2452 AddX86TargetArgs(Args, CmdArgs);
2453 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002454
2455 case llvm::Triple::hexagon:
2456 AddHexagonTargetArgs(Args, CmdArgs);
2457 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002458 }
2459
Tony Linthicum76329bf2011-12-12 21:14:55 +00002460
2461
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002462 // Pass the linker version in use.
2463 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2464 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002465 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002466 }
2467
Eric Christopherb7d97e92013-04-03 01:58:53 +00002468 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002469 CmdArgs.push_back("-momit-leaf-frame-pointer");
2470
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002471 // Explicitly error on some things we know we don't support and can't just
2472 // ignore.
2473 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002474 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2475 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002476 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002477 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002478 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002479 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2480 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002481 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002482 << Unsupported->getOption().getName();
2483 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002484 }
2485
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002486 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002487 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002488 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002489 CmdArgs.push_back("-header-include-file");
2490 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2491 D.CCPrintHeadersFilename : "-");
2492 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002493 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002494 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002495
Chad Rosierbe10f982011-08-02 17:58:04 +00002496 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002497 CmdArgs.push_back("-diagnostic-log-file");
2498 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2499 D.CCLogDiagnosticsFilename : "-");
2500 }
2501
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002502 // Use the last option from "-g" group. "-gline-tables-only"
2503 // is preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002504 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002505 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002506 if (A->getOption().matches(options::OPT_gline_tables_only))
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002507 CmdArgs.push_back("-gline-tables-only");
Manman Ren9691f7f2013-06-19 01:46:49 +00002508 else if (A->getOption().matches(options::OPT_gdwarf_2))
2509 CmdArgs.push_back("-gdwarf-2");
2510 else if (A->getOption().matches(options::OPT_gdwarf_3))
2511 CmdArgs.push_back("-gdwarf-3");
2512 else if (A->getOption().matches(options::OPT_gdwarf_4))
2513 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002514 else if (!A->getOption().matches(options::OPT_g0) &&
2515 !A->getOption().matches(options::OPT_ggdb0))
Chad Rosier8fe3b112011-11-07 19:52:29 +00002516 CmdArgs.push_back("-g");
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002517 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002518
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002519 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2520 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002521 if (Args.hasArg(options::OPT_gcolumn_info))
2522 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002523
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002524 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2525 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002526 // FIXME: Currently only works on Linux.
2527 if (getToolChain().getTriple().getOS() == llvm::Triple::Linux &&
2528 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002529 CmdArgs.push_back("-g");
2530 CmdArgs.push_back("-backend-option");
2531 CmdArgs.push_back("-split-dwarf=Enable");
2532 }
2533
Eric Christophereec89c22013-06-18 00:03:50 +00002534
2535 Args.AddAllArgs(CmdArgs, options::OPT_fdebug_types_section);
2536
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002537 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2538 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2539
Chris Lattner3c77a352010-06-22 00:03:40 +00002540 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2541
Nick Lewycky207bce32011-04-21 23:44:07 +00002542 if (Args.hasArg(options::OPT_ftest_coverage) ||
2543 Args.hasArg(options::OPT_coverage))
2544 CmdArgs.push_back("-femit-coverage-notes");
2545 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2546 Args.hasArg(options::OPT_coverage))
2547 CmdArgs.push_back("-femit-coverage-data");
2548
Nick Lewycky480cb992011-05-04 20:46:58 +00002549 if (C.getArgs().hasArg(options::OPT_c) ||
2550 C.getArgs().hasArg(options::OPT_S)) {
2551 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002552 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00002553 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00002554 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
2555 if (const char *pwd = ::getenv("PWD")) {
2556 if (llvm::sys::path::is_absolute(pwd)) {
2557 SmallString<128> Pwd(pwd);
2558 llvm::sys::path::append(Pwd, CoverageFilename.str());
2559 CoverageFilename.swap(Pwd);
2560 }
2561 }
2562 }
Eric Christophere30f61c2013-02-22 00:24:40 +00002563 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002564 }
2565 }
2566
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002567 // Pass options for controlling the default header search paths.
2568 if (Args.hasArg(options::OPT_nostdinc)) {
2569 CmdArgs.push_back("-nostdsysteminc");
2570 CmdArgs.push_back("-nobuiltininc");
2571 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002572 if (Args.hasArg(options::OPT_nostdlibinc))
2573 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002574 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2575 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2576 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002577
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002578 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002579 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002580 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002581
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002582 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2583
Ted Kremenekf7639e12012-03-06 20:06:33 +00002584 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002585 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002586 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002587 options::OPT_ccc_arcmt_modify,
2588 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002589 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002590 switch (A->getOption().getID()) {
2591 default:
2592 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002593 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002594 CmdArgs.push_back("-arcmt-check");
2595 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002596 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002597 CmdArgs.push_back("-arcmt-modify");
2598 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002599 case options::OPT_ccc_arcmt_migrate:
2600 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002601 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002602 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002603
2604 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2605 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002606 break;
John McCalld70fb982011-06-15 23:25:17 +00002607 }
2608 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00002609 } else {
2610 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
2611 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
2612 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00002613 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002614
Ted Kremenekf7639e12012-03-06 20:06:33 +00002615 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2616 if (ARCMTEnabled) {
2617 D.Diag(diag::err_drv_argument_not_allowed_with)
2618 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2619 }
2620 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002621 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002622
2623 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2624 options::OPT_objcmt_migrate_subscripting)) {
2625 // None specified, means enable them all.
2626 CmdArgs.push_back("-objcmt-migrate-literals");
2627 CmdArgs.push_back("-objcmt-migrate-subscripting");
2628 } else {
2629 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2630 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2631 }
2632 }
2633
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002634 // Add preprocessing options like -I, -D, etc. if we are using the
2635 // preprocessor.
2636 //
2637 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002638 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00002639 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002640
Rafael Espindolaa7431922011-07-21 23:40:37 +00002641 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2642 // that "The compiler can only warn and ignore the option if not recognized".
2643 // When building with ccache, it will pass -D options to clang even on
2644 // preprocessed inputs and configure concludes that -fPIC is not supported.
2645 Args.ClaimAllArgs(options::OPT_D);
2646
Daniel Dunbar58f78332009-09-17 06:53:36 +00002647 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002648 // others.
2649 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002650 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002651 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002652 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002653 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002654 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002655 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002656 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002657 }
2658
Chad Rosier86b82082012-12-12 20:06:31 +00002659 // Don't warn about unused -flto. This can happen when we're preprocessing or
2660 // precompiling.
2661 Args.ClaimAllArgs(options::OPT_flto);
2662
Daniel Dunbar945577c2009-10-29 02:24:45 +00002663 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002664 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2665 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002666 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002667 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002668
2669 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2670 // (-ansi is equivalent to -std=c89).
2671 //
2672 // If a std is supplied, only add -trigraphs if it follows the
2673 // option.
2674 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2675 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002676 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002677 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002678 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002679 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002680 else
2681 Std->render(Args, CmdArgs);
2682
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002683 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2684 options::OPT_trigraphs))
2685 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002686 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002687 } else {
2688 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002689 //
2690 // FIXME: Clang doesn't correctly handle -std= when the input language
2691 // doesn't match. For the time being just ignore this for C++ inputs;
2692 // eventually we want to do all the standard defaulting here instead of
2693 // splitting it between the driver and clang -cc1.
2694 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002695 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2696 "-std=", /*Joined=*/true);
2697 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2698 CmdArgs.push_back("-std=c++11");
2699
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002700 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002701 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002702
Chandler Carruthb009b142011-04-23 06:30:43 +00002703 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2704 // '-fconst-strings'; this better indicates its actual behavior.
2705 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2706 false)) {
2707 // For perfect compatibility with GCC, we do this even in the presence of
2708 // '-w'. This flag names something other than a warning for GCC.
2709 CmdArgs.push_back("-fconst-strings");
2710 }
2711
Chandler Carruth61fbf622011-04-23 09:27:53 +00002712 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002713 // during C++ compilation, which it is by default. GCC keeps this define even
2714 // in the presence of '-w', match this behavior bug-for-bug.
2715 if (types::isCXX(InputType) &&
2716 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2717 true)) {
2718 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002719 }
2720
Chandler Carruthe0391482010-05-22 02:21:53 +00002721 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2722 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2723 if (Asm->getOption().matches(options::OPT_fasm))
2724 CmdArgs.push_back("-fgnu-keywords");
2725 else
2726 CmdArgs.push_back("-fno-gnu-keywords");
2727 }
2728
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002729 if (ShouldDisableCFI(Args, getToolChain()))
2730 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002731
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002732 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2733 CmdArgs.push_back("-fno-dwarf-directory-asm");
2734
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002735 if (ShouldDisableAutolink(Args, getToolChain()))
2736 CmdArgs.push_back("-fno-autolink");
2737
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002738 // Add in -fdebug-compilation-dir if necessary.
2739 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00002740
Richard Smith9a568822011-11-21 19:36:32 +00002741 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2742 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002743 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002744 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002745 }
2746
Richard Smith9a568822011-11-21 19:36:32 +00002747 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2748 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002749 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002750 }
2751
Richard Smitha3d3bd22013-05-08 02:12:03 +00002752 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
2753 CmdArgs.push_back("-fconstexpr-steps");
2754 CmdArgs.push_back(A->getValue());
2755 }
2756
Richard Smithb3a14522013-02-22 01:59:51 +00002757 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
2758 CmdArgs.push_back("-fbracket-depth");
2759 CmdArgs.push_back(A->getValue());
2760 }
2761
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002762 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2763 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002764 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002765 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002766 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2767 } else
2768 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002769 }
2770
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002771
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002772 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002773 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002774
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002775 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2776 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002777 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002778 }
David Chisnall5778fce2009-08-31 16:41:57 +00002779
Chris Lattnere23003d2010-01-09 21:54:33 +00002780 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2781 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002782 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002783 }
2784
Chris Lattnerb35583d2010-04-07 20:49:23 +00002785 CmdArgs.push_back("-ferror-limit");
2786 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002787 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002788 else
2789 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002790
Chandler Carrutha77a7272010-05-06 04:55:18 +00002791 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2792 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002793 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002794 }
2795
2796 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2797 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002798 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002799 }
2800
Richard Smithf6f003a2011-12-16 19:06:07 +00002801 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2802 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002803 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002804 }
2805
Daniel Dunbar2c978472009-11-04 06:24:47 +00002806 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002807 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002808 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002809 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002810 } else {
2811 // If -fmessage-length=N was not specified, determine whether this is a
2812 // terminal and, if so, implicitly define -fmessage-length appropriately.
2813 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002814 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002815 }
2816
John McCallb4a99d32013-02-19 01:57:35 +00002817 // -fvisibility= and -fvisibility-ms-compat are of a piece.
2818 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
2819 options::OPT_fvisibility_ms_compat)) {
2820 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
2821 CmdArgs.push_back("-fvisibility");
2822 CmdArgs.push_back(A->getValue());
2823 } else {
2824 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
2825 CmdArgs.push_back("-fvisibility");
2826 CmdArgs.push_back("hidden");
2827 CmdArgs.push_back("-ftype-visibility");
2828 CmdArgs.push_back("default");
2829 }
Daniel Dunbare357d562009-12-03 18:42:11 +00002830 }
2831
Douglas Gregor08329632010-06-15 17:05:35 +00002832 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002833
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002834 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2835
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002836 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002837 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2838 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002839 CmdArgs.push_back("-ffreestanding");
2840
Daniel Dunbare357d562009-12-03 18:42:11 +00002841 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002842 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002843 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002844 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002845 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002846 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002847 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002848 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2849 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002850
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002851 SanitizerArgs Sanitize(getToolChain(), Args);
Richard Smith52be6192012-11-05 22:04:41 +00002852 Sanitize.addArgs(Args, CmdArgs);
2853
Will Dietz3676d562012-12-30 20:53:28 +00002854 if (!Args.hasFlag(options::OPT_fsanitize_recover,
2855 options::OPT_fno_sanitize_recover,
2856 true))
2857 CmdArgs.push_back("-fno-sanitize-recover");
2858
Chad Rosierae229d52013-01-29 23:31:22 +00002859 if (Args.hasArg(options::OPT_fcatch_undefined_behavior) ||
2860 Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
2861 options::OPT_fno_sanitize_undefined_trap_on_error, false))
2862 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
2863
Eric Christopher459d2712013-02-19 06:16:53 +00002864 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00002865 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2866 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2867 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2868 D.Diag(diag::err_drv_argument_only_allowed_with)
2869 << A->getAsString(Args) << "ppc/ppc64";
2870
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002871 if (getToolChain().SupportsProfiling())
2872 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002873
2874 // -flax-vector-conversions is default.
2875 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2876 options::OPT_fno_lax_vector_conversions))
2877 CmdArgs.push_back("-fno-lax-vector-conversions");
2878
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002879 if (Args.getLastArg(options::OPT_fapple_kext))
2880 CmdArgs.push_back("-fapple-kext");
2881
David Blaikie690f21e2012-06-14 18:55:27 +00002882 if (Args.hasFlag(options::OPT_frewrite_includes,
2883 options::OPT_fno_rewrite_includes, false))
2884 CmdArgs.push_back("-frewrite-includes");
2885
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002886 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002887 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002888 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002889 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2890 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002891
2892 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2893 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002894 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002895 }
2896
Bob Wilson14adb362012-02-03 06:27:22 +00002897 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002898
Chandler Carruth6e501032011-03-27 00:04:55 +00002899 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2900 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2901 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2902 options::OPT_fno_wrapv)) {
2903 if (A->getOption().matches(options::OPT_fwrapv))
2904 CmdArgs.push_back("-fwrapv");
2905 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2906 options::OPT_fno_strict_overflow)) {
2907 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2908 CmdArgs.push_back("-fwrapv");
2909 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002910 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002911 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002912
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002913 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2914
Mahesha S6a682be42012-10-27 07:47:56 +00002915
Daniel Dunbar4930e332009-11-17 08:07:36 +00002916 // -stack-protector=0 is default.
2917 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002918 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2919 options::OPT_fstack_protector_all,
2920 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002921 if (A->getOption().matches(options::OPT_fstack_protector))
2922 StackProtectorLevel = 1;
2923 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2924 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002925 } else {
2926 StackProtectorLevel =
2927 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2928 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002929 if (StackProtectorLevel) {
2930 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002931 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002932 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002933
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002934 // --param ssp-buffer-size=
2935 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2936 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002937 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002938 if (Str.startswith("ssp-buffer-size=")) {
2939 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002940 CmdArgs.push_back("-stack-protector-buffer-size");
2941 // FIXME: Verify the argument is a valid integer.
2942 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002943 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002944 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002945 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002946 }
2947
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002948 // Translate -mstackrealign
2949 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2950 false)) {
2951 CmdArgs.push_back("-backend-option");
2952 CmdArgs.push_back("-force-align-stack");
2953 }
2954 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2955 false)) {
2956 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2957 }
2958
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002959 if (Args.hasArg(options::OPT_mstack_alignment)) {
2960 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2961 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002962 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00002963 // -mkernel implies -mstrict-align; don't add the redundant option.
2964 if (Args.hasArg(options::OPT_mstrict_align) && !KernelOrKext) {
Chad Rosierd87e4f72012-11-09 18:27:01 +00002965 CmdArgs.push_back("-backend-option");
2966 CmdArgs.push_back("-arm-strict-align");
Chad Rosier60027022012-11-09 17:29:19 +00002967 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002968
Daniel Dunbard18049a2009-04-07 21:16:11 +00002969 // Forward -f options with positive and negative forms; we translate
2970 // these by hand.
2971
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002972 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002973 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002974 CmdArgs.push_back("-fapple-kext");
2975 if (!Args.hasArg(options::OPT_fbuiltin))
2976 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002977 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002978 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002979 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002980 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002981 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002982
Nuno Lopes13c88c72009-12-16 16:59:22 +00002983 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2984 options::OPT_fno_assume_sane_operator_new))
2985 CmdArgs.push_back("-fno-assume-sane-operator-new");
2986
Daniel Dunbar4930e332009-11-17 08:07:36 +00002987 // -fblocks=0 is default.
2988 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002989 getToolChain().IsBlocksDefault()) ||
2990 (Args.hasArg(options::OPT_fgnu_runtime) &&
2991 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2992 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002993 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002994
2995 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2996 !getToolChain().hasBlocksRuntime())
2997 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002998 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002999
Douglas Gregor226173a2012-01-18 15:19:58 +00003000 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3001 // users must also pass -fcxx-modules. The latter flag will disappear once the
3002 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003003 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003004 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3005 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3006 options::OPT_fno_cxx_modules,
3007 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003008 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003009 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003010 HaveModules = true;
3011 }
3012 }
3013
Douglas Gregor35b04d62013-02-07 19:01:24 +00003014 // If a module path was provided, pass it along. Otherwise, use a temporary
3015 // directory.
3016 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) {
3017 A->claim();
3018 if (HaveModules) {
3019 A->render(Args, CmdArgs);
3020 }
3021 } else if (HaveModules) {
3022 SmallString<128> DefaultModuleCache;
3023 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3024 DefaultModuleCache);
Douglas Gregor23c7d672013-03-21 21:48:48 +00003025 llvm::sys::path::append(DefaultModuleCache, "org.llvm.clang");
3026 llvm::sys::path::append(DefaultModuleCache, "ModuleCache");
Douglas Gregor4bedb492013-02-07 22:59:12 +00003027 const char Arg[] = "-fmodules-cache-path=";
3028 DefaultModuleCache.insert(DefaultModuleCache.begin(),
3029 Arg, Arg + strlen(Arg));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003030 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
3031 }
3032
3033 // Pass through all -fmodules-ignore-macro arguments.
3034 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003035 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3036 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003037
John McCalldfea9982010-04-09 19:12:06 +00003038 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003039 if (Args.hasFlag(options::OPT_fno_access_control,
3040 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003041 false))
John McCall3155f572010-04-09 19:03:51 +00003042 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003043
Anders Carlssond470fef2010-11-21 00:09:52 +00003044 // -felide-constructors is the default.
3045 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3046 options::OPT_felide_constructors,
3047 false))
3048 CmdArgs.push_back("-fno-elide-constructors");
3049
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003050 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003051 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003052 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003053 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003054
Richard Smith52be6192012-11-05 22:04:41 +00003055 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003056 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003057 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003058 Args.getLastArg(options::OPT_mkernel,
3059 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003060 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003061 D.Diag(diag::err_drv_argument_not_allowed_with)
3062 << "-fsanitize=vptr" << NoRttiArg;
3063 }
3064 }
3065
Tony Linthicum76329bf2011-12-12 21:14:55 +00003066 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003067 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003068 options::OPT_fno_short_enums,
3069 getToolChain().getTriple().getArch() ==
3070 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003071 CmdArgs.push_back("-fshort-enums");
3072
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003073 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003074 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003075 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003076 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003077
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003078 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003079 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003080 options::OPT_fno_threadsafe_statics))
3081 CmdArgs.push_back("-fno-threadsafe-statics");
3082
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003083 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003084 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3085 options::OPT_fno_use_cxa_atexit,
3086 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00003087 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00003088 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
3089 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003090 CmdArgs.push_back("-fno-use-cxa-atexit");
3091
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003092 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003093 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003094 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
3095 CmdArgs.push_back("-fms-extensions");
3096
Francois Pichet1b4f1632011-09-17 04:32:15 +00003097 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003098 if (Args.hasFlag(options::OPT_fms_compatibility,
3099 options::OPT_fno_ms_compatibility,
3100 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
3101 Args.hasFlag(options::OPT_fms_extensions,
3102 options::OPT_fno_ms_extensions,
3103 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003104 CmdArgs.push_back("-fms-compatibility");
3105
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003106 // -fmsc-version=1300 is default.
3107 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3108 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
3109 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003110 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003111 if (msc_ver.empty())
3112 CmdArgs.push_back("-fmsc-version=1300");
3113 else
3114 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3115 }
3116
3117
Eric Christopher5ecce122013-02-18 00:38:31 +00003118 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003119 if (Args.hasFlag(options::OPT_fborland_extensions,
3120 options::OPT_fno_borland_extensions, false))
3121 CmdArgs.push_back("-fborland-extensions");
3122
Francois Pichet02744872011-09-01 16:38:08 +00003123 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3124 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003125 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
3126 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00003127 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003128 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003129
Chandler Carruthe03aa552010-04-17 20:17:31 +00003130 // -fgnu-keywords default varies depending on language; only pass if
3131 // specified.
3132 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003133 options::OPT_fno_gnu_keywords))
3134 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003135
Rafael Espindola922a6242011-06-02 17:30:53 +00003136 if (Args.hasFlag(options::OPT_fgnu89_inline,
3137 options::OPT_fno_gnu89_inline,
3138 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003139 CmdArgs.push_back("-fgnu89-inline");
3140
Chad Rosier9c76d242012-03-15 22:31:42 +00003141 if (Args.hasArg(options::OPT_fno_inline))
3142 CmdArgs.push_back("-fno-inline");
3143
Chad Rosier64d6be92012-03-06 21:17:19 +00003144 if (Args.hasArg(options::OPT_fno_inline_functions))
3145 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003146
John McCall5fb5df92012-06-20 06:18:46 +00003147 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003148
John McCall5fb5df92012-06-20 06:18:46 +00003149 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
3150 // legacy is the default.
3151 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003152 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3153 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003154 objcRuntime.isLegacyDispatchDefaultForArch(
3155 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003156 if (getToolChain().UseObjCMixedDispatch())
3157 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3158 else
3159 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3160 }
3161 }
3162
Nico Weber97bd94b2012-03-09 21:19:44 +00003163 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
3164 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00003165 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00003166 CmdArgs.push_back("-fobjc-default-synthesize-properties");
3167 }
3168
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003169 // -fencode-extended-block-signature=1 is default.
3170 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3171 CmdArgs.push_back("-fencode-extended-block-signature");
3172 }
3173
John McCall24fc0de2011-07-06 00:26:06 +00003174 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3175 // NOTE: This logic is duplicated in ToolChains.cpp.
3176 bool ARC = isObjCAutoRefCount(Args);
3177 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003178 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003179
John McCall24fc0de2011-07-06 00:26:06 +00003180 CmdArgs.push_back("-fobjc-arc");
3181
Chandler Carruth491db322011-11-04 07:34:47 +00003182 // FIXME: It seems like this entire block, and several around it should be
3183 // wrapped in isObjC, but for now we just use it here as this is where it
3184 // was being used previously.
3185 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3186 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3187 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3188 else
3189 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3190 }
3191
John McCall24fc0de2011-07-06 00:26:06 +00003192 // Allow the user to enable full exceptions code emission.
3193 // We define off for Objective-CC, on for Objective-C++.
3194 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3195 options::OPT_fno_objc_arc_exceptions,
3196 /*default*/ types::isCXX(InputType)))
3197 CmdArgs.push_back("-fobjc-arc-exceptions");
3198 }
3199
3200 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3201 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003202 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003203 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003204
John McCall24fc0de2011-07-06 00:26:06 +00003205 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3206 // takes precedence.
3207 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3208 if (!GCArg)
3209 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3210 if (GCArg) {
3211 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003212 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003213 << GCArg->getAsString(Args);
3214 } else if (getToolChain().SupportsObjCGC()) {
3215 GCArg->render(Args, CmdArgs);
3216 } else {
3217 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003218 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003219 << GCArg->getAsString(Args);
3220 }
3221 }
3222
John McCallb5f652e2011-06-22 00:53:57 +00003223 // Add exception args.
3224 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003225 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003226
3227 if (getToolChain().UseSjLjExceptions())
3228 CmdArgs.push_back("-fsjlj-exceptions");
3229
3230 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003231 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3232 options::OPT_fno_assume_sane_operator_new))
3233 CmdArgs.push_back("-fno-assume-sane-operator-new");
3234
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003235 // -fconstant-cfstrings is default, and may be subject to argument translation
3236 // on Darwin.
3237 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3238 options::OPT_fno_constant_cfstrings) ||
3239 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3240 options::OPT_mno_constant_cfstrings))
3241 CmdArgs.push_back("-fno-constant-cfstrings");
3242
John Thompsoned4e2952009-11-05 20:14:16 +00003243 // -fshort-wchar default varies depending on platform; only
3244 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003245 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
3246 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003247
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00003248 // -fno-pascal-strings is default, only pass non-default. If the tool chain
3249 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00003250 //
3251 // FIXME: This is gross; that translation should be pulled from the
3252 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003253 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003254 options::OPT_fno_pascal_strings,
3255 false) ||
3256 Args.hasFlag(options::OPT_mpascal_strings,
3257 options::OPT_mno_pascal_strings,
3258 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003259 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003260
Daniel Dunbar096ed292011-10-05 21:04:55 +00003261 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3262 // -fno-pack-struct doesn't apply to -fpack-struct=.
3263 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003264 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003265 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003266 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003267 } else if (Args.hasFlag(options::OPT_fpack_struct,
3268 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003269 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003270 }
3271
Eric Christopher8d56caa2013-02-18 01:16:37 +00003272 if (KernelOrKext) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003273 if (!Args.hasArg(options::OPT_fcommon))
3274 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003275 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003276 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003277
Daniel Dunbard18049a2009-04-07 21:16:11 +00003278 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003279 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003280 CmdArgs.push_back("-fno-common");
3281
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003282 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003283 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003284 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003285 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003286 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003287 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3288
Daniel Dunbar6358d682010-10-15 22:30:42 +00003289 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3290 if (!Args.hasFlag(options::OPT_ffor_scope,
3291 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003292 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003293 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3294
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003295 // -fcaret-diagnostics is default.
3296 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3297 options::OPT_fno_caret_diagnostics, true))
3298 CmdArgs.push_back("-fno-caret-diagnostics");
3299
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003300 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003301 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003302 options::OPT_fno_diagnostics_fixit_info))
3303 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003304
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003305 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003306 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003307 options::OPT_fno_diagnostics_show_option))
3308 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003309
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003310 if (const Arg *A =
3311 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3312 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003313 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003314 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003315
Douglas Gregor643c9222011-05-21 17:07:29 +00003316 if (const Arg *A =
3317 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3318 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003319 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003320 }
3321
Chandler Carruthb6766f02011-03-27 01:50:55 +00003322 if (Arg *A = Args.getLastArg(
3323 options::OPT_fdiagnostics_show_note_include_stack,
3324 options::OPT_fno_diagnostics_show_note_include_stack)) {
3325 if (A->getOption().matches(
3326 options::OPT_fdiagnostics_show_note_include_stack))
3327 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3328 else
3329 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3330 }
3331
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003332 // Color diagnostics are the default, unless the terminal doesn't support
3333 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003334 // Support both clang's -f[no-]color-diagnostics and gcc's
3335 // -f[no-]diagnostics-colors[=never|always|auto].
3336 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
3337 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
3338 it != ie; ++it) {
3339 const Option &O = (*it)->getOption();
3340 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3341 !O.matches(options::OPT_fdiagnostics_color) &&
3342 !O.matches(options::OPT_fno_color_diagnostics) &&
3343 !O.matches(options::OPT_fno_diagnostics_color) &&
3344 !O.matches(options::OPT_fdiagnostics_color_EQ))
3345 continue;
3346
3347 (*it)->claim();
3348 if (O.matches(options::OPT_fcolor_diagnostics) ||
3349 O.matches(options::OPT_fdiagnostics_color)) {
3350 ShowColors = Colors_On;
3351 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3352 O.matches(options::OPT_fno_diagnostics_color)) {
3353 ShowColors = Colors_Off;
3354 } else {
3355 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
3356 StringRef value((*it)->getValue());
3357 if (value == "always")
3358 ShowColors = Colors_On;
3359 else if (value == "never")
3360 ShowColors = Colors_Off;
3361 else if (value == "auto")
3362 ShowColors = Colors_Auto;
3363 else
3364 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3365 << ("-fdiagnostics-color=" + value).str();
3366 }
3367 }
3368 if (ShowColors == Colors_On ||
3369 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003370 CmdArgs.push_back("-fcolor-diagnostics");
3371
Daniel Dunbardb097022009-06-08 21:13:54 +00003372 if (!Args.hasFlag(options::OPT_fshow_source_location,
3373 options::OPT_fno_show_source_location))
3374 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003375
Douglas Gregor643c9222011-05-21 17:07:29 +00003376 if (!Args.hasFlag(options::OPT_fshow_column,
3377 options::OPT_fno_show_column,
3378 true))
3379 CmdArgs.push_back("-fno-show-column");
3380
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00003381 if (!Args.hasFlag(options::OPT_fspell_checking,
3382 options::OPT_fno_spell_checking))
3383 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003384
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003385
Chad Rosierc8e56e82012-12-05 21:08:21 +00003386 // -fno-asm-blocks is default.
3387 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
3388 false))
3389 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00003390
Chad Rosier679b0752013-04-24 18:29:59 +00003391 // If -Ofast is the optimization level, then -fvectorize should be enabled.
3392 // This alias option is being used to simplify the hasFlag logic.
3393 OptSpecifier VectorizeAliasOption = OFastEnabled ? options::OPT_Ofast :
3394 options::OPT_fvectorize;
3395
Nadav Rotem1cd71a72012-12-18 23:10:16 +00003396 // -fvectorize is default.
Chad Rosier679b0752013-04-24 18:29:59 +00003397 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003398 options::OPT_fno_vectorize, true))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003399 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00003400
Hal Finkel061f1652012-12-11 19:59:32 +00003401 // -fno-slp-vectorize is default.
3402 if (Args.hasFlag(options::OPT_fslp_vectorize,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003403 options::OPT_fno_slp_vectorize, false))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00003404 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00003405
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003406 // -fno-slp-vectorize-aggressive is default.
3407 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003408 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003409 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00003410
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00003411 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
3412 A->render(Args, CmdArgs);
3413
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003414 // -fdollars-in-identifiers default varies depending on platform and
3415 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00003416 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003417 options::OPT_fno_dollars_in_identifiers)) {
3418 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003419 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003420 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00003421 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00003422 }
3423
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003424 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
3425 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00003426 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003427 options::OPT_fno_unit_at_a_time)) {
3428 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003429 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00003430 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003431
Eli Friedman055c9702011-11-02 01:53:16 +00003432 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
3433 options::OPT_fno_apple_pragma_pack, false))
3434 CmdArgs.push_back("-fapple-pragma-pack");
3435
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003436 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003437 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003438 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003439#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003440 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003441 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3442 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3443 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3444 CmdArgs.push_back("-fno-builtin-strcat");
3445 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3446 CmdArgs.push_back("-fno-builtin-strcpy");
3447 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003448#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003449
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003450 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003451 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003452 options::OPT_traditional_cpp)) {
3453 if (isa<PreprocessJobAction>(JA))
3454 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003455 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003456 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003457 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003458
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003459 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003460 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003461
3462 // Handle serialized diagnostics.
3463 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3464 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003465 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003466 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003467
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003468 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3469 CmdArgs.push_back("-fretain-comments-from-system-headers");
3470
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003471 // Forward -fcomment-block-commands to -cc1.
3472 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00003473 // Forward -fparse-all-comments to -cc1.
3474 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00003475
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003476 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3477 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003478 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003479 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3480 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003481 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003482
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003483 // We translate this by hand to the -cc1 argument, since nightly test uses
3484 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003485 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003486 CmdArgs.push_back("-disable-llvm-optzns");
3487 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003488 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003489 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003490
Daniel Dunbard67a3222009-03-30 06:36:42 +00003491 if (Output.getType() == types::TY_Dependencies) {
3492 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003493 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003494 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003495 CmdArgs.push_back(Output.getFilename());
3496 } else {
3497 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003498 }
3499
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003500 for (InputInfoList::const_iterator
3501 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3502 const InputInfo &II = *it;
3503 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003504 if (Args.hasArg(options::OPT_rewrite_objc))
3505 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3506 else
3507 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003508 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003509 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003510 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003511 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003512 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003513
Chris Lattnere9d7d782009-11-03 19:50:27 +00003514 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3515
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003516 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003517
3518 // Optionally embed the -cc1 level arguments into the debug info, for build
3519 // analysis.
3520 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003521 ArgStringList OriginalArgs;
3522 for (ArgList::const_iterator it = Args.begin(),
3523 ie = Args.end(); it != ie; ++it)
3524 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003525
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003526 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003527 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003528 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003529 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003530 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003531 }
3532 CmdArgs.push_back("-dwarf-debug-flags");
3533 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3534 }
3535
Eric Christopherd3804002013-02-22 20:12:52 +00003536 // Add the split debug info name to the command lines here so we
3537 // can propagate it to the backend.
3538 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
3539 (getToolChain().getTriple().getOS() == llvm::Triple::Linux) &&
Eric Christopherf1545832013-02-22 23:50:16 +00003540 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00003541 const char *SplitDwarfOut;
3542 if (SplitDwarf) {
3543 CmdArgs.push_back("-split-dwarf-file");
3544 SplitDwarfOut = SplitDebugName(Args, Inputs);
3545 CmdArgs.push_back(SplitDwarfOut);
3546 }
3547
3548 // Finally add the compile command to the compilation.
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003549 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003550
Eric Christopherf1545832013-02-22 23:50:16 +00003551 // Handle the debug info splitting at object creation time if we're
3552 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00003553 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00003554 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00003555 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00003556
Roman Divacky178e01602011-02-10 16:52:03 +00003557 if (Arg *A = Args.getLastArg(options::OPT_pg))
3558 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003559 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003560 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003561
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003562 // Claim some arguments which clang supports automatically.
3563
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003564 // -fpch-preprocess is used with gcc to add a special marker in the output to
3565 // include the PCH file. Clang's PTH solution is completely transparent, so we
3566 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003567 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003568
Daniel Dunbar17731772009-03-23 19:03:36 +00003569 // Claim some arguments which clang doesn't support, but we don't
3570 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003571 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3572 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003573
Rafael Espindolad95a8122011-03-01 05:25:27 +00003574 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003575 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003576 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003577}
3578
Jim Grosbach576452b2012-02-10 20:37:10 +00003579void ClangAs::AddARMTargetArgs(const ArgList &Args,
3580 ArgStringList &CmdArgs) const {
3581 const Driver &D = getToolChain().getDriver();
3582 llvm::Triple Triple = getToolChain().getTriple();
3583
3584 // Set the CPU based on -march= and -mcpu=.
3585 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003586 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003587
3588 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003589 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003590 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003591
3592 // Honor -mfpmath=.
3593 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003594 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003595}
3596
Benjamin Kramerb164d672013-02-22 20:55:17 +00003597void ClangAs::AddX86TargetArgs(const ArgList &Args,
3598 ArgStringList &CmdArgs) const {
3599 // Set the CPU based on -march=.
3600 if (const char *CPUName = getX86TargetCPU(Args, getToolChain().getTriple())) {
3601 CmdArgs.push_back("-target-cpu");
3602 CmdArgs.push_back(CPUName);
3603 }
3604}
3605
John McCall5fb5df92012-06-20 06:18:46 +00003606/// Add options related to the Objective-C runtime/ABI.
3607///
3608/// Returns true if the runtime is non-fragile.
3609ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3610 ArgStringList &cmdArgs,
3611 RewriteKind rewriteKind) const {
3612 // Look for the controlling runtime option.
3613 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3614 options::OPT_fgnu_runtime,
3615 options::OPT_fobjc_runtime_EQ);
3616
3617 // Just forward -fobjc-runtime= to the frontend. This supercedes
3618 // options about fragility.
3619 if (runtimeArg &&
3620 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3621 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003622 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003623 if (runtime.tryParse(value)) {
3624 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3625 << value;
3626 }
3627
3628 runtimeArg->render(args, cmdArgs);
3629 return runtime;
3630 }
3631
3632 // Otherwise, we'll need the ABI "version". Version numbers are
3633 // slightly confusing for historical reasons:
3634 // 1 - Traditional "fragile" ABI
3635 // 2 - Non-fragile ABI, version 1
3636 // 3 - Non-fragile ABI, version 2
3637 unsigned objcABIVersion = 1;
3638 // If -fobjc-abi-version= is present, use that to set the version.
3639 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003640 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003641 if (value == "1")
3642 objcABIVersion = 1;
3643 else if (value == "2")
3644 objcABIVersion = 2;
3645 else if (value == "3")
3646 objcABIVersion = 3;
3647 else
3648 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3649 << value;
3650 } else {
3651 // Otherwise, determine if we are using the non-fragile ABI.
3652 bool nonFragileABIIsDefault =
3653 (rewriteKind == RK_NonFragile ||
3654 (rewriteKind == RK_None &&
3655 getToolChain().IsObjCNonFragileABIDefault()));
3656 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3657 options::OPT_fno_objc_nonfragile_abi,
3658 nonFragileABIIsDefault)) {
3659 // Determine the non-fragile ABI version to use.
3660#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3661 unsigned nonFragileABIVersion = 1;
3662#else
3663 unsigned nonFragileABIVersion = 2;
3664#endif
3665
3666 if (Arg *abiArg = args.getLastArg(
3667 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003668 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003669 if (value == "1")
3670 nonFragileABIVersion = 1;
3671 else if (value == "2")
3672 nonFragileABIVersion = 2;
3673 else
3674 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3675 << value;
3676 }
3677
3678 objcABIVersion = 1 + nonFragileABIVersion;
3679 } else {
3680 objcABIVersion = 1;
3681 }
3682 }
3683
3684 // We don't actually care about the ABI version other than whether
3685 // it's non-fragile.
3686 bool isNonFragile = objcABIVersion != 1;
3687
3688 // If we have no runtime argument, ask the toolchain for its default runtime.
3689 // However, the rewriter only really supports the Mac runtime, so assume that.
3690 ObjCRuntime runtime;
3691 if (!runtimeArg) {
3692 switch (rewriteKind) {
3693 case RK_None:
3694 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3695 break;
3696 case RK_Fragile:
3697 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3698 break;
3699 case RK_NonFragile:
3700 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3701 break;
3702 }
3703
3704 // -fnext-runtime
3705 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3706 // On Darwin, make this use the default behavior for the toolchain.
3707 if (getToolChain().getTriple().isOSDarwin()) {
3708 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3709
3710 // Otherwise, build for a generic macosx port.
3711 } else {
3712 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3713 }
3714
3715 // -fgnu-runtime
3716 } else {
3717 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003718 // Legacy behaviour is to target the gnustep runtime if we are i
3719 // non-fragile mode or the GCC runtime in fragile mode.
3720 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003721 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003722 else
3723 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003724 }
3725
3726 cmdArgs.push_back(args.MakeArgString(
3727 "-fobjc-runtime=" + runtime.getAsString()));
3728 return runtime;
3729}
3730
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003731void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003732 const InputInfo &Output,
3733 const InputInfoList &Inputs,
3734 const ArgList &Args,
3735 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003736 ArgStringList CmdArgs;
3737
3738 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3739 const InputInfo &Input = Inputs[0];
3740
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003741 // Don't warn about "clang -w -c foo.s"
3742 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003743 // and "clang -emit-llvm -c foo.s"
3744 Args.ClaimAllArgs(options::OPT_emit_llvm);
3745 // and "clang -use-gold-plugin -c foo.s"
3746 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003747
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003748 // Invoke ourselves in -cc1as mode.
3749 //
3750 // FIXME: Implement custom jobs for internal actions.
3751 CmdArgs.push_back("-cc1as");
3752
3753 // Add the "effective" target triple.
3754 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003755 std::string TripleStr =
3756 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003757 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3758
3759 // Set the output mode, we currently only expect to be used as a real
3760 // assembler.
3761 CmdArgs.push_back("-filetype");
3762 CmdArgs.push_back("obj");
3763
Eric Christopher45f2e712012-12-18 00:31:10 +00003764 // Set the main file name, so that debug info works even with
3765 // -save-temps or preprocessed assembly.
3766 CmdArgs.push_back("-main-file-name");
3767 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
3768
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003769 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003770 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003771
Jim Grosbach576452b2012-02-10 20:37:10 +00003772 // Add target specific cpu and features flags.
3773 switch(getToolChain().getTriple().getArch()) {
3774 default:
3775 break;
3776
3777 case llvm::Triple::arm:
3778 case llvm::Triple::thumb:
3779 AddARMTargetArgs(Args, CmdArgs);
3780 break;
Benjamin Kramerb164d672013-02-22 20:55:17 +00003781
3782 case llvm::Triple::x86:
3783 case llvm::Triple::x86_64:
3784 AddX86TargetArgs(Args, CmdArgs);
3785 break;
Jim Grosbach576452b2012-02-10 20:37:10 +00003786 }
3787
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003788 // Ignore explicit -force_cpusubtype_ALL option.
3789 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003790
Eric Christopherfc3ee562012-01-10 00:38:01 +00003791 // Determine the original source input.
3792 const Action *SourceAction = &JA;
3793 while (SourceAction->getKind() != Action::InputClass) {
3794 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3795 SourceAction = SourceAction->getInputs()[0];
3796 }
3797
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003798 // Forward -g and handle debug info related flags, assuming we are dealing
3799 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00003800 if (SourceAction->getType() == types::TY_Asm ||
3801 SourceAction->getType() == types::TY_PP_Asm) {
3802 Args.ClaimAllArgs(options::OPT_g_Group);
3803 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3804 if (!A->getOption().matches(options::OPT_g0))
3805 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003806
3807 // Add the -fdebug-compilation-dir flag if needed.
3808 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00003809
3810 // Set the AT_producer to the clang version when using the integrated
3811 // assembler on assembly source files.
3812 CmdArgs.push_back("-dwarf-debug-producer");
3813 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00003814 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003815
3816 // Optionally embed the -cc1as level arguments into the debug info, for build
3817 // analysis.
3818 if (getToolChain().UseDwarfDebugFlags()) {
3819 ArgStringList OriginalArgs;
3820 for (ArgList::const_iterator it = Args.begin(),
3821 ie = Args.end(); it != ie; ++it)
3822 (*it)->render(Args, OriginalArgs);
3823
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003824 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003825 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3826 Flags += Exec;
3827 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3828 Flags += " ";
3829 Flags += OriginalArgs[i];
3830 }
3831 CmdArgs.push_back("-dwarf-debug-flags");
3832 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3833 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003834
3835 // FIXME: Add -static support, once we have it.
3836
3837 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3838 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003839 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003840
3841 assert(Output.isFilename() && "Unexpected lipo output.");
3842 CmdArgs.push_back("-o");
3843 CmdArgs.push_back(Output.getFilename());
3844
Daniel Dunbarb440f562010-08-02 02:38:21 +00003845 assert(Input.isFilename() && "Invalid input.");
3846 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003847
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003848 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003849 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00003850
3851 // Handle the debug info splitting at object creation time if we're
3852 // creating an object.
3853 // TODO: Currently only works on linux with newer objcopy.
3854 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
3855 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
3856 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
3857 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003858}
3859
Daniel Dunbara3246a02009-03-18 08:07:30 +00003860void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003861 const InputInfo &Output,
3862 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003863 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003864 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003865 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003866 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003867
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003868 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003869 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003870 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003871 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003872 // Don't forward any -g arguments to assembly steps.
3873 if (isa<AssembleJobAction>(JA) &&
3874 A->getOption().matches(options::OPT_g_Group))
3875 continue;
3876
Daniel Dunbar2da02722009-03-19 07:55:12 +00003877 // It is unfortunate that we have to claim here, as this means
3878 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003879 // platforms using a generic gcc, even if we are just using gcc
3880 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003881 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003882 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003883 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003884 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003885
Daniel Dunbar4e295052010-01-25 22:35:08 +00003886 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003887
3888 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003889 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003890 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003891 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003892
3893 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003894 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003895 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003896 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003897 CmdArgs.push_back("ppc64");
3898 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003899 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003900 }
3901
Daniel Dunbar5716d872009-05-02 21:41:52 +00003902 // Try to force gcc to match the tool chain we want, if we recognize
3903 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003904 //
3905 // FIXME: The triple class should directly provide the information we want
3906 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003907 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003908 CmdArgs.push_back("-m32");
Hans Wennborgc5f4c362013-03-20 07:34:27 +00003909 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003910 CmdArgs.push_back("-m64");
3911
Daniel Dunbarb440f562010-08-02 02:38:21 +00003912 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003913 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003914 CmdArgs.push_back(Output.getFilename());
3915 } else {
3916 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003917 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003918 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003919
Tony Linthicum76329bf2011-12-12 21:14:55 +00003920 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3921 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003922
3923 // Only pass -x if gcc will understand it; otherwise hope gcc
3924 // understands the suffix correctly. The main use case this would go
3925 // wrong in is for linker inputs if they happened to have an odd
3926 // suffix; really the only way to get this to happen is a command
3927 // like '-x foobar a.c' which will treat a.c like a linker input.
3928 //
3929 // FIXME: For the linker case specifically, can we safely convert
3930 // inputs into '-Wl,' options?
3931 for (InputInfoList::const_iterator
3932 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3933 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003934
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003935 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003936 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3937 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003938 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003939 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003940 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003941 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003942 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003943 else if (II.getType() == types::TY_ModuleFile)
3944 D.Diag(diag::err_drv_no_module_support)
3945 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003946
Daniel Dunbara3246a02009-03-18 08:07:30 +00003947 if (types::canTypeBeUserSpecified(II.getType())) {
3948 CmdArgs.push_back("-x");
3949 CmdArgs.push_back(types::getTypeName(II.getType()));
3950 }
3951
Daniel Dunbarb440f562010-08-02 02:38:21 +00003952 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003953 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003954 else {
3955 const Arg &A = II.getInputArg();
3956
3957 // Reverse translate some rewritten options.
3958 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3959 CmdArgs.push_back("-lstdc++");
3960 continue;
3961 }
3962
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003963 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003964 A.render(Args, CmdArgs);
3965 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003966 }
3967
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003968 const std::string customGCCName = D.getCCCGenericGCCName();
3969 const char *GCCName;
3970 if (!customGCCName.empty())
3971 GCCName = customGCCName.c_str();
3972 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003973 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003974 } else
3975 GCCName = "gcc";
3976
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003977 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003978 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003979 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003980}
3981
Daniel Dunbar4e295052010-01-25 22:35:08 +00003982void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3983 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003984 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003985}
3986
Daniel Dunbar4e295052010-01-25 22:35:08 +00003987void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3988 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003989 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003990}
3991
Daniel Dunbar4e295052010-01-25 22:35:08 +00003992void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3993 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003994 const Driver &D = getToolChain().getDriver();
3995
Daniel Dunbar4e295052010-01-25 22:35:08 +00003996 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003997 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3998 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003999 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004000 else {
4001 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004002 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004003 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004004
Daniel Dunbar4e295052010-01-25 22:35:08 +00004005 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004006 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004007}
4008
Daniel Dunbar4e295052010-01-25 22:35:08 +00004009void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
4010 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004011 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004012}
Daniel Dunbara3246a02009-03-18 08:07:30 +00004013
Daniel Dunbar4e295052010-01-25 22:35:08 +00004014void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4015 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004016 // The types are (hopefully) good enough.
4017}
4018
Tony Linthicum76329bf2011-12-12 21:14:55 +00004019// Hexagon tools start.
4020void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4021 ArgStringList &CmdArgs) const {
4022
4023}
4024void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4025 const InputInfo &Output,
4026 const InputInfoList &Inputs,
4027 const ArgList &Args,
4028 const char *LinkingOutput) const {
4029
4030 const Driver &D = getToolChain().getDriver();
4031 ArgStringList CmdArgs;
4032
4033 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004034 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004035 CmdArgs.push_back(Args.MakeArgString(MarchString));
4036
4037 RenderExtraToolArgs(JA, CmdArgs);
4038
4039 if (Output.isFilename()) {
4040 CmdArgs.push_back("-o");
4041 CmdArgs.push_back(Output.getFilename());
4042 } else {
4043 assert(Output.isNothing() && "Unexpected output");
4044 CmdArgs.push_back("-fsyntax-only");
4045 }
4046
Matthew Curtise8f80a12012-12-06 17:49:03 +00004047 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4048 if (!SmallDataThreshold.empty())
4049 CmdArgs.push_back(
4050 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004051
Matthew Curtise5df3812012-12-07 17:23:04 +00004052 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4053 options::OPT_Xassembler);
4054
Tony Linthicum76329bf2011-12-12 21:14:55 +00004055 // Only pass -x if gcc will understand it; otherwise hope gcc
4056 // understands the suffix correctly. The main use case this would go
4057 // wrong in is for linker inputs if they happened to have an odd
4058 // suffix; really the only way to get this to happen is a command
4059 // like '-x foobar a.c' which will treat a.c like a linker input.
4060 //
4061 // FIXME: For the linker case specifically, can we safely convert
4062 // inputs into '-Wl,' options?
4063 for (InputInfoList::const_iterator
4064 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4065 const InputInfo &II = *it;
4066
4067 // Don't try to pass LLVM or AST inputs to a generic gcc.
4068 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4069 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4070 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4071 << getToolChain().getTripleString();
4072 else if (II.getType() == types::TY_AST)
4073 D.Diag(clang::diag::err_drv_no_ast_support)
4074 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004075 else if (II.getType() == types::TY_ModuleFile)
4076 D.Diag(diag::err_drv_no_module_support)
4077 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004078
4079 if (II.isFilename())
4080 CmdArgs.push_back(II.getFilename());
4081 else
4082 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4083 II.getInputArg().render(Args, CmdArgs);
4084 }
4085
4086 const char *GCCName = "hexagon-as";
4087 const char *Exec =
4088 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
4089 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4090
4091}
4092void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4093 ArgStringList &CmdArgs) const {
4094 // The types are (hopefully) good enough.
4095}
4096
4097void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4098 const InputInfo &Output,
4099 const InputInfoList &Inputs,
4100 const ArgList &Args,
4101 const char *LinkingOutput) const {
4102
Matthew Curtise689b052012-12-06 15:46:07 +00004103 const toolchains::Hexagon_TC& ToolChain =
4104 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4105 const Driver &D = ToolChain.getDriver();
4106
Tony Linthicum76329bf2011-12-12 21:14:55 +00004107 ArgStringList CmdArgs;
4108
Matthew Curtise689b052012-12-06 15:46:07 +00004109 //----------------------------------------------------------------------------
4110 //
4111 //----------------------------------------------------------------------------
4112 bool hasStaticArg = Args.hasArg(options::OPT_static);
4113 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004114 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004115 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4116 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4117 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4118 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004119
Matthew Curtise689b052012-12-06 15:46:07 +00004120 //----------------------------------------------------------------------------
4121 // Silence warnings for various options
4122 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004123
Matthew Curtise689b052012-12-06 15:46:07 +00004124 Args.ClaimAllArgs(options::OPT_g_Group);
4125 Args.ClaimAllArgs(options::OPT_emit_llvm);
4126 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4127 // handled somewhere else.
4128 Args.ClaimAllArgs(options::OPT_static_libgcc);
4129
4130 //----------------------------------------------------------------------------
4131 //
4132 //----------------------------------------------------------------------------
4133 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
4134 e = ToolChain.ExtraOpts.end();
4135 i != e; ++i)
4136 CmdArgs.push_back(i->c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004137
Matthew Curtisf10a5952012-12-06 14:16:43 +00004138 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4139 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004140
Matthew Curtise689b052012-12-06 15:46:07 +00004141 if (buildingLib) {
4142 CmdArgs.push_back("-shared");
4143 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4144 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004145 }
4146
Matthew Curtise689b052012-12-06 15:46:07 +00004147 if (hasStaticArg)
4148 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004149
Matthew Curtise8f80a12012-12-06 17:49:03 +00004150 if (buildPIE && !buildingLib)
4151 CmdArgs.push_back("-pie");
4152
4153 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4154 if (!SmallDataThreshold.empty()) {
4155 CmdArgs.push_back(
4156 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4157 }
4158
Matthew Curtise689b052012-12-06 15:46:07 +00004159 //----------------------------------------------------------------------------
4160 //
4161 //----------------------------------------------------------------------------
4162 CmdArgs.push_back("-o");
4163 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004164
Matthew Curtise689b052012-12-06 15:46:07 +00004165 const std::string MarchSuffix = "/" + MarchString;
4166 const std::string G0Suffix = "/G0";
4167 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4168 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4169 + "/";
4170 const std::string StartFilesDir = RootDir
4171 + "hexagon/lib"
4172 + (buildingLib
4173 ? MarchG0Suffix : MarchSuffix);
4174
4175 //----------------------------------------------------------------------------
4176 // moslib
4177 //----------------------------------------------------------------------------
4178 std::vector<std::string> oslibs;
4179 bool hasStandalone= false;
4180
4181 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4182 ie = Args.filtered_end(); it != ie; ++it) {
4183 (*it)->claim();
4184 oslibs.push_back((*it)->getValue());
4185 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004186 }
Matthew Curtise689b052012-12-06 15:46:07 +00004187 if (oslibs.empty()) {
4188 oslibs.push_back("standalone");
4189 hasStandalone = true;
4190 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004191
Matthew Curtise689b052012-12-06 15:46:07 +00004192 //----------------------------------------------------------------------------
4193 // Start Files
4194 //----------------------------------------------------------------------------
4195 if (incStdLib && incStartFiles) {
4196
4197 if (!buildingLib) {
4198 if (hasStandalone) {
4199 CmdArgs.push_back(
4200 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4201 }
4202 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4203 }
4204 std::string initObj = useShared ? "/initS.o" : "/init.o";
4205 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4206 }
4207
4208 //----------------------------------------------------------------------------
4209 // Library Search Paths
4210 //----------------------------------------------------------------------------
4211 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
4212 for (ToolChain::path_list::const_iterator
4213 i = LibPaths.begin(),
4214 e = LibPaths.end();
4215 i != e;
4216 ++i)
4217 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
4218
4219 //----------------------------------------------------------------------------
4220 //
4221 //----------------------------------------------------------------------------
4222 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4223 Args.AddAllArgs(CmdArgs, options::OPT_e);
4224 Args.AddAllArgs(CmdArgs, options::OPT_s);
4225 Args.AddAllArgs(CmdArgs, options::OPT_t);
4226 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4227
4228 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4229
4230 //----------------------------------------------------------------------------
4231 // Libraries
4232 //----------------------------------------------------------------------------
4233 if (incStdLib && incDefLibs) {
4234 if (D.CCCIsCXX) {
4235 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4236 CmdArgs.push_back("-lm");
4237 }
4238
4239 CmdArgs.push_back("--start-group");
4240
4241 if (!buildingLib) {
4242 for(std::vector<std::string>::iterator i = oslibs.begin(),
4243 e = oslibs.end(); i != e; ++i)
4244 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4245 CmdArgs.push_back("-lc");
4246 }
4247 CmdArgs.push_back("-lgcc");
4248
4249 CmdArgs.push_back("--end-group");
4250 }
4251
4252 //----------------------------------------------------------------------------
4253 // End files
4254 //----------------------------------------------------------------------------
4255 if (incStdLib && incStartFiles) {
4256 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4257 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4258 }
4259
4260 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
4261 C.addCommand(
4262 new Command(
4263 JA, *this,
4264 Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004265}
4266// Hexagon tools end.
4267
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004268llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
4269 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
4270 // archs which Darwin doesn't use.
4271
4272 // The matching this routine does is fairly pointless, since it is neither the
4273 // complete architecture list, nor a reasonable subset. The problem is that
4274 // historically the driver driver accepts this and also ties its -march=
4275 // handling to the architecture name, so we need to be careful before removing
4276 // support for it.
4277
4278 // This code must be kept in sync with Clang's Darwin specific argument
4279 // translation.
4280
4281 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
4282 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
4283 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
4284 .Case("ppc64", llvm::Triple::ppc64)
4285 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
4286 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
4287 llvm::Triple::x86)
4288 .Case("x86_64", llvm::Triple::x86_64)
4289 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00004290 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
4291 .Cases("armv7", "armv7em", "armv7f", "armv7k", "armv7m", llvm::Triple::arm)
4292 .Cases("armv7s", "xscale", llvm::Triple::arm)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00004293 .Case("r600", llvm::Triple::r600)
4294 .Case("nvptx", llvm::Triple::nvptx)
4295 .Case("nvptx64", llvm::Triple::nvptx64)
4296 .Case("amdil", llvm::Triple::amdil)
4297 .Case("spir", llvm::Triple::spir)
4298 .Default(llvm::Triple::UnknownArch);
4299}
Tony Linthicum76329bf2011-12-12 21:14:55 +00004300
Bob Wilsondecc03e2012-11-23 06:14:39 +00004301const char *Clang::getBaseInputName(const ArgList &Args,
4302 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00004303 return Args.MakeArgString(
4304 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004305}
4306
Bob Wilsondecc03e2012-11-23 06:14:39 +00004307const char *Clang::getBaseInputStem(const ArgList &Args,
4308 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004309 const char *Str = getBaseInputName(Args, Inputs);
4310
Chris Lattner906bb902011-01-16 08:14:11 +00004311 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004312 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004313
4314 return Str;
4315}
4316
Bob Wilsondecc03e2012-11-23 06:14:39 +00004317const char *Clang::getDependencyFileName(const ArgList &Args,
4318 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004319 // FIXME: Think about this more.
4320 std::string Res;
4321
4322 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004323 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004324 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004325 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00004326 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00004327 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004328 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004329}
4330
Daniel Dunbarbe220842009-03-20 16:06:39 +00004331void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004332 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004333 const InputInfoList &Inputs,
4334 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004335 const char *LinkingOutput) const {
4336 ArgStringList CmdArgs;
4337
4338 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4339 const InputInfo &Input = Inputs[0];
4340
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004341 // Determine the original source input.
4342 const Action *SourceAction = &JA;
4343 while (SourceAction->getKind() != Action::InputClass) {
4344 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4345 SourceAction = SourceAction->getInputs()[0];
4346 }
4347
4348 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004349 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004350 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004351 if (Args.hasArg(options::OPT_gstabs))
4352 CmdArgs.push_back("--gstabs");
4353 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004354 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004355 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004356
Daniel Dunbarbe220842009-03-20 16:06:39 +00004357 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004358 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004359
Daniel Dunbar6d484762010-07-22 01:47:22 +00004360 // Use -force_cpusubtype_ALL on x86 by default.
4361 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4362 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004363 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4364 CmdArgs.push_back("-force_cpusubtype_ALL");
4365
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004366 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004367 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00004368 Args.hasArg(options::OPT_fapple_kext)) &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004369 (!getDarwinToolChain().isTargetIPhoneOS() ||
4370 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4371 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004372 CmdArgs.push_back("-static");
4373
Daniel Dunbarbe220842009-03-20 16:06:39 +00004374 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4375 options::OPT_Xassembler);
4376
4377 assert(Output.isFilename() && "Unexpected lipo output.");
4378 CmdArgs.push_back("-o");
4379 CmdArgs.push_back(Output.getFilename());
4380
Daniel Dunbarb440f562010-08-02 02:38:21 +00004381 assert(Input.isFilename() && "Invalid input.");
4382 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004383
4384 // asm_final spec is empty.
4385
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004386 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004387 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004388 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004389}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004390
David Blaikie68e081d2011-12-20 02:48:34 +00004391void darwin::DarwinTool::anchor() {}
4392
Daniel Dunbare9ded432009-09-09 18:36:20 +00004393void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4394 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004395 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004396
Daniel Dunbarc1964212009-03-26 16:23:12 +00004397 // Derived from darwin_arch spec.
4398 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004399 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004400
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004401 // FIXME: Is this needed anymore?
4402 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004403 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004404}
4405
Bill Wendling3b2000f2012-10-02 18:02:50 +00004406bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4407 // We only need to generate a temp path for LTO if we aren't compiling object
4408 // files. When compiling source files, we run 'dsymutil' after linking. We
4409 // don't run 'dsymutil' when compiling object files.
4410 for (InputInfoList::const_iterator
4411 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4412 if (it->getType() != types::TY_Object)
4413 return true;
4414
4415 return false;
4416}
4417
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004418void darwin::Link::AddLinkArgs(Compilation &C,
4419 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004420 ArgStringList &CmdArgs,
4421 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004422 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004423 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004424
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004425 unsigned Version[3] = { 0, 0, 0 };
4426 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4427 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004428 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004429 Version[1], Version[2], HadExtra) ||
4430 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004431 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004432 << A->getAsString(Args);
4433 }
4434
4435 // Newer linkers support -demangle, pass it if supported and not disabled by
4436 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004437 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004438 // Don't pass -demangle to ld_classic.
4439 //
4440 // FIXME: This is a temporary workaround, ld should be handling this.
4441 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4442 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004443 if (getToolChain().getArch() == llvm::Triple::x86) {
4444 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4445 options::OPT_Wl_COMMA),
4446 ie = Args.filtered_end(); it != ie; ++it) {
4447 const Arg *A = *it;
4448 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004449 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004450 UsesLdClassic = true;
4451 }
4452 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004453 if (!UsesLdClassic)
4454 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004455 }
4456
Bill Wendling313b6bf2012-11-16 23:03:00 +00004457 // If we are using LTO, then automatically create a temporary file path for
4458 // the linker to use, so that it's lifetime will extend past a possible
4459 // dsymutil step.
4460 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
4461 const char *TmpPath = C.getArgs().MakeArgString(
4462 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
4463 C.addTempFile(TmpPath);
4464 CmdArgs.push_back("-object_path_lto");
4465 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00004466 }
4467
Daniel Dunbarc1964212009-03-26 16:23:12 +00004468 // Derived from the "link" spec.
4469 Args.AddAllArgs(CmdArgs, options::OPT_static);
4470 if (!Args.hasArg(options::OPT_static))
4471 CmdArgs.push_back("-dynamic");
4472 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4473 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4474 // here. How do we wish to handle such things?
4475 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004476
Daniel Dunbarc1964212009-03-26 16:23:12 +00004477 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004478 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004479 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004480 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004481
4482 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4483 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4484 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4485
4486 Arg *A;
4487 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4488 (A = Args.getLastArg(options::OPT_current__version)) ||
4489 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004490 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004491 << A->getAsString(Args) << "-dynamiclib";
4492
4493 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4494 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4495 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4496 } else {
4497 CmdArgs.push_back("-dylib");
4498
4499 Arg *A;
4500 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4501 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4502 (A = Args.getLastArg(options::OPT_client__name)) ||
4503 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4504 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4505 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004506 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004507 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004508
Daniel Dunbarc1964212009-03-26 16:23:12 +00004509 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4510 "-dylib_compatibility_version");
4511 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4512 "-dylib_current_version");
4513
Daniel Dunbara48823f2010-01-22 02:04:52 +00004514 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004515
4516 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4517 "-dylib_install_name");
4518 }
4519
4520 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4521 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4522 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004523 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004524 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004525 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4526 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4527 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4528 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4529 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4530 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004531 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004532 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4533 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4534 Args.AddAllArgs(CmdArgs, options::OPT_init);
4535
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004536 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004537 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004538
4539 // If we had an explicit -mios-simulator-version-min argument, honor that,
4540 // otherwise use the traditional deployment targets. We can't just check the
4541 // is-sim attribute because existing code follows this path, and the linker
4542 // may not handle the argument.
4543 //
4544 // FIXME: We may be able to remove this, once we can verify no one depends on
4545 // it.
4546 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4547 CmdArgs.push_back("-ios_simulator_version_min");
4548 else if (DarwinTC.isTargetIPhoneOS())
4549 CmdArgs.push_back("-iphoneos_version_min");
4550 else
4551 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004552 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004553
Daniel Dunbarc1964212009-03-26 16:23:12 +00004554 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4555 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4556 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4557 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4558 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004559
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004560 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4561 options::OPT_fno_pie,
4562 options::OPT_fno_PIE)) {
4563 if (A->getOption().matches(options::OPT_fpie) ||
4564 A->getOption().matches(options::OPT_fPIE))
4565 CmdArgs.push_back("-pie");
4566 else
4567 CmdArgs.push_back("-no_pie");
4568 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004569
4570 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4571 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4572 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4573 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4574 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4575 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4576 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4577 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4578 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4579 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4580 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4581 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4582 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4583 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4584 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4585 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004586
Daniel Dunbar84384642011-05-02 21:03:47 +00004587 // Give --sysroot= preference, over the Apple specific behavior to also use
4588 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004589 StringRef sysroot = C.getSysRoot();
4590 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004591 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004592 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004593 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4594 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004595 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004596 }
4597
Daniel Dunbarc1964212009-03-26 16:23:12 +00004598 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4599 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4600 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4601 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4602 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004603 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004604 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4605 Args.AddAllArgs(CmdArgs, options::OPT_y);
4606 Args.AddLastArg(CmdArgs, options::OPT_w);
4607 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4608 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4609 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4610 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4611 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4612 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4613 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4614 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4615 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4616 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4617 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4618 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4619}
4620
4621void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004622 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004623 const InputInfoList &Inputs,
4624 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004625 const char *LinkingOutput) const {
4626 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004627
Daniel Dunbarc1964212009-03-26 16:23:12 +00004628 // The logic here is derived from gcc's behavior; most of which
4629 // comes from specs (starting with link_command). Consult gcc for
4630 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004631 ArgStringList CmdArgs;
4632
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004633 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4634 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4635 options::OPT_ccc_arcmt_migrate)) {
4636 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4637 (*I)->claim();
4638 const char *Exec =
4639 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4640 CmdArgs.push_back(Output.getFilename());
4641 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4642 return;
4643 }
4644
Daniel Dunbarc1964212009-03-26 16:23:12 +00004645 // I'm not sure why this particular decomposition exists in gcc, but
4646 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004647 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004648
Daniel Dunbarc1964212009-03-26 16:23:12 +00004649 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4650 Args.AddAllArgs(CmdArgs, options::OPT_s);
4651 Args.AddAllArgs(CmdArgs, options::OPT_t);
4652 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4653 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004654 Args.AddLastArg(CmdArgs, options::OPT_e);
4655 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4656 Args.AddAllArgs(CmdArgs, options::OPT_r);
4657
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004658 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4659 // members of static archive libraries which implement Objective-C classes or
4660 // categories.
4661 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4662 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004663
Bill Wendling58979742012-12-10 21:48:41 +00004664 if (Args.hasArg(options::OPT_rdynamic))
4665 CmdArgs.push_back("-export_dynamic");
4666
Daniel Dunbarc1964212009-03-26 16:23:12 +00004667 CmdArgs.push_back("-o");
4668 CmdArgs.push_back(Output.getFilename());
4669
Chad Rosier06fd3c62012-05-16 23:45:12 +00004670 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004671 !Args.hasArg(options::OPT_nostartfiles)) {
4672 // Derived from startfile spec.
4673 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004674 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004675 if (getDarwinToolChain().isTargetIOSSimulator()) {
4676 // The simulator doesn't have a versioned crt1 file.
4677 CmdArgs.push_back("-ldylib1.o");
4678 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004679 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4680 CmdArgs.push_back("-ldylib1.o");
4681 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004682 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004683 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004684 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004685 CmdArgs.push_back("-ldylib1.10.5.o");
4686 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004687 } else {
4688 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004689 if (!Args.hasArg(options::OPT_static)) {
4690 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004691 if (getDarwinToolChain().isTargetIOSSimulator()) {
4692 // The simulator doesn't have a versioned crt1 file.
4693 CmdArgs.push_back("-lbundle1.o");
4694 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004695 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4696 CmdArgs.push_back("-lbundle1.o");
4697 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004698 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004699 CmdArgs.push_back("-lbundle1.o");
4700 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004701 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004702 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004703 if (Args.hasArg(options::OPT_pg) &&
4704 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004705 if (Args.hasArg(options::OPT_static) ||
4706 Args.hasArg(options::OPT_object) ||
4707 Args.hasArg(options::OPT_preload)) {
4708 CmdArgs.push_back("-lgcrt0.o");
4709 } else {
4710 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004711
Daniel Dunbarc1964212009-03-26 16:23:12 +00004712 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004713 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004714 // By default on OS X 10.8 and later, we don't link with a crt1.o
4715 // file and the linker knows to use _main as the entry point. But,
4716 // when compiling with -pg, we need to link with the gcrt1.o file,
4717 // so pass the -no_new_main option to tell the linker to use the
4718 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004719 if (getDarwinToolChain().isTargetMacOS() &&
4720 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4721 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004722 } else {
4723 if (Args.hasArg(options::OPT_static) ||
4724 Args.hasArg(options::OPT_object) ||
4725 Args.hasArg(options::OPT_preload)) {
4726 CmdArgs.push_back("-lcrt0.o");
4727 } else {
4728 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004729 if (getDarwinToolChain().isTargetIOSSimulator()) {
4730 // The simulator doesn't have a versioned crt1 file.
4731 CmdArgs.push_back("-lcrt1.o");
4732 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004733 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4734 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004735 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004736 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004737 } else {
4738 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4739 CmdArgs.push_back("-lcrt1.o");
4740 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4741 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004742 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004743 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004744
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004745 // darwin_crt2 spec is empty.
4746 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004747 }
4748 }
4749 }
4750 }
4751
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004752 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4753 Args.hasArg(options::OPT_shared_libgcc) &&
4754 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004755 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004756 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004757 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004758 }
4759 }
4760
4761 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004762
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004763 SanitizerArgs Sanitize(getToolChain(), Args);
Alexey Samsonov969be242013-01-21 08:45:02 +00004764 // If we're building a dynamic lib with -fsanitize=address,
4765 // unresolved symbols may appear. Mark all
Alexey Samsonovcc429802012-11-16 12:53:14 +00004766 // of them as dynamic_lookup. Linking executables is handled in
4767 // lib/Driver/ToolChains.cpp.
Alexey Samsonov969be242013-01-21 08:45:02 +00004768 if (Sanitize.needsAsanRt()) {
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004769 if (Args.hasArg(options::OPT_dynamiclib) ||
4770 Args.hasArg(options::OPT_bundle)) {
4771 CmdArgs.push_back("-undefined");
4772 CmdArgs.push_back("dynamic_lookup");
4773 }
4774 }
4775
Daniel Dunbarc1964212009-03-26 16:23:12 +00004776 if (Args.hasArg(options::OPT_fopenmp))
4777 // This is more complicated in gcc...
4778 CmdArgs.push_back("-lgomp");
4779
Douglas Gregor9295df02012-05-15 21:00:27 +00004780 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4781
Bob Wilson16d93952012-05-15 18:57:39 +00004782 if (isObjCRuntimeLinked(Args) &&
4783 !Args.hasArg(options::OPT_nostdlib) &&
4784 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004785 // Avoid linking compatibility stubs on i386 mac.
4786 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004787 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004788 // If we don't have ARC or subscripting runtime support, link in the
4789 // runtime stubs. We have to do this *before* adding any of the normal
4790 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004791 ObjCRuntime runtime =
4792 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004793 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004794 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004795 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004796 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004797 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004798 CmdArgs.push_back("-framework");
4799 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004800 // Link libobj.
4801 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004802 }
John McCall31168b02011-06-15 23:02:42 +00004803
Daniel Dunbarc1964212009-03-26 16:23:12 +00004804 if (LinkingOutput) {
4805 CmdArgs.push_back("-arch_multiple");
4806 CmdArgs.push_back("-final_output");
4807 CmdArgs.push_back(LinkingOutput);
4808 }
4809
Daniel Dunbarc1964212009-03-26 16:23:12 +00004810 if (Args.hasArg(options::OPT_fnested_functions))
4811 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004812
Daniel Dunbarc1964212009-03-26 16:23:12 +00004813 if (!Args.hasArg(options::OPT_nostdlib) &&
4814 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004815 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004816 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004817
Daniel Dunbarc1964212009-03-26 16:23:12 +00004818 // link_ssp spec is empty.
4819
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004820 // Let the tool chain choose which runtime library to link.
4821 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004822 }
4823
Chad Rosier06fd3c62012-05-16 23:45:12 +00004824 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004825 !Args.hasArg(options::OPT_nostartfiles)) {
4826 // endfile_spec is empty.
4827 }
4828
4829 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4830 Args.AddAllArgs(CmdArgs, options::OPT_F);
4831
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004832 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004833 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004834 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004835}
4836
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004837void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004838 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004839 const InputInfoList &Inputs,
4840 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004841 const char *LinkingOutput) const {
4842 ArgStringList CmdArgs;
4843
4844 CmdArgs.push_back("-create");
4845 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004846
4847 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004848 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004849
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004850 for (InputInfoList::const_iterator
4851 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4852 const InputInfo &II = *it;
4853 assert(II.isFilename() && "Unexpected lipo input.");
4854 CmdArgs.push_back(II.getFilename());
4855 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004856 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004857 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004858 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004859}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004860
Daniel Dunbar88299622010-06-04 18:28:36 +00004861void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004862 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004863 const InputInfoList &Inputs,
4864 const ArgList &Args,
4865 const char *LinkingOutput) const {
4866 ArgStringList CmdArgs;
4867
Daniel Dunbareb86b042011-05-09 17:23:16 +00004868 CmdArgs.push_back("-o");
4869 CmdArgs.push_back(Output.getFilename());
4870
Daniel Dunbar88299622010-06-04 18:28:36 +00004871 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4872 const InputInfo &Input = Inputs[0];
4873 assert(Input.isFilename() && "Unexpected dsymutil input.");
4874 CmdArgs.push_back(Input.getFilename());
4875
Daniel Dunbar88299622010-06-04 18:28:36 +00004876 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004877 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004878 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004879}
4880
Eric Christopher551ef452011-08-23 17:56:55 +00004881void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00004882 const InputInfo &Output,
4883 const InputInfoList &Inputs,
4884 const ArgList &Args,
4885 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00004886 ArgStringList CmdArgs;
4887 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004888 CmdArgs.push_back("--debug-info");
4889 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004890 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004891
4892 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4893 const InputInfo &Input = Inputs[0];
4894 assert(Input.isFilename() && "Unexpected verify input");
4895
4896 // Grabbing the output of the earlier dsymutil run.
4897 CmdArgs.push_back(Input.getFilename());
4898
4899 const char *Exec =
4900 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4901 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4902}
4903
David Chisnallf571cde2012-02-15 13:39:01 +00004904void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4905 const InputInfo &Output,
4906 const InputInfoList &Inputs,
4907 const ArgList &Args,
4908 const char *LinkingOutput) const {
4909 ArgStringList CmdArgs;
4910
4911 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4912 options::OPT_Xassembler);
4913
4914 CmdArgs.push_back("-o");
4915 CmdArgs.push_back(Output.getFilename());
4916
4917 for (InputInfoList::const_iterator
4918 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4919 const InputInfo &II = *it;
4920 CmdArgs.push_back(II.getFilename());
4921 }
4922
4923 const char *Exec =
4924 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4925 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4926}
4927
4928
4929void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4930 const InputInfo &Output,
4931 const InputInfoList &Inputs,
4932 const ArgList &Args,
4933 const char *LinkingOutput) const {
4934 // FIXME: Find a real GCC, don't hard-code versions here
4935 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4936 const llvm::Triple &T = getToolChain().getTriple();
4937 std::string LibPath = "/usr/lib/";
4938 llvm::Triple::ArchType Arch = T.getArch();
4939 switch (Arch) {
4940 case llvm::Triple::x86:
4941 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4942 T.getOSName()).str() + "/4.5.2/";
4943 break;
4944 case llvm::Triple::x86_64:
4945 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4946 T.getOSName()).str();
4947 GCCLibPath += "/4.5.2/amd64/";
4948 LibPath += "amd64/";
4949 break;
4950 default:
4951 assert(0 && "Unsupported architecture");
4952 }
4953
4954 ArgStringList CmdArgs;
4955
David Chisnall272a0712012-02-29 15:06:12 +00004956 // Demangle C++ names in errors
4957 CmdArgs.push_back("-C");
4958
David Chisnallf571cde2012-02-15 13:39:01 +00004959 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4960 (!Args.hasArg(options::OPT_shared))) {
4961 CmdArgs.push_back("-e");
4962 CmdArgs.push_back("_start");
4963 }
4964
4965 if (Args.hasArg(options::OPT_static)) {
4966 CmdArgs.push_back("-Bstatic");
4967 CmdArgs.push_back("-dn");
4968 } else {
4969 CmdArgs.push_back("-Bdynamic");
4970 if (Args.hasArg(options::OPT_shared)) {
4971 CmdArgs.push_back("-shared");
4972 } else {
4973 CmdArgs.push_back("--dynamic-linker");
4974 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4975 }
4976 }
4977
4978 if (Output.isFilename()) {
4979 CmdArgs.push_back("-o");
4980 CmdArgs.push_back(Output.getFilename());
4981 } else {
4982 assert(Output.isNothing() && "Invalid output.");
4983 }
4984
4985 if (!Args.hasArg(options::OPT_nostdlib) &&
4986 !Args.hasArg(options::OPT_nostartfiles)) {
4987 if (!Args.hasArg(options::OPT_shared)) {
4988 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4989 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004990 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004991 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4992 } else {
4993 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004994 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4995 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004996 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004997 if (getToolChain().getDriver().CCCIsCXX)
4998 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004999 }
5000
5001 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5002
5003 Args.AddAllArgs(CmdArgs, options::OPT_L);
5004 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5005 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005006 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005007
5008 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5009
5010 if (!Args.hasArg(options::OPT_nostdlib) &&
5011 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00005012 if (getToolChain().getDriver().CCCIsCXX)
5013 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005014 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005015 if (!Args.hasArg(options::OPT_shared)) {
5016 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005017 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005018 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005019 }
David Chisnallf571cde2012-02-15 13:39:01 +00005020 }
5021
5022 if (!Args.hasArg(options::OPT_nostdlib) &&
5023 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005024 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005025 }
David Chisnall96de9932012-02-16 16:00:47 +00005026 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005027
5028 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5029
5030 const char *Exec =
5031 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5032 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5033}
5034
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005035void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005036 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005037 const InputInfoList &Inputs,
5038 const ArgList &Args,
5039 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005040 ArgStringList CmdArgs;
5041
5042 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5043 options::OPT_Xassembler);
5044
5045 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005046 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005047
5048 for (InputInfoList::const_iterator
5049 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5050 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005051 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005052 }
5053
5054 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005055 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005056 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005057}
5058
5059void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005060 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005061 const InputInfoList &Inputs,
5062 const ArgList &Args,
5063 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005064 ArgStringList CmdArgs;
5065
5066 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005067 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005068 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005069 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005070 }
5071
5072 if (Args.hasArg(options::OPT_static)) {
5073 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005074 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005075 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005076// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005077 CmdArgs.push_back("-Bdynamic");
5078 if (Args.hasArg(options::OPT_shared)) {
5079 CmdArgs.push_back("-shared");
5080 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005081 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005082 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5083 }
5084 }
5085
Daniel Dunbarb440f562010-08-02 02:38:21 +00005086 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005087 CmdArgs.push_back("-o");
5088 CmdArgs.push_back(Output.getFilename());
5089 } else {
5090 assert(Output.isNothing() && "Invalid output.");
5091 }
5092
5093 if (!Args.hasArg(options::OPT_nostdlib) &&
5094 !Args.hasArg(options::OPT_nostartfiles)) {
5095 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005096 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005097 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005098 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005099 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005101 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005102 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005103 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005104 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005105 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005106 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005107 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005108 }
5109
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005110 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5111 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005112 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005113
5114 Args.AddAllArgs(CmdArgs, options::OPT_L);
5115 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5116 Args.AddAllArgs(CmdArgs, options::OPT_e);
5117
Daniel Dunbar54423b22010-09-17 00:24:54 +00005118 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005119
5120 if (!Args.hasArg(options::OPT_nostdlib) &&
5121 !Args.hasArg(options::OPT_nodefaultlibs)) {
5122 // FIXME: For some reason GCC passes -lgcc before adding
5123 // the default system libraries. Just mimic this for now.
5124 CmdArgs.push_back("-lgcc");
5125
5126 if (Args.hasArg(options::OPT_pthread))
5127 CmdArgs.push_back("-pthread");
5128 if (!Args.hasArg(options::OPT_shared))
5129 CmdArgs.push_back("-lc");
5130 CmdArgs.push_back("-lgcc");
5131 }
5132
5133 if (!Args.hasArg(options::OPT_nostdlib) &&
5134 !Args.hasArg(options::OPT_nostartfiles)) {
5135 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005136 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005137 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005138 }
5139
Bill Wendling08760582011-06-27 19:15:03 +00005140 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005141
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005142 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005143 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005144 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005145}
5146
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005147void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005148 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005149 const InputInfoList &Inputs,
5150 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005151 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005152 ArgStringList CmdArgs;
5153
5154 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5155 options::OPT_Xassembler);
5156
5157 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005158 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005159
5160 for (InputInfoList::const_iterator
5161 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5162 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005163 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005164 }
5165
5166 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005167 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005168 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005169}
5170
5171void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005172 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005173 const InputInfoList &Inputs,
5174 const ArgList &Args,
5175 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005176 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005177 ArgStringList CmdArgs;
5178
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005179 // Silence warning for "clang -g foo.o -o foo"
5180 Args.ClaimAllArgs(options::OPT_g_Group);
5181 // and "clang -emit-llvm foo.o -o foo"
5182 Args.ClaimAllArgs(options::OPT_emit_llvm);
5183 // and for "clang -w foo.o -o foo". Other warning options are already
5184 // handled somewhere else.
5185 Args.ClaimAllArgs(options::OPT_w);
5186
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005187 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005188 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005189 CmdArgs.push_back("-e");
5190 CmdArgs.push_back("__start");
5191 }
5192
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005193 if (Args.hasArg(options::OPT_static)) {
5194 CmdArgs.push_back("-Bstatic");
5195 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005196 if (Args.hasArg(options::OPT_rdynamic))
5197 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005198 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005199 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005200 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005201 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005202 } else {
5203 CmdArgs.push_back("-dynamic-linker");
5204 CmdArgs.push_back("/usr/libexec/ld.so");
5205 }
5206 }
5207
Rafael Espindola044f7832013-06-05 04:28:55 +00005208 if (Args.hasArg(options::OPT_nopie))
5209 CmdArgs.push_back("-nopie");
5210
Daniel Dunbarb440f562010-08-02 02:38:21 +00005211 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005212 CmdArgs.push_back("-o");
5213 CmdArgs.push_back(Output.getFilename());
5214 } else {
5215 assert(Output.isNothing() && "Invalid output.");
5216 }
5217
5218 if (!Args.hasArg(options::OPT_nostdlib) &&
5219 !Args.hasArg(options::OPT_nostartfiles)) {
5220 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005221 if (Args.hasArg(options::OPT_pg))
5222 CmdArgs.push_back(Args.MakeArgString(
5223 getToolChain().GetFilePath("gcrt0.o")));
5224 else
5225 CmdArgs.push_back(Args.MakeArgString(
5226 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005227 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005228 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005229 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005230 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005231 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005232 }
5233 }
5234
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005235 std::string Triple = getToolChain().getTripleString();
5236 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005237 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005238 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005239 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005240
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005241 Args.AddAllArgs(CmdArgs, options::OPT_L);
5242 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5243 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005244 Args.AddAllArgs(CmdArgs, options::OPT_s);
5245 Args.AddAllArgs(CmdArgs, options::OPT_t);
5246 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5247 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005248
Daniel Dunbar54423b22010-09-17 00:24:54 +00005249 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005250
5251 if (!Args.hasArg(options::OPT_nostdlib) &&
5252 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005253 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005254 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005255 if (Args.hasArg(options::OPT_pg))
5256 CmdArgs.push_back("-lm_p");
5257 else
5258 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005259 }
5260
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005261 // FIXME: For some reason GCC passes -lgcc before adding
5262 // the default system libraries. Just mimic this for now.
5263 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005264
Eric Christopher17674ec2012-09-13 06:32:34 +00005265 if (Args.hasArg(options::OPT_pthread)) {
5266 if (!Args.hasArg(options::OPT_shared) &&
5267 Args.hasArg(options::OPT_pg))
5268 CmdArgs.push_back("-lpthread_p");
5269 else
5270 CmdArgs.push_back("-lpthread");
5271 }
5272
Chandler Carruth45661652011-12-17 22:32:42 +00005273 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005274 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005275 CmdArgs.push_back("-lc_p");
5276 else
5277 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005278 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005279
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005280 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005281 }
5282
5283 if (!Args.hasArg(options::OPT_nostdlib) &&
5284 !Args.hasArg(options::OPT_nostartfiles)) {
5285 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005286 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005287 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005288 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005289 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005290 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005291 }
5292
5293 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005294 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005295 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005296}
Ed Schoutene33194b2009-04-02 19:13:12 +00005297
Eli Friedman9fa28852012-08-08 23:57:20 +00005298void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5299 const InputInfo &Output,
5300 const InputInfoList &Inputs,
5301 const ArgList &Args,
5302 const char *LinkingOutput) const {
5303 ArgStringList CmdArgs;
5304
5305 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5306 options::OPT_Xassembler);
5307
5308 CmdArgs.push_back("-o");
5309 CmdArgs.push_back(Output.getFilename());
5310
5311 for (InputInfoList::const_iterator
5312 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5313 const InputInfo &II = *it;
5314 CmdArgs.push_back(II.getFilename());
5315 }
5316
5317 const char *Exec =
5318 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5319 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5320}
5321
5322void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5323 const InputInfo &Output,
5324 const InputInfoList &Inputs,
5325 const ArgList &Args,
5326 const char *LinkingOutput) const {
5327 const Driver &D = getToolChain().getDriver();
5328 ArgStringList CmdArgs;
5329
5330 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5331 (!Args.hasArg(options::OPT_shared))) {
5332 CmdArgs.push_back("-e");
5333 CmdArgs.push_back("__start");
5334 }
5335
5336 if (Args.hasArg(options::OPT_static)) {
5337 CmdArgs.push_back("-Bstatic");
5338 } else {
5339 if (Args.hasArg(options::OPT_rdynamic))
5340 CmdArgs.push_back("-export-dynamic");
5341 CmdArgs.push_back("--eh-frame-hdr");
5342 CmdArgs.push_back("-Bdynamic");
5343 if (Args.hasArg(options::OPT_shared)) {
5344 CmdArgs.push_back("-shared");
5345 } else {
5346 CmdArgs.push_back("-dynamic-linker");
5347 CmdArgs.push_back("/usr/libexec/ld.so");
5348 }
5349 }
5350
5351 if (Output.isFilename()) {
5352 CmdArgs.push_back("-o");
5353 CmdArgs.push_back(Output.getFilename());
5354 } else {
5355 assert(Output.isNothing() && "Invalid output.");
5356 }
5357
5358 if (!Args.hasArg(options::OPT_nostdlib) &&
5359 !Args.hasArg(options::OPT_nostartfiles)) {
5360 if (!Args.hasArg(options::OPT_shared)) {
5361 if (Args.hasArg(options::OPT_pg))
5362 CmdArgs.push_back(Args.MakeArgString(
5363 getToolChain().GetFilePath("gcrt0.o")));
5364 else
5365 CmdArgs.push_back(Args.MakeArgString(
5366 getToolChain().GetFilePath("crt0.o")));
5367 CmdArgs.push_back(Args.MakeArgString(
5368 getToolChain().GetFilePath("crtbegin.o")));
5369 } else {
5370 CmdArgs.push_back(Args.MakeArgString(
5371 getToolChain().GetFilePath("crtbeginS.o")));
5372 }
5373 }
5374
5375 Args.AddAllArgs(CmdArgs, options::OPT_L);
5376 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5377 Args.AddAllArgs(CmdArgs, options::OPT_e);
5378
5379 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5380
5381 if (!Args.hasArg(options::OPT_nostdlib) &&
5382 !Args.hasArg(options::OPT_nodefaultlibs)) {
5383 if (D.CCCIsCXX) {
5384 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5385 if (Args.hasArg(options::OPT_pg))
5386 CmdArgs.push_back("-lm_p");
5387 else
5388 CmdArgs.push_back("-lm");
5389 }
5390
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005391 if (Args.hasArg(options::OPT_pthread)) {
5392 if (!Args.hasArg(options::OPT_shared) &&
5393 Args.hasArg(options::OPT_pg))
5394 CmdArgs.push_back("-lpthread_p");
5395 else
5396 CmdArgs.push_back("-lpthread");
5397 }
5398
Eli Friedman9fa28852012-08-08 23:57:20 +00005399 if (!Args.hasArg(options::OPT_shared)) {
5400 if (Args.hasArg(options::OPT_pg))
5401 CmdArgs.push_back("-lc_p");
5402 else
5403 CmdArgs.push_back("-lc");
5404 }
5405
5406 std::string myarch = "-lclang_rt.";
5407 const llvm::Triple &T = getToolChain().getTriple();
5408 llvm::Triple::ArchType Arch = T.getArch();
5409 switch (Arch) {
5410 case llvm::Triple::arm:
5411 myarch += ("arm");
5412 break;
5413 case llvm::Triple::x86:
5414 myarch += ("i386");
5415 break;
5416 case llvm::Triple::x86_64:
5417 myarch += ("amd64");
5418 break;
5419 default:
5420 assert(0 && "Unsupported architecture");
5421 }
5422 CmdArgs.push_back(Args.MakeArgString(myarch));
5423 }
5424
5425 if (!Args.hasArg(options::OPT_nostdlib) &&
5426 !Args.hasArg(options::OPT_nostartfiles)) {
5427 if (!Args.hasArg(options::OPT_shared))
5428 CmdArgs.push_back(Args.MakeArgString(
5429 getToolChain().GetFilePath("crtend.o")));
5430 else
5431 CmdArgs.push_back(Args.MakeArgString(
5432 getToolChain().GetFilePath("crtendS.o")));
5433 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005434
5435 const char *Exec =
5436 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5437 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005438}
5439
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005440void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005441 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005442 const InputInfoList &Inputs,
5443 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005444 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005445 ArgStringList CmdArgs;
5446
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005447 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5448 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005449 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005450 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005451 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005452 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005453 else if (getToolChain().getArch() == llvm::Triple::mips ||
5454 getToolChain().getArch() == llvm::Triple::mipsel ||
5455 getToolChain().getArch() == llvm::Triple::mips64 ||
5456 getToolChain().getArch() == llvm::Triple::mips64el) {
5457 StringRef CPUName;
5458 StringRef ABIName;
5459 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005460
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005461 CmdArgs.push_back("-march");
5462 CmdArgs.push_back(CPUName.data());
5463
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005464 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005465 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005466
5467 if (getToolChain().getArch() == llvm::Triple::mips ||
5468 getToolChain().getArch() == llvm::Triple::mips64)
5469 CmdArgs.push_back("-EB");
5470 else
5471 CmdArgs.push_back("-EL");
5472
5473 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5474 options::OPT_fpic, options::OPT_fno_pic,
5475 options::OPT_fPIE, options::OPT_fno_PIE,
5476 options::OPT_fpie, options::OPT_fno_pie);
5477 if (LastPICArg &&
5478 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5479 LastPICArg->getOption().matches(options::OPT_fpic) ||
5480 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5481 LastPICArg->getOption().matches(options::OPT_fpie))) {
5482 CmdArgs.push_back("-KPIC");
5483 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005484 } else if (getToolChain().getArch() == llvm::Triple::arm ||
5485 getToolChain().getArch() == llvm::Triple::thumb) {
5486 CmdArgs.push_back("-mfpu=softvfp");
5487 switch(getToolChain().getTriple().getEnvironment()) {
5488 case llvm::Triple::GNUEABI:
5489 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00005490 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00005491 break;
5492
5493 default:
5494 CmdArgs.push_back("-matpcs");
5495 }
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005496 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005497
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005498 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5499 options::OPT_Xassembler);
5500
5501 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005502 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005503
5504 for (InputInfoList::const_iterator
5505 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5506 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005507 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005508 }
5509
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005510 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005511 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005512 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005513}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005514
5515void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005516 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005517 const InputInfoList &Inputs,
5518 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005519 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005520 const toolchains::FreeBSD& ToolChain =
5521 static_cast<const toolchains::FreeBSD&>(getToolChain());
5522 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005523 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005524
5525 // Silence warning for "clang -g foo.o -o foo"
5526 Args.ClaimAllArgs(options::OPT_g_Group);
5527 // and "clang -emit-llvm foo.o -o foo"
5528 Args.ClaimAllArgs(options::OPT_emit_llvm);
5529 // and for "clang -w foo.o -o foo". Other warning options are already
5530 // handled somewhere else.
5531 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005532
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005533 if (!D.SysRoot.empty())
5534 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5535
Roman Divackyafe2f232012-08-28 15:09:03 +00005536 if (Args.hasArg(options::OPT_pie))
5537 CmdArgs.push_back("-pie");
5538
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005539 if (Args.hasArg(options::OPT_static)) {
5540 CmdArgs.push_back("-Bstatic");
5541 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005542 if (Args.hasArg(options::OPT_rdynamic))
5543 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005544 CmdArgs.push_back("--eh-frame-hdr");
5545 if (Args.hasArg(options::OPT_shared)) {
5546 CmdArgs.push_back("-Bshareable");
5547 } else {
5548 CmdArgs.push_back("-dynamic-linker");
5549 CmdArgs.push_back("/libexec/ld-elf.so.1");
5550 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005551 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5552 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005553 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5554 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5555 CmdArgs.push_back("--hash-style=both");
5556 }
5557 }
5558 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005559 }
5560
5561 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5562 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005563 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005564 CmdArgs.push_back("-m");
5565 CmdArgs.push_back("elf_i386_fbsd");
5566 }
5567
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005568 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005569 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005570 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005571 }
5572
Daniel Dunbarb440f562010-08-02 02:38:21 +00005573 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005574 CmdArgs.push_back("-o");
5575 CmdArgs.push_back(Output.getFilename());
5576 } else {
5577 assert(Output.isNothing() && "Invalid output.");
5578 }
5579
5580 if (!Args.hasArg(options::OPT_nostdlib) &&
5581 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005582 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005583 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005584 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005585 crt1 = "gcrt1.o";
5586 else if (Args.hasArg(options::OPT_pie))
5587 crt1 = "Scrt1.o";
5588 else
5589 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005590 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005591 if (crt1)
5592 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5593
5594 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5595
5596 const char *crtbegin = NULL;
5597 if (Args.hasArg(options::OPT_static))
5598 crtbegin = "crtbeginT.o";
5599 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5600 crtbegin = "crtbeginS.o";
5601 else
5602 crtbegin = "crtbegin.o";
5603
5604 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005605 }
5606
5607 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005608 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005609 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5610 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005611 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005612 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5613 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005614 Args.AddAllArgs(CmdArgs, options::OPT_s);
5615 Args.AddAllArgs(CmdArgs, options::OPT_t);
5616 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5617 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005618
Roman Divackyafe2f232012-08-28 15:09:03 +00005619 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005620
5621 if (!Args.hasArg(options::OPT_nostdlib) &&
5622 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005623 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005624 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005625 if (Args.hasArg(options::OPT_pg))
5626 CmdArgs.push_back("-lm_p");
5627 else
5628 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005629 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005630 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5631 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005632 if (Args.hasArg(options::OPT_pg))
5633 CmdArgs.push_back("-lgcc_p");
5634 else
5635 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005636 if (Args.hasArg(options::OPT_static)) {
5637 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005638 } else if (Args.hasArg(options::OPT_pg)) {
5639 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005640 } else {
5641 CmdArgs.push_back("--as-needed");
5642 CmdArgs.push_back("-lgcc_s");
5643 CmdArgs.push_back("--no-as-needed");
5644 }
5645
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005646 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005647 if (Args.hasArg(options::OPT_pg))
5648 CmdArgs.push_back("-lpthread_p");
5649 else
5650 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005651 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005652
Roman Divacky66f22762011-02-10 16:59:40 +00005653 if (Args.hasArg(options::OPT_pg)) {
5654 if (Args.hasArg(options::OPT_shared))
5655 CmdArgs.push_back("-lc");
5656 else
5657 CmdArgs.push_back("-lc_p");
5658 CmdArgs.push_back("-lgcc_p");
5659 } else {
5660 CmdArgs.push_back("-lc");
5661 CmdArgs.push_back("-lgcc");
5662 }
5663
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005664 if (Args.hasArg(options::OPT_static)) {
5665 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005666 } else if (Args.hasArg(options::OPT_pg)) {
5667 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005668 } else {
5669 CmdArgs.push_back("--as-needed");
5670 CmdArgs.push_back("-lgcc_s");
5671 CmdArgs.push_back("--no-as-needed");
5672 }
5673 }
5674
5675 if (!Args.hasArg(options::OPT_nostdlib) &&
5676 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005677 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005678 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005679 else
5680 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005681 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005682 }
5683
Roman Divackyafe2f232012-08-28 15:09:03 +00005684 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005685
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005686 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005687 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005688 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005689}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005690
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005691void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5692 const InputInfo &Output,
5693 const InputInfoList &Inputs,
5694 const ArgList &Args,
5695 const char *LinkingOutput) const {
5696 ArgStringList CmdArgs;
5697
5698 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5699 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005700 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005701 CmdArgs.push_back("--32");
5702
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005703 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005704 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005705 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005706 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005707 CmdArgs.push_back("-EL");
5708
5709 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5710 options::OPT_Xassembler);
5711
5712 CmdArgs.push_back("-o");
5713 CmdArgs.push_back(Output.getFilename());
5714
5715 for (InputInfoList::const_iterator
5716 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5717 const InputInfo &II = *it;
5718 CmdArgs.push_back(II.getFilename());
5719 }
5720
David Chisnallddbd68f2011-09-27 22:03:18 +00005721 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005722 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5723}
5724
5725void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5726 const InputInfo &Output,
5727 const InputInfoList &Inputs,
5728 const ArgList &Args,
5729 const char *LinkingOutput) const {
5730 const Driver &D = getToolChain().getDriver();
5731 ArgStringList CmdArgs;
5732
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005733 if (!D.SysRoot.empty())
5734 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5735
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005736 if (Args.hasArg(options::OPT_static)) {
5737 CmdArgs.push_back("-Bstatic");
5738 } else {
5739 if (Args.hasArg(options::OPT_rdynamic))
5740 CmdArgs.push_back("-export-dynamic");
5741 CmdArgs.push_back("--eh-frame-hdr");
5742 if (Args.hasArg(options::OPT_shared)) {
5743 CmdArgs.push_back("-Bshareable");
5744 } else {
5745 CmdArgs.push_back("-dynamic-linker");
5746 CmdArgs.push_back("/libexec/ld.elf_so");
5747 }
5748 }
5749
5750 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5751 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005752 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005753 CmdArgs.push_back("-m");
5754 CmdArgs.push_back("elf_i386");
5755 }
5756
5757 if (Output.isFilename()) {
5758 CmdArgs.push_back("-o");
5759 CmdArgs.push_back(Output.getFilename());
5760 } else {
5761 assert(Output.isNothing() && "Invalid output.");
5762 }
5763
5764 if (!Args.hasArg(options::OPT_nostdlib) &&
5765 !Args.hasArg(options::OPT_nostartfiles)) {
5766 if (!Args.hasArg(options::OPT_shared)) {
5767 CmdArgs.push_back(Args.MakeArgString(
5768 getToolChain().GetFilePath("crt0.o")));
5769 CmdArgs.push_back(Args.MakeArgString(
5770 getToolChain().GetFilePath("crti.o")));
5771 CmdArgs.push_back(Args.MakeArgString(
5772 getToolChain().GetFilePath("crtbegin.o")));
5773 } else {
5774 CmdArgs.push_back(Args.MakeArgString(
5775 getToolChain().GetFilePath("crti.o")));
5776 CmdArgs.push_back(Args.MakeArgString(
5777 getToolChain().GetFilePath("crtbeginS.o")));
5778 }
5779 }
5780
5781 Args.AddAllArgs(CmdArgs, options::OPT_L);
5782 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5783 Args.AddAllArgs(CmdArgs, options::OPT_e);
5784 Args.AddAllArgs(CmdArgs, options::OPT_s);
5785 Args.AddAllArgs(CmdArgs, options::OPT_t);
5786 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5787 Args.AddAllArgs(CmdArgs, options::OPT_r);
5788
5789 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5790
5791 if (!Args.hasArg(options::OPT_nostdlib) &&
5792 !Args.hasArg(options::OPT_nodefaultlibs)) {
5793 if (D.CCCIsCXX) {
5794 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5795 CmdArgs.push_back("-lm");
5796 }
5797 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5798 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005799 if (Args.hasArg(options::OPT_static)) {
5800 CmdArgs.push_back("-lgcc_eh");
5801 } else {
5802 CmdArgs.push_back("--as-needed");
5803 CmdArgs.push_back("-lgcc_s");
5804 CmdArgs.push_back("--no-as-needed");
5805 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005806 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005807
5808 if (Args.hasArg(options::OPT_pthread))
5809 CmdArgs.push_back("-lpthread");
5810 CmdArgs.push_back("-lc");
5811
5812 CmdArgs.push_back("-lgcc");
5813 if (Args.hasArg(options::OPT_static)) {
5814 CmdArgs.push_back("-lgcc_eh");
5815 } else {
5816 CmdArgs.push_back("--as-needed");
5817 CmdArgs.push_back("-lgcc_s");
5818 CmdArgs.push_back("--no-as-needed");
5819 }
5820 }
5821
5822 if (!Args.hasArg(options::OPT_nostdlib) &&
5823 !Args.hasArg(options::OPT_nostartfiles)) {
5824 if (!Args.hasArg(options::OPT_shared))
5825 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5826 "crtend.o")));
5827 else
5828 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5829 "crtendS.o")));
5830 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5831 "crtn.o")));
5832 }
5833
Bill Wendling08760582011-06-27 19:15:03 +00005834 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005835
David Chisnallddbd68f2011-09-27 22:03:18 +00005836 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005837 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5838}
5839
Thomas Schwinge4e555262013-03-28 19:04:25 +00005840void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5841 const InputInfo &Output,
5842 const InputInfoList &Inputs,
5843 const ArgList &Args,
5844 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00005845 ArgStringList CmdArgs;
5846
5847 // Add --32/--64 to make sure we get the format we want.
5848 // This is incomplete
5849 if (getToolChain().getArch() == llvm::Triple::x86) {
5850 CmdArgs.push_back("--32");
5851 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5852 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005853 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5854 CmdArgs.push_back("-a32");
5855 CmdArgs.push_back("-mppc");
5856 CmdArgs.push_back("-many");
5857 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5858 CmdArgs.push_back("-a64");
5859 CmdArgs.push_back("-mppc64");
5860 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005861 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005862 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005863 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5864 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005865
5866 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5867 getToolChain().getTriple());
5868 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005869
5870 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5871 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5872 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005873 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5874 getToolChain().getArch() == llvm::Triple::mipsel ||
5875 getToolChain().getArch() == llvm::Triple::mips64 ||
5876 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005877 StringRef CPUName;
5878 StringRef ABIName;
5879 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005880
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005881 CmdArgs.push_back("-march");
5882 CmdArgs.push_back(CPUName.data());
5883
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005884 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005885 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005886
5887 if (getToolChain().getArch() == llvm::Triple::mips ||
5888 getToolChain().getArch() == llvm::Triple::mips64)
5889 CmdArgs.push_back("-EB");
5890 else
5891 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005892
Simon Atanasyan036d16d2013-04-30 07:47:13 +00005893 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
5894 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
5895 options::OPT_mno_micromips);
5896 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
5897 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
5898
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005899 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5900 options::OPT_fpic, options::OPT_fno_pic,
5901 options::OPT_fPIE, options::OPT_fno_PIE,
5902 options::OPT_fpie, options::OPT_fno_pie);
5903 if (LastPICArg &&
5904 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5905 LastPICArg->getOption().matches(options::OPT_fpic) ||
5906 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5907 LastPICArg->getOption().matches(options::OPT_fpie))) {
5908 CmdArgs.push_back("-KPIC");
5909 }
Ulrich Weigand47445072013-05-06 16:26:41 +00005910 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
5911 // At the moment we always produce z10 code.
5912 CmdArgs.push_back("-march=z10");
Rafael Espindola92b00932010-08-10 00:25:48 +00005913 }
5914
5915 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5916 options::OPT_Xassembler);
5917
5918 CmdArgs.push_back("-o");
5919 CmdArgs.push_back(Output.getFilename());
5920
5921 for (InputInfoList::const_iterator
5922 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5923 const InputInfo &II = *it;
5924 CmdArgs.push_back(II.getFilename());
5925 }
5926
5927 const char *Exec =
5928 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5929 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00005930
5931 // Handle the debug info splitting at object creation time if we're
5932 // creating an object.
5933 // TODO: Currently only works on linux with newer objcopy.
5934 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
5935 (getToolChain().getTriple().getOS() == llvm::Triple::Linux))
5936 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
5937 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00005938}
5939
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005940static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5941 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005942 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00005943 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
5944 Args.hasArg(options::OPT_static);
Rafael Espindolacc354322011-10-17 21:39:04 +00005945 if (!D.CCCIsCXX)
5946 CmdArgs.push_back("-lgcc");
5947
Logan Chien3d3373c2012-11-19 12:04:11 +00005948 if (StaticLibgcc || isAndroid) {
Rafael Espindolacc354322011-10-17 21:39:04 +00005949 if (D.CCCIsCXX)
5950 CmdArgs.push_back("-lgcc");
5951 } else {
5952 if (!D.CCCIsCXX)
5953 CmdArgs.push_back("--as-needed");
5954 CmdArgs.push_back("-lgcc_s");
5955 if (!D.CCCIsCXX)
5956 CmdArgs.push_back("--no-as-needed");
5957 }
5958
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005959 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005960 CmdArgs.push_back("-lgcc_eh");
5961 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5962 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00005963
5964 // According to Android ABI, we have to link with libdl if we are
5965 // linking with non-static libgcc.
5966 //
5967 // NOTE: This fixes a link error on Android MIPS as well. The non-static
5968 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
5969 if (isAndroid && !StaticLibgcc)
5970 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00005971}
5972
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005973static bool hasMipsN32ABIArg(const ArgList &Args) {
5974 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005975 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005976}
5977
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00005978static StringRef getLinuxDynamicLinker(const ArgList &Args,
5979 const toolchains::Linux &ToolChain) {
5980 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android)
5981 return "/system/bin/linker";
5982 else if (ToolChain.getArch() == llvm::Triple::x86)
5983 return "/lib/ld-linux.so.2";
5984 else if (ToolChain.getArch() == llvm::Triple::aarch64)
5985 return "/lib/ld-linux-aarch64.so.1";
5986 else if (ToolChain.getArch() == llvm::Triple::arm ||
5987 ToolChain.getArch() == llvm::Triple::thumb) {
5988 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5989 return "/lib/ld-linux-armhf.so.3";
5990 else
5991 return "/lib/ld-linux.so.3";
5992 } else if (ToolChain.getArch() == llvm::Triple::mips ||
5993 ToolChain.getArch() == llvm::Triple::mipsel)
5994 return "/lib/ld.so.1";
5995 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5996 ToolChain.getArch() == llvm::Triple::mips64el) {
5997 if (hasMipsN32ABIArg(Args))
5998 return "/lib32/ld.so.1";
5999 else
6000 return "/lib64/ld.so.1";
6001 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6002 return "/lib/ld.so.1";
6003 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6004 ToolChain.getArch() == llvm::Triple::systemz)
6005 return "/lib64/ld64.so.1";
6006 else
6007 return "/lib64/ld-linux-x86-64.so.2";
6008}
6009
Thomas Schwinge4e555262013-03-28 19:04:25 +00006010void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
6011 const InputInfo &Output,
6012 const InputInfoList &Inputs,
6013 const ArgList &Args,
6014 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006015 const toolchains::Linux& ToolChain =
6016 static_cast<const toolchains::Linux&>(getToolChain());
6017 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00006018 const bool isAndroid =
6019 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006020 SanitizerArgs Sanitize(getToolChain(), Args);
6021 const bool IsPIE =
6022 !Args.hasArg(options::OPT_shared) &&
6023 (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006024
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006025 ArgStringList CmdArgs;
6026
Rafael Espindolad1002f62010-11-15 18:28:16 +00006027 // Silence warning for "clang -g foo.o -o foo"
6028 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006029 // and "clang -emit-llvm foo.o -o foo"
6030 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00006031 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00006032 // handled somewhere else.
6033 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00006034
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006035 if (!D.SysRoot.empty())
6036 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006037
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006038 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00006039 CmdArgs.push_back("-pie");
6040
Rafael Espindola1c76c592010-11-07 22:57:16 +00006041 if (Args.hasArg(options::OPT_rdynamic))
6042 CmdArgs.push_back("-export-dynamic");
6043
Rafael Espindola34d77dc2010-11-11 19:34:42 +00006044 if (Args.hasArg(options::OPT_s))
6045 CmdArgs.push_back("-s");
6046
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006047 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
6048 e = ToolChain.ExtraOpts.end();
6049 i != e; ++i)
6050 CmdArgs.push_back(i->c_str());
6051
6052 if (!Args.hasArg(options::OPT_static)) {
6053 CmdArgs.push_back("--eh-frame-hdr");
6054 }
6055
6056 CmdArgs.push_back("-m");
6057 if (ToolChain.getArch() == llvm::Triple::x86)
6058 CmdArgs.push_back("elf_i386");
Tim Northover9bb857a2013-01-31 12:13:10 +00006059 else if (ToolChain.getArch() == llvm::Triple::aarch64)
6060 CmdArgs.push_back("aarch64linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00006061 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00006062 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006063 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006064 else if (ToolChain.getArch() == llvm::Triple::ppc)
6065 CmdArgs.push_back("elf32ppclinux");
6066 else if (ToolChain.getArch() == llvm::Triple::ppc64)
6067 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006068 else if (ToolChain.getArch() == llvm::Triple::mips)
6069 CmdArgs.push_back("elf32btsmip");
6070 else if (ToolChain.getArch() == llvm::Triple::mipsel)
6071 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006072 else if (ToolChain.getArch() == llvm::Triple::mips64) {
6073 if (hasMipsN32ABIArg(Args))
6074 CmdArgs.push_back("elf32btsmipn32");
6075 else
6076 CmdArgs.push_back("elf64btsmip");
6077 }
6078 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
6079 if (hasMipsN32ABIArg(Args))
6080 CmdArgs.push_back("elf32ltsmipn32");
6081 else
6082 CmdArgs.push_back("elf64ltsmip");
6083 }
Ulrich Weigand47445072013-05-06 16:26:41 +00006084 else if (ToolChain.getArch() == llvm::Triple::systemz)
6085 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006086 else
6087 CmdArgs.push_back("elf_x86_64");
6088
6089 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006090 if (ToolChain.getArch() == llvm::Triple::arm
6091 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006092 CmdArgs.push_back("-Bstatic");
6093 else
6094 CmdArgs.push_back("-static");
6095 } else if (Args.hasArg(options::OPT_shared)) {
6096 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006097 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006098 CmdArgs.push_back("-Bsymbolic");
6099 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006100 }
6101
6102 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006103 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006104 (!Args.hasArg(options::OPT_static) &&
6105 !Args.hasArg(options::OPT_shared))) {
6106 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006107 CmdArgs.push_back(Args.MakeArgString(
6108 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006109 }
6110
6111 CmdArgs.push_back("-o");
6112 CmdArgs.push_back(Output.getFilename());
6113
Rafael Espindola81937ec2010-12-01 01:52:43 +00006114 if (!Args.hasArg(options::OPT_nostdlib) &&
6115 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006116 if (!isAndroid) {
6117 const char *crt1 = NULL;
6118 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00006119 if (Args.hasArg(options::OPT_pg))
6120 crt1 = "gcrt1.o";
6121 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006122 crt1 = "Scrt1.o";
6123 else
6124 crt1 = "crt1.o";
6125 }
6126 if (crt1)
6127 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006128
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006129 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6130 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006131
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006132 const char *crtbegin;
6133 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006134 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006135 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006136 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006137 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006138 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006139 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006140 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006141 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006142
6143 // Add crtfastmath.o if available and fast math is enabled.
6144 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006145 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006146
6147 Args.AddAllArgs(CmdArgs, options::OPT_L);
6148
6149 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6150
Roman Divackyee8188a2011-03-01 17:53:14 +00006151 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6152 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006153 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006154
Rafael Espindola9446d762012-04-09 23:53:34 +00006155 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6156 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6157 // forward.
6158 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6159 CmdArgs.push_back("-plugin");
6160 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6161 CmdArgs.push_back(Args.MakeArgString(Plugin));
Chandler Carruth953fb082013-01-13 11:46:33 +00006162
6163 // Try to pass driver level flags relevant to LTO code generation down to
6164 // the plugin.
6165
6166 // Handle architecture-specific flags for selecting CPU variants.
6167 if (ToolChain.getArch() == llvm::Triple::x86 ||
6168 ToolChain.getArch() == llvm::Triple::x86_64)
6169 CmdArgs.push_back(
6170 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6171 getX86TargetCPU(Args, ToolChain.getTriple())));
6172 else if (ToolChain.getArch() == llvm::Triple::arm ||
6173 ToolChain.getArch() == llvm::Triple::thumb)
6174 CmdArgs.push_back(
6175 Args.MakeArgString(Twine("-plugin-opt=mcpu=") +
6176 getARMTargetCPU(Args, ToolChain.getTriple())));
6177
6178 // FIXME: Factor out logic for MIPS, PPC, and other targets to support this
6179 // as well.
Rafael Espindola9446d762012-04-09 23:53:34 +00006180 }
6181
Chandler Carruth953fb082013-01-13 11:46:33 +00006182
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006183 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6184 CmdArgs.push_back("--no-demangle");
6185
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006186 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6187
Eric Christopher04997782012-11-29 18:51:05 +00006188 // Call these before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006189 if (Sanitize.needsUbsanRt())
Richard Smithcff3cde2013-03-20 23:49:07 +00006190 addUbsanRTLinux(getToolChain(), Args, CmdArgs, D.CCCIsCXX,
6191 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006192 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
Eric Christopher04997782012-11-29 18:51:05 +00006193 if (Sanitize.needsAsanRt())
6194 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6195 if (Sanitize.needsTsanRt())
6196 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00006197 if (Sanitize.needsMsanRt())
6198 addMsanRTLinux(getToolChain(), Args, CmdArgs);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00006199 if (Sanitize.needsLsanRt())
6200 addLsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006201
Chandler Carruthe4458b32013-06-24 09:38:45 +00006202 // The profile runtime also needs access to system libraries.
6203 addProfileRTLinux(getToolChain(), Args, CmdArgs);
6204
Chandler Carruth94a32012012-05-14 18:31:18 +00006205 if (D.CCCIsCXX &&
6206 !Args.hasArg(options::OPT_nostdlib) &&
6207 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006208 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6209 !Args.hasArg(options::OPT_static);
6210 if (OnlyLibstdcxxStatic)
6211 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006212 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006213 if (OnlyLibstdcxxStatic)
6214 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006215 CmdArgs.push_back("-lm");
6216 }
6217
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006218 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006219 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6220 if (Args.hasArg(options::OPT_static))
6221 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006222
Chandler Carruth01538002013-01-17 13:19:29 +00006223 bool OpenMP = Args.hasArg(options::OPT_fopenmp);
6224 if (OpenMP) {
6225 CmdArgs.push_back("-lgomp");
6226
6227 // FIXME: Exclude this for platforms whith libgomp that doesn't require
6228 // librt. Most modern Linux platfroms require it, but some may not.
6229 CmdArgs.push_back("-lrt");
6230 }
6231
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006232 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006233
Chandler Carruth94a32012012-05-14 18:31:18 +00006234 if (Args.hasArg(options::OPT_pthread) ||
Chandler Carruth01538002013-01-17 13:19:29 +00006235 Args.hasArg(options::OPT_pthreads) || OpenMP)
Chandler Carruth94a32012012-05-14 18:31:18 +00006236 CmdArgs.push_back("-lpthread");
6237
6238 CmdArgs.push_back("-lc");
6239
6240 if (Args.hasArg(options::OPT_static))
6241 CmdArgs.push_back("--end-group");
6242 else
6243 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6244 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006245
Rafael Espindola81937ec2010-12-01 01:52:43 +00006246 if (!Args.hasArg(options::OPT_nostartfiles)) {
6247 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006248 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006249 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00006250 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006251 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006252 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006253 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006254
Rafael Espindola81937ec2010-12-01 01:52:43 +00006255 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006256 if (!isAndroid)
6257 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006258 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006259 }
6260
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006261 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6262}
Rafael Espindola92b00932010-08-10 00:25:48 +00006263
Chris Lattner3e2ee142010-07-07 16:01:42 +00006264void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006265 const InputInfo &Output,
6266 const InputInfoList &Inputs,
6267 const ArgList &Args,
6268 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006269 ArgStringList CmdArgs;
6270
6271 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6272 options::OPT_Xassembler);
6273
6274 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006275 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006276
6277 for (InputInfoList::const_iterator
6278 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6279 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006280 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006281 }
6282
6283 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006284 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006285 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006286}
6287
6288void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006289 const InputInfo &Output,
6290 const InputInfoList &Inputs,
6291 const ArgList &Args,
6292 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006293 const Driver &D = getToolChain().getDriver();
6294 ArgStringList CmdArgs;
6295
Daniel Dunbarb440f562010-08-02 02:38:21 +00006296 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006297 CmdArgs.push_back("-o");
6298 CmdArgs.push_back(Output.getFilename());
6299 } else {
6300 assert(Output.isNothing() && "Invalid output.");
6301 }
6302
6303 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006304 !Args.hasArg(options::OPT_nostartfiles)) {
6305 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6306 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6307 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6308 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6309 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006310
6311 Args.AddAllArgs(CmdArgs, options::OPT_L);
6312 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6313 Args.AddAllArgs(CmdArgs, options::OPT_e);
6314
Daniel Dunbar54423b22010-09-17 00:24:54 +00006315 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006316
Eli Friedman83de5132011-12-08 23:54:21 +00006317 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6318
Chris Lattner3e2ee142010-07-07 16:01:42 +00006319 if (!Args.hasArg(options::OPT_nostdlib) &&
6320 !Args.hasArg(options::OPT_nodefaultlibs)) {
6321 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006322 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006323 CmdArgs.push_back("-lm");
6324 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006325 }
6326
6327 if (!Args.hasArg(options::OPT_nostdlib) &&
6328 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006329 if (Args.hasArg(options::OPT_pthread))
6330 CmdArgs.push_back("-lpthread");
6331 CmdArgs.push_back("-lc");
6332 CmdArgs.push_back("-lCompilerRT-Generic");
6333 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6334 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00006335 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006336 }
6337
Eli Friedman83de5132011-12-08 23:54:21 +00006338 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006339 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006340}
6341
Daniel Dunbarcc912342009-05-02 18:28:39 +00006342/// DragonFly Tools
6343
6344// For now, DragonFly Assemble does just about the same as for
6345// FreeBSD, but this may change soon.
6346void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006347 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006348 const InputInfoList &Inputs,
6349 const ArgList &Args,
6350 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006351 ArgStringList CmdArgs;
6352
6353 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6354 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006355 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006356 CmdArgs.push_back("--32");
6357
6358 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6359 options::OPT_Xassembler);
6360
6361 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006362 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006363
6364 for (InputInfoList::const_iterator
6365 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6366 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006367 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006368 }
6369
6370 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006371 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006372 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006373}
6374
6375void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006376 const InputInfo &Output,
6377 const InputInfoList &Inputs,
6378 const ArgList &Args,
6379 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00006380 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00006381 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006382 ArgStringList CmdArgs;
6383
John McCall65b8da02013-04-11 22:55:55 +00006384 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
6385 UseGCC47 = false;
6386
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006387 if (!D.SysRoot.empty())
6388 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6389
John McCall65b8da02013-04-11 22:55:55 +00006390 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006391 if (Args.hasArg(options::OPT_static)) {
6392 CmdArgs.push_back("-Bstatic");
6393 } else {
John McCall65b8da02013-04-11 22:55:55 +00006394 if (Args.hasArg(options::OPT_rdynamic))
6395 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006396 if (Args.hasArg(options::OPT_shared))
6397 CmdArgs.push_back("-Bshareable");
6398 else {
6399 CmdArgs.push_back("-dynamic-linker");
6400 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6401 }
John McCall65b8da02013-04-11 22:55:55 +00006402 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006403 }
6404
6405 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6406 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006407 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006408 CmdArgs.push_back("-m");
6409 CmdArgs.push_back("elf_i386");
6410 }
6411
Daniel Dunbarb440f562010-08-02 02:38:21 +00006412 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006413 CmdArgs.push_back("-o");
6414 CmdArgs.push_back(Output.getFilename());
6415 } else {
6416 assert(Output.isNothing() && "Invalid output.");
6417 }
6418
6419 if (!Args.hasArg(options::OPT_nostdlib) &&
6420 !Args.hasArg(options::OPT_nostartfiles)) {
6421 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00006422 if (Args.hasArg(options::OPT_pg))
6423 CmdArgs.push_back(Args.MakeArgString(
6424 getToolChain().GetFilePath("gcrt1.o")));
6425 else {
6426 if (Args.hasArg(options::OPT_pie))
6427 CmdArgs.push_back(Args.MakeArgString(
6428 getToolChain().GetFilePath("Scrt1.o")));
6429 else
6430 CmdArgs.push_back(Args.MakeArgString(
6431 getToolChain().GetFilePath("crt1.o")));
6432 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006433 }
John McCall65b8da02013-04-11 22:55:55 +00006434 CmdArgs.push_back(Args.MakeArgString(
6435 getToolChain().GetFilePath("crti.o")));
6436 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
6437 CmdArgs.push_back(Args.MakeArgString(
6438 getToolChain().GetFilePath("crtbeginS.o")));
6439 else
6440 CmdArgs.push_back(Args.MakeArgString(
6441 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006442 }
6443
6444 Args.AddAllArgs(CmdArgs, options::OPT_L);
6445 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6446 Args.AddAllArgs(CmdArgs, options::OPT_e);
6447
Daniel Dunbar54423b22010-09-17 00:24:54 +00006448 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006449
6450 if (!Args.hasArg(options::OPT_nostdlib) &&
6451 !Args.hasArg(options::OPT_nodefaultlibs)) {
6452 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6453 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00006454 if (UseGCC47)
6455 CmdArgs.push_back("-L/usr/lib/gcc47");
6456 else
6457 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006458
6459 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00006460 if (UseGCC47) {
6461 CmdArgs.push_back("-rpath");
6462 CmdArgs.push_back("/usr/lib/gcc47");
6463 } else {
6464 CmdArgs.push_back("-rpath");
6465 CmdArgs.push_back("/usr/lib/gcc44");
6466 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006467 }
6468
Rafael Espindola38360b32010-07-20 12:59:03 +00006469 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006470 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006471 CmdArgs.push_back("-lm");
6472 }
6473
Daniel Dunbarcc912342009-05-02 18:28:39 +00006474 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006475 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006476
6477 if (!Args.hasArg(options::OPT_nolibc)) {
6478 CmdArgs.push_back("-lc");
6479 }
6480
John McCall65b8da02013-04-11 22:55:55 +00006481 if (UseGCC47) {
6482 if (Args.hasArg(options::OPT_static) ||
6483 Args.hasArg(options::OPT_static_libgcc)) {
6484 CmdArgs.push_back("-lgcc");
6485 CmdArgs.push_back("-lgcc_eh");
6486 } else {
6487 if (Args.hasArg(options::OPT_shared_libgcc)) {
6488 CmdArgs.push_back("-lgcc_pic");
6489 if (!Args.hasArg(options::OPT_shared))
6490 CmdArgs.push_back("-lgcc");
6491 } else {
6492 CmdArgs.push_back("-lgcc");
6493 CmdArgs.push_back("--as-needed");
6494 CmdArgs.push_back("-lgcc_pic");
6495 CmdArgs.push_back("--no-as-needed");
6496 }
6497 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006498 } else {
John McCall65b8da02013-04-11 22:55:55 +00006499 if (Args.hasArg(options::OPT_shared)) {
6500 CmdArgs.push_back("-lgcc_pic");
6501 } else {
6502 CmdArgs.push_back("-lgcc");
6503 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00006504 }
6505 }
6506
6507 if (!Args.hasArg(options::OPT_nostdlib) &&
6508 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00006509 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006510 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006511 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00006512 else
6513 CmdArgs.push_back(Args.MakeArgString(
6514 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006515 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00006516 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006517 }
6518
Bill Wendling08760582011-06-27 19:15:03 +00006519 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006520
Daniel Dunbarcc912342009-05-02 18:28:39 +00006521 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006522 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006523 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006524}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006525
6526void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6527 const InputInfo &Output,
6528 const InputInfoList &Inputs,
6529 const ArgList &Args,
6530 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006531 ArgStringList CmdArgs;
6532
6533 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006534 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6535 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006536 } else {
6537 assert(Output.isNothing() && "Invalid output.");
6538 }
6539
6540 if (!Args.hasArg(options::OPT_nostdlib) &&
6541 !Args.hasArg(options::OPT_nostartfiles)) {
6542 CmdArgs.push_back("-defaultlib:libcmt");
6543 }
6544
6545 CmdArgs.push_back("-nologo");
6546
Michael J. Spencere2f49362012-06-18 16:56:04 +00006547 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6548
6549 // Add filenames immediately.
6550 for (InputInfoList::const_iterator
6551 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6552 if (it->isFilename())
6553 CmdArgs.push_back(it->getFilename());
6554 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006555
6556 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006557 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006558 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6559}