blob: d85bc4adbdb0c89970e6cbcf240b067135e3473d [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
11
Daniel Dunbara2aedc62009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall5fb5df92012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCall31168b02011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000036#include "ToolChains.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000037
Daniel Dunbar1a093d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041
Daniel Dunbar64198ef2009-09-10 01:21:05 +000042/// CheckPreprocessingOptions - Perform some validation of preprocessing
43/// arguments that is shared with gcc.
44static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000046 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000047 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000048 << A->getAsString(Args) << "-E";
49}
50
Daniel Dunbar4eadb602009-09-10 01:21:12 +000051/// CheckCodeGenerationOptions - Perform some validation of code generation
52/// arguments that is shared with gcc.
53static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000059 << A->getAsString(Args) << "-static";
60}
61
Chris Lattnerbf2803f2010-03-29 17:55:58 +000062// Quote target names for inclusion in GNU Make dependency files.
63// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000064static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89}
90
Bill Wendlingc0938f32012-03-12 22:10:06 +000091static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000092 ArgStringList &CmdArgs,
93 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000094 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +000096 bool CombinedArg = false;
97
Bill Wendling281ca292012-03-12 21:22:35 +000098 if (!DirList)
99 return; // Nothing to do.
100
Chad Rosier616e8a52012-10-30 21:42:09 +0000101 StringRef Name(ArgName);
102 if (Name.equals("-I") || Name.equals("-L"))
103 CombinedArg = true;
104
Bill Wendling281ca292012-03-12 21:22:35 +0000105 StringRef Dirs(DirList);
106 if (Dirs.empty()) // Empty string should not add '.'.
107 return;
108
109 StringRef::size_type Delim;
110 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
111 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000112 if (CombinedArg) {
113 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
114 } else {
115 CmdArgs.push_back(ArgName);
116 CmdArgs.push_back(".");
117 }
Bill Wendling281ca292012-03-12 21:22:35 +0000118 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000119 if (CombinedArg) {
120 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
121 } else {
122 CmdArgs.push_back(ArgName);
123 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
124 }
Bill Wendling281ca292012-03-12 21:22:35 +0000125 }
Nico Weber89355782012-03-19 15:00:03 +0000126 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000127 }
128
129 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000130 if (CombinedArg) {
131 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
132 } else {
133 CmdArgs.push_back(ArgName);
134 CmdArgs.push_back(".");
135 }
Bill Wendling281ca292012-03-12 21:22:35 +0000136 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000137 if (CombinedArg) {
138 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
139 } else {
140 CmdArgs.push_back(ArgName);
141 CmdArgs.push_back(Args.MakeArgString(Dirs));
142 }
Bill Wendling281ca292012-03-12 21:22:35 +0000143 }
144}
145
Daniel Dunbar54423b22010-09-17 00:24:54 +0000146static void AddLinkerInputs(const ToolChain &TC,
147 const InputInfoList &Inputs, const ArgList &Args,
148 ArgStringList &CmdArgs) {
149 const Driver &D = TC.getDriver();
150
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000151 // Add extra linker input arguments which are not treated as inputs
152 // (constructed via -Xarch_).
153 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
154
Daniel Dunbar54423b22010-09-17 00:24:54 +0000155 for (InputInfoList::const_iterator
156 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
157 const InputInfo &II = *it;
158
159 if (!TC.HasNativeLLVMSupport()) {
160 // Don't try to pass LLVM inputs unless we have native support.
161 if (II.getType() == types::TY_LLVM_IR ||
162 II.getType() == types::TY_LTO_IR ||
163 II.getType() == types::TY_LLVM_BC ||
164 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000165 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000166 << TC.getTripleString();
167 }
168
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000169 // Add filenames immediately.
170 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000171 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000172 continue;
173 }
174
175 // Otherwise, this is a linker input argument.
176 const Arg &A = II.getInputArg();
177
178 // Handle reserved library options.
179 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000180 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000181 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
182 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000183 } else
184 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000185 }
Bill Wendling281ca292012-03-12 21:22:35 +0000186
187 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000188 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000189}
190
John McCall31168b02011-06-15 23:02:42 +0000191/// \brief Determine whether Objective-C automated reference counting is
192/// enabled.
193static bool isObjCAutoRefCount(const ArgList &Args) {
194 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
195}
196
Ted Kremeneke65b0862012-03-06 20:05:56 +0000197/// \brief Determine whether we are linking the ObjC runtime.
198static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000199 if (isObjCAutoRefCount(Args)) {
200 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000201 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000202 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000203 return Args.hasArg(options::OPT_fobjc_link_runtime);
204}
205
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000206static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000207 ArgStringList &CmdArgs,
208 llvm::Triple Triple) {
209 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
210 Args.hasArg(options::OPT_fprofile_generate) ||
211 Args.hasArg(options::OPT_fcreate_profile) ||
212 Args.hasArg(options::OPT_coverage)))
213 return;
214
215 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
216 // the link line. We cannot do the same thing because unlike gcov there is a
217 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
218 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000219 std::string ProfileRT =
220 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000221
Bill Wendling08760582011-06-27 19:15:03 +0000222 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000223}
224
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000225static bool forwardToGCC(const Option &O) {
226 return !O.hasFlag(options::NoForward) &&
227 !O.hasFlag(options::DriverOption) &&
228 !O.hasFlag(options::LinkerInput);
229}
230
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000231void Clang::AddPreprocessingOptions(Compilation &C,
232 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000233 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000234 ArgStringList &CmdArgs,
235 const InputInfo &Output,
236 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000237 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000238
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000239 CheckPreprocessingOptions(D, Args);
240
241 Args.AddLastArg(CmdArgs, options::OPT_C);
242 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000243
244 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000245 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000246 (A = Args.getLastArg(options::OPT_MD)) ||
247 (A = Args.getLastArg(options::OPT_MMD))) {
248 // Determine the output location.
249 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000250 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000251 DepFile = MF->getValue();
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000252 C.addFailureResultFile(DepFile);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000253 } else if (Output.getType() == types::TY_Dependencies) {
254 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000255 } else if (A->getOption().matches(options::OPT_M) ||
256 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000257 DepFile = "-";
258 } else {
259 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000260 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 }
262 CmdArgs.push_back("-dependency-file");
263 CmdArgs.push_back(DepFile);
264
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000265 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000266 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
267 const char *DepTarget;
268
269 // If user provided -o, that is the dependency target, except
270 // when we are only generating a dependency file.
271 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
272 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000273 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000274 } else {
275 // Otherwise derive from the base input.
276 //
277 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000278 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000279 llvm::sys::path::replace_extension(P, "o");
280 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000281 }
282
283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000285 QuoteTarget(DepTarget, Quoted);
286 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000287 }
288
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000289 if (A->getOption().matches(options::OPT_M) ||
290 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291 CmdArgs.push_back("-sys-header-deps");
292 }
293
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000294 if (Args.hasArg(options::OPT_MG)) {
295 if (!A || A->getOption().matches(options::OPT_MD) ||
296 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000297 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000298 CmdArgs.push_back("-MG");
299 }
300
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000302
303 // Convert all -MQ <target> args to -MT <quoted target>
304 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
305 options::OPT_MQ),
306 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000307 const Arg *A = *it;
308 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000309
Daniel Dunbara442fd52010-06-11 22:00:13 +0000310 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000311 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000312 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000313 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000314 CmdArgs.push_back(Args.MakeArgString(Quoted));
315
316 // -MT flag - no change
317 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000318 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000319 }
320 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321
Douglas Gregor111af7d2009-04-18 00:34:01 +0000322 // Add -i* options, and automatically translate to
323 // -include-pch/-include-pth for transparent PCH support. It's
324 // wonky, but we include looking for .gch so we can support seamless
325 // replacement into a build system already set up to be generating
326 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000327 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000328 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
329 ie = Args.filtered_end(); it != ie; ++it) {
330 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000331
332 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000333 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
334 RenderedImplicitInclude = true;
335
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000336 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000337 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000338
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000339 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000340 bool FoundPCH = false;
Richard Smithbd55daf2012-11-01 04:30:05 +0000341 llvm::sys::Path P(A->getValue());
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000342 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000343 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000344 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000345 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000346 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000347 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000348 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000349 }
350
Douglas Gregor111af7d2009-04-18 00:34:01 +0000351 if (!FoundPCH) {
352 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000353 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000354 FoundPTH = true;
355 else
356 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000357 }
358
Douglas Gregor111af7d2009-04-18 00:34:01 +0000359 if (!FoundPCH && !FoundPTH) {
360 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000361 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000362 FoundPCH = UsePCH;
363 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000364 }
Mike Stump11289f42009-09-09 15:08:12 +0000365 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 P.eraseSuffix();
367 }
368
369 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000370 if (IsFirstImplicitInclude) {
371 A->claim();
372 if (UsePCH)
373 CmdArgs.push_back("-include-pch");
374 else
375 CmdArgs.push_back("-include-pth");
376 CmdArgs.push_back(Args.MakeArgString(P.str()));
377 continue;
378 } else {
379 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000380 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000381 << P.str() << A->getAsString(Args);
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383 }
384 }
385
386 // Not translated, render as usual.
387 A->claim();
388 A->render(Args, CmdArgs);
389 }
390
391 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000392 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
393 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000394
395 // Add -Wp, and -Xassembler if using the preprocessor.
396
397 // FIXME: There is a very unfortunate problem here, some troubled
398 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
399 // really support that we would have to parse and then translate
400 // those options. :(
401 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
402 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000403
404 // -I- is a deprecated GCC feature, reject it.
405 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000406 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000407
408 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
409 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000410 StringRef sysroot = C.getSysRoot();
411 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000412 if (!Args.hasArg(options::OPT_isysroot)) {
413 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000414 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000415 }
416 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000417
418 // If a module path was provided, pass it along. Otherwise, use a temporary
419 // directory.
420 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000421 A->claim();
422 A->render(Args, CmdArgs);
423 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000424 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000425 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
426 DefaultModuleCache);
427 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
428 CmdArgs.push_back("-fmodule-cache-path");
429 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
430 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000431
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000432 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000433 // FIXME: We should probably sink the logic for handling these from the
434 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // CPATH - included following the user specified includes (but prior to
436 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000437 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000438 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000439 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000440 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000441 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000442 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000443 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000444 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000445 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000446
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000447 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000448 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000449 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000450
451 // Add system include arguments.
452 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000453}
454
Daniel Dunbarf492c922009-09-10 22:59:51 +0000455/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000456/// CPU.
457//
458// FIXME: This is redundant with -mcpu, why does LLVM use this.
459// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000460static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000461 return llvm::StringSwitch<const char *>(CPU)
462 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
463 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
464 .Cases("arm920", "arm920t", "arm922t", "v4t")
465 .Cases("arm940t", "ep9312","v4t")
466 .Cases("arm10tdmi", "arm1020t", "v5")
467 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
468 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
469 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
470 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
471 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
472 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Silviu Baranga157f7c62012-09-13 15:06:00 +0000473 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000474 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000475 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000476 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000477 .Case("cortex-a9-mp", "v7f")
478 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000479 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000480}
481
Benjamin Kramer09811c72012-06-26 22:20:06 +0000482/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
483//
484// FIXME: tblgen this.
485static std::string getARMTargetCPU(const ArgList &Args,
486 const llvm::Triple &Triple) {
487 // FIXME: Warn on inconsistent use of -mcpu and -march.
488
489 // If we have -mcpu=, use that.
490 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000491 StringRef MCPU = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000492 // Handle -mcpu=native.
493 if (MCPU == "native")
494 return llvm::sys::getHostCPUName();
495 else
496 return MCPU;
497 }
498
499 StringRef MArch;
500 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
501 // Otherwise, if we have -march= choose the base CPU for that arch.
Richard Smithbd55daf2012-11-01 04:30:05 +0000502 MArch = A->getValue();
Benjamin Kramer09811c72012-06-26 22:20:06 +0000503 } else {
504 // Otherwise, use the Arch from the triple.
505 MArch = Triple.getArchName();
506 }
507
508 // Handle -march=native.
509 std::string NativeMArch;
510 if (MArch == "native") {
511 std::string CPU = llvm::sys::getHostCPUName();
512 if (CPU != "generic") {
513 // Translate the native cpu into the architecture. The switch below will
514 // then chose the minimum cpu for that arch.
515 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
516 MArch = NativeMArch;
517 }
518 }
519
520 return llvm::StringSwitch<const char *>(MArch)
521 .Cases("armv2", "armv2a","arm2")
522 .Case("armv3", "arm6")
523 .Case("armv3m", "arm7m")
524 .Cases("armv4", "armv4t", "arm7tdmi")
525 .Cases("armv5", "armv5t", "arm10tdmi")
526 .Cases("armv5e", "armv5te", "arm1022e")
527 .Case("armv5tej", "arm926ej-s")
528 .Cases("armv6", "armv6k", "arm1136jf-s")
529 .Case("armv6j", "arm1136j-s")
530 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
531 .Case("armv6t2", "arm1156t2-s")
532 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000533 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
534 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000535 .Cases("armv7r", "armv7-r", "cortex-r4")
536 .Cases("armv7m", "armv7-m", "cortex-m3")
537 .Case("ep9312", "ep9312")
538 .Case("iwmmxt", "iwmmxt")
539 .Case("xscale", "xscale")
540 .Cases("armv6m", "armv6-m", "cortex-m0")
541 // If all else failed, return the most base CPU LLVM supports.
542 .Default("arm7tdmi");
543}
544
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000545// FIXME: Move to target hook.
546static bool isSignedCharDefault(const llvm::Triple &Triple) {
547 switch (Triple.getArch()) {
548 default:
549 return true;
550
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000551 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000552 case llvm::Triple::ppc:
553 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000554 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000555 return true;
556 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000557 }
558}
559
Chad Rosiercfbfc582012-04-04 20:51:35 +0000560// Handle -mfpu=.
561//
562// FIXME: Centralize feature selection, defaulting shouldn't be also in the
563// frontend target.
564static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
565 ArgStringList &CmdArgs) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000566 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000567
568 // Set the target features based on the FPU.
569 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
570 // Disable any default FPU support.
571 CmdArgs.push_back("-target-feature");
572 CmdArgs.push_back("-vfp2");
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("-vfp3");
575 CmdArgs.push_back("-target-feature");
576 CmdArgs.push_back("-neon");
577 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
578 CmdArgs.push_back("-target-feature");
579 CmdArgs.push_back("+vfp3");
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+d16");
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("-neon");
584 } else if (FPU == "vfp") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("+vfp2");
587 CmdArgs.push_back("-target-feature");
588 CmdArgs.push_back("-neon");
589 } else if (FPU == "vfp3" || FPU == "vfpv3") {
590 CmdArgs.push_back("-target-feature");
591 CmdArgs.push_back("+vfp3");
592 CmdArgs.push_back("-target-feature");
593 CmdArgs.push_back("-neon");
594 } else if (FPU == "neon") {
595 CmdArgs.push_back("-target-feature");
596 CmdArgs.push_back("+neon");
597 } else
598 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
599}
600
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000601// Handle -mfpmath=.
602static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000603 ArgStringList &CmdArgs, StringRef CPU) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000604 StringRef FPMath = A->getValue();
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000605
606 // Set the target features based on the FPMath.
607 if (FPMath == "neon") {
608 CmdArgs.push_back("-target-feature");
609 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000610
Silviu Baranga157f7c62012-09-13 15:06:00 +0000611 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
612 CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000613 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
614
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000615 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
616 FPMath == "vfp4") {
617 CmdArgs.push_back("-target-feature");
618 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000619
620 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000621 } else
622 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
623}
624
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000625// Select the float ABI as determined by -msoft-float, -mhard-float, and
626// -mfloat-abi=.
627static StringRef getARMFloatABI(const Driver &D,
628 const ArgList &Args,
629 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000630 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000631 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
632 options::OPT_mhard_float,
633 options::OPT_mfloat_abi_EQ)) {
634 if (A->getOption().matches(options::OPT_msoft_float))
635 FloatABI = "soft";
636 else if (A->getOption().matches(options::OPT_mhard_float))
637 FloatABI = "hard";
638 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000639 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000640 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000641 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000642 << A->getAsString(Args);
643 FloatABI = "soft";
644 }
645 }
646 }
647
648 // If unspecified, choose the default based on the platform.
649 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000650 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000651 case llvm::Triple::Darwin:
652 case llvm::Triple::MacOSX:
653 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000654 // Darwin defaults to "softfp" for v6 and v7.
655 //
656 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000657 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000658 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000659 if (StringRef(ArchName).startswith("v6") ||
660 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000661 FloatABI = "softfp";
662 else
663 FloatABI = "soft";
664 break;
665 }
666
667 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000668 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000669 case llvm::Triple::GNUEABIHF:
670 FloatABI = "hard";
671 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000672 case llvm::Triple::GNUEABI:
673 FloatABI = "softfp";
674 break;
675 case llvm::Triple::EABI:
676 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
677 FloatABI = "softfp";
678 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000679 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000680 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000681 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000682 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000683 FloatABI = "softfp";
684 else
685 FloatABI = "soft";
686 break;
687 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000688 default:
689 // Assume "soft", but warn the user we are guessing.
690 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000691 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000692 break;
693 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000694 }
695 }
696
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000697 return FloatABI;
698}
699
700
701void Clang::AddARMTargetArgs(const ArgList &Args,
702 ArgStringList &CmdArgs,
703 bool KernelOrKext) const {
704 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000705 // Get the effective triple, which takes into account the deployment target.
706 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
707 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000708 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000709
710 // Select the ABI to use.
711 //
712 // FIXME: Support -meabi.
713 const char *ABIName = 0;
714 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000715 ABIName = A->getValue();
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000716 } else if (Triple.isOSDarwin()) {
717 // The backend is hardwired to assume AAPCS for M-class processors, ensure
718 // the frontend matches that.
719 if (StringRef(CPUName).startswith("cortex-m")) {
720 ABIName = "aapcs";
721 } else {
722 ABIName = "apcs-gnu";
723 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000724 } else {
725 // Select the default based on the platform.
726 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000727 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000728 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000729 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000730 ABIName = "aapcs-linux";
731 break;
732 case llvm::Triple::EABI:
733 ABIName = "aapcs";
734 break;
735 default:
736 ABIName = "apcs-gnu";
737 }
738 }
739 CmdArgs.push_back("-target-abi");
740 CmdArgs.push_back(ABIName);
741
742 // Set the CPU based on -march= and -mcpu=.
743 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000744 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000745
746 // Determine floating point ABI from the options & target defaults.
747 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000748 if (FloatABI == "soft") {
749 // Floating point operations and argument passing are soft.
750 //
751 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000752 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000753 CmdArgs.push_back("-mfloat-abi");
754 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 } else if (FloatABI == "softfp") {
756 // Floating point operations are hard, but argument passing is soft.
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 {
760 // Floating point operations and argument passing are hard.
761 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000762 CmdArgs.push_back("-mfloat-abi");
763 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000765
766 // Set appropriate target features for floating point mode.
767 //
768 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
769 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
770 // stripped out by the ARM target.
771
772 // Use software floating point operations?
773 if (FloatABI == "soft") {
774 CmdArgs.push_back("-target-feature");
775 CmdArgs.push_back("+soft-float");
776 }
777
778 // Use software floating point argument passing?
779 if (FloatABI != "hard") {
780 CmdArgs.push_back("-target-feature");
781 CmdArgs.push_back("+soft-float-abi");
782 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000783
784 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000785 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000786 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000787
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000788 // Honor -mfpmath=.
789 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000790 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000791
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000792 // Setting -msoft-float effectively disables NEON because of the GCC
793 // implementation, although the same isn't true of VFP or VFP3.
794 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000795 CmdArgs.push_back("-target-feature");
796 CmdArgs.push_back("-neon");
797 }
798
799 // Kernel code has more strict alignment requirements.
800 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000801 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
802 CmdArgs.push_back("-backend-option");
803 CmdArgs.push_back("-arm-long-calls");
804 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000805
Daniel Dunbar12100e22011-03-22 16:48:17 +0000806 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000807 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000808
809 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000810 CmdArgs.push_back("-backend-option");
811 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000812 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000813
814 // Setting -mno-global-merge disables the codegen global merge pass. Setting
815 // -mglobal-merge has no effect as the pass is enabled by default.
816 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
817 options::OPT_mno_global_merge)) {
818 if (A->getOption().matches(options::OPT_mno_global_merge))
819 CmdArgs.push_back("-mno-global-merge");
820 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000821
Chad Rosierc14ded72012-05-16 21:19:55 +0000822 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000823 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000824}
825
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000826// Translate MIPS CPU name alias option to CPU name.
827static StringRef getMipsCPUFromAlias(const Arg &A) {
828 if (A.getOption().matches(options::OPT_mips32))
829 return "mips32";
830 if (A.getOption().matches(options::OPT_mips32r2))
831 return "mips32r2";
832 if (A.getOption().matches(options::OPT_mips64))
833 return "mips64";
834 if (A.getOption().matches(options::OPT_mips64r2))
835 return "mips64r2";
836 llvm_unreachable("Unexpected option");
837 return "";
838}
839
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000840// Get CPU and ABI names. They are not independent
841// so we have to calculate them together.
842static void getMipsCPUAndABI(const ArgList &Args,
843 const ToolChain &TC,
844 StringRef &CPUName,
845 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000846 const char *DefMips32CPU = "mips32";
847 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000848
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000849 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000850 options::OPT_mcpu_EQ,
851 options::OPT_mips_CPUs_Group)) {
852 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
853 CPUName = getMipsCPUFromAlias(*A);
854 else
Richard Smithbd55daf2012-11-01 04:30:05 +0000855 CPUName = A->getValue();
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000856 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000857
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000858 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +0000859 ABIName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000860
861 // Setup default CPU and ABI names.
862 if (CPUName.empty() && ABIName.empty()) {
863 switch (TC.getTriple().getArch()) {
864 default:
865 llvm_unreachable("Unexpected triple arch name");
866 case llvm::Triple::mips:
867 case llvm::Triple::mipsel:
868 CPUName = DefMips32CPU;
869 break;
870 case llvm::Triple::mips64:
871 case llvm::Triple::mips64el:
872 CPUName = DefMips64CPU;
873 break;
874 }
875 }
876
877 if (!ABIName.empty()) {
878 // Deduce CPU name from ABI name.
879 CPUName = llvm::StringSwitch<const char *>(ABIName)
880 .Cases("o32", "eabi", DefMips32CPU)
881 .Cases("n32", "n64", DefMips64CPU)
882 .Default("");
883 }
884 else if (!CPUName.empty()) {
885 // Deduce ABI name from CPU name.
886 ABIName = llvm::StringSwitch<const char *>(CPUName)
887 .Cases("mips32", "mips32r2", "o32")
888 .Cases("mips64", "mips64r2", "n64")
889 .Default("");
890 }
891
892 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000893}
894
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000895// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
896// and -mfloat-abi=.
897static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000898 // Select the float ABI as determined by -msoft-float, -mhard-float,
899 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000900 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000901 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000902 options::OPT_mhard_float,
903 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000904 if (A->getOption().matches(options::OPT_msoft_float))
905 FloatABI = "soft";
906 else if (A->getOption().matches(options::OPT_mhard_float))
907 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000908 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000909 FloatABI = A->getValue();
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000910 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000911 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000912 FloatABI = "hard";
913 }
914 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000915 }
916
917 // If unspecified, choose the default based on the platform.
918 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000919 // Assume "hard", because it's a default value used by gcc.
920 // When we start to recognize specific target MIPS processors,
921 // we will be able to select the default more correctly.
922 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000923 }
924
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000925 return FloatABI;
926}
927
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000928static void AddTargetFeature(const ArgList &Args,
929 ArgStringList &CmdArgs,
930 OptSpecifier OnOpt,
931 OptSpecifier OffOpt,
932 StringRef FeatureName) {
933 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
934 CmdArgs.push_back("-target-feature");
935 if (A->getOption().matches(OnOpt))
936 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
937 else
938 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
939 }
940}
941
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000942void Clang::AddMIPSTargetArgs(const ArgList &Args,
943 ArgStringList &CmdArgs) const {
944 const Driver &D = getToolChain().getDriver();
945 StringRef CPUName;
946 StringRef ABIName;
947 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
948
949 CmdArgs.push_back("-target-cpu");
950 CmdArgs.push_back(CPUName.data());
951
952 CmdArgs.push_back("-target-abi");
953 CmdArgs.push_back(ABIName.data());
954
955 StringRef FloatABI = getMipsFloatABI(D, Args);
956
Eric Christopher0b26a612010-03-02 02:41:08 +0000957 if (FloatABI == "soft") {
958 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000959 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000960 CmdArgs.push_back("-mfloat-abi");
961 CmdArgs.push_back("soft");
962
963 // FIXME: Note, this is a hack. We need to pass the selected float
964 // mode to the MipsTargetInfoBase to define appropriate macros there.
965 // Now it is the only method.
966 CmdArgs.push_back("-target-feature");
967 CmdArgs.push_back("+soft-float");
968 }
969 else if (FloatABI == "single") {
970 // Restrict the use of hardware floating-point
971 // instructions to 32-bit operations.
972 CmdArgs.push_back("-target-feature");
973 CmdArgs.push_back("+single-float");
974 }
975 else {
976 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000977 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000978 CmdArgs.push_back("-mfloat-abi");
979 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000980 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000981
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000982 AddTargetFeature(Args, CmdArgs,
983 options::OPT_mips16, options::OPT_mno_mips16,
984 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000985 AddTargetFeature(Args, CmdArgs,
986 options::OPT_mdsp, options::OPT_mno_dsp,
987 "dsp");
988 AddTargetFeature(Args, CmdArgs,
989 options::OPT_mdspr2, options::OPT_mno_dspr2,
990 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000991
992 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000993 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000994 CmdArgs.push_back("-mllvm");
995 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
996 A->claim();
997 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000998}
999
Hal Finkel8eb59282012-06-11 22:35:19 +00001000/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1001static std::string getPPCTargetCPU(const ArgList &Args) {
1002 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001003 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001004
1005 if (CPUName == "native") {
1006 std::string CPU = llvm::sys::getHostCPUName();
1007 if (!CPU.empty() && CPU != "generic")
1008 return CPU;
1009 else
1010 return "";
1011 }
1012
1013 return llvm::StringSwitch<const char *>(CPUName)
1014 .Case("common", "generic")
1015 .Case("440", "440")
1016 .Case("440fp", "440")
1017 .Case("450", "450")
1018 .Case("601", "601")
1019 .Case("602", "602")
1020 .Case("603", "603")
1021 .Case("603e", "603e")
1022 .Case("603ev", "603ev")
1023 .Case("604", "604")
1024 .Case("604e", "604e")
1025 .Case("620", "620")
1026 .Case("G3", "g3")
1027 .Case("7400", "7400")
1028 .Case("G4", "g4")
1029 .Case("7450", "7450")
1030 .Case("G4+", "g4+")
1031 .Case("750", "750")
1032 .Case("970", "970")
1033 .Case("G5", "g5")
1034 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001035 .Case("e500mc", "e500mc")
1036 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +00001037 .Case("power6", "pwr6")
1038 .Case("power7", "pwr7")
1039 .Case("powerpc", "ppc")
1040 .Case("powerpc64", "ppc64")
1041 .Default("");
1042 }
1043
1044 return "";
1045}
1046
1047void Clang::AddPPCTargetArgs(const ArgList &Args,
1048 ArgStringList &CmdArgs) const {
1049 std::string TargetCPUName = getPPCTargetCPU(Args);
1050
1051 // LLVM may default to generating code for the native CPU,
1052 // but, like gcc, we default to a more generic option for
1053 // each architecture. (except on Darwin)
1054 llvm::Triple Triple = getToolChain().getTriple();
1055 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1056 if (Triple.getArch() == llvm::Triple::ppc64)
1057 TargetCPUName = "ppc64";
1058 else
1059 TargetCPUName = "ppc";
1060 }
1061
1062 if (!TargetCPUName.empty()) {
1063 CmdArgs.push_back("-target-cpu");
1064 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1065 }
1066}
1067
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001068void Clang::AddSparcTargetArgs(const ArgList &Args,
1069 ArgStringList &CmdArgs) const {
1070 const Driver &D = getToolChain().getDriver();
1071
1072 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001073 CmdArgs.push_back("-target-cpu");
Richard Smithbd55daf2012-11-01 04:30:05 +00001074 CmdArgs.push_back(A->getValue());
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001075 }
1076
1077 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001078 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001079 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1080 options::OPT_mhard_float)) {
1081 if (A->getOption().matches(options::OPT_msoft_float))
1082 FloatABI = "soft";
1083 else if (A->getOption().matches(options::OPT_mhard_float))
1084 FloatABI = "hard";
1085 }
1086
1087 // If unspecified, choose the default based on the platform.
1088 if (FloatABI.empty()) {
1089 switch (getToolChain().getTriple().getOS()) {
1090 default:
1091 // Assume "soft", but warn the user we are guessing.
1092 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001093 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001094 break;
1095 }
1096 }
1097
1098 if (FloatABI == "soft") {
1099 // Floating point operations and argument passing are soft.
1100 //
1101 // FIXME: This changes CPP defines, we need -target-soft-float.
1102 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001103 CmdArgs.push_back("-target-feature");
1104 CmdArgs.push_back("+soft-float");
1105 } else {
1106 assert(FloatABI == "hard" && "Invalid float abi!");
1107 CmdArgs.push_back("-mhard-float");
1108 }
1109}
1110
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001111void Clang::AddX86TargetArgs(const ArgList &Args,
1112 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001113 if (!Args.hasFlag(options::OPT_mred_zone,
1114 options::OPT_mno_red_zone,
1115 true) ||
1116 Args.hasArg(options::OPT_mkernel) ||
1117 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001118 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001119
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001120 if (Args.hasFlag(options::OPT_msoft_float,
1121 options::OPT_mno_soft_float,
1122 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001123 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001124
Daniel Dunbare13ada62009-11-14 22:04:54 +00001125 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001126 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001127 if (StringRef(A->getValue()) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001128 // FIXME: Reject attempts to use -march=native unless the target matches
1129 // the host.
1130 //
1131 // FIXME: We should also incorporate the detected target features for use
1132 // with -native.
1133 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001134 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001135 CPUName = Args.MakeArgString(CPU);
1136 } else
Richard Smithbd55daf2012-11-01 04:30:05 +00001137 CPUName = A->getValue();
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001139
Daniel Dunbare13ada62009-11-14 22:04:54 +00001140 // Select the default CPU if none was given (or detection failed).
1141 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001142 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001143 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001144 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001145 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001146 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001147 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001148 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001149 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001150 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001151 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001152 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001153 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001154 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001155 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001156 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001157 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001158 } else if (getToolChain().getOS().startswith("bitrig")) {
1159 if (getToolChain().getArch() == llvm::Triple::x86_64)
1160 CPUName = "x86-64";
1161 else if (getToolChain().getArch() == llvm::Triple::x86)
1162 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001163 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001164 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001165 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001166 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001167 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001168 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001169 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001170 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001171 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001172 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001173 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001174 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001175 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001176 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001177 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001178 }
1179 }
1180
Daniel Dunbare13ada62009-11-14 22:04:54 +00001181 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001182 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001183 CmdArgs.push_back(CPUName);
1184 }
1185
Eli Friedmanad811f02011-07-02 00:34:19 +00001186 // The required algorithm here is slightly strange: the options are applied
1187 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1188 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1189 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1190 // former correctly, but not the latter; handle directly-overridden
1191 // attributes here.
1192 llvm::StringMap<unsigned> PrevFeature;
1193 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001194 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1195 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001196 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001197 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001198
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001199 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001200 assert(Name.startswith("m") && "Invalid feature name.");
1201 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001202
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001203 bool IsNegative = Name.startswith("no-");
1204 if (IsNegative)
1205 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001206
Eli Friedmanad811f02011-07-02 00:34:19 +00001207 unsigned& Prev = PrevFeature[Name];
1208 if (Prev)
1209 Features[Prev - 1] = 0;
1210 Prev = Features.size() + 1;
1211 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1212 }
1213 for (unsigned i = 0; i < Features.size(); i++) {
1214 if (Features[i]) {
1215 CmdArgs.push_back("-target-feature");
1216 CmdArgs.push_back(Features[i]);
1217 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001218 }
1219}
1220
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221static Arg* getLastHexagonArchArg (const ArgList &Args)
1222{
1223 Arg * A = NULL;
1224
Sebastian Pop86500282012-01-13 20:37:10 +00001225 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1226 it != ie; ++it) {
1227 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001228 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1229 A = *it;
1230 A->claim();
1231 }
Sebastian Pop86500282012-01-13 20:37:10 +00001232 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
Richard Smithbd55daf2012-11-01 04:30:05 +00001233 StringRef Value = (*it)->getValue(0);
Sebastian Pop86500282012-01-13 20:37:10 +00001234 if (Value.startswith("v")) {
1235 A = *it;
1236 A->claim();
1237 }
1238 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001239 }
1240 return A;
1241}
1242
Sebastian Pop86500282012-01-13 20:37:10 +00001243static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001244{
1245 Arg *A;
1246 llvm::StringRef WhichHexagon;
1247
Sebastian Pop86500282012-01-13 20:37:10 +00001248 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001249 if ((A = getLastHexagonArchArg (Args))) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001250 WhichHexagon = A->getValue();
Sebastian Pop86500282012-01-13 20:37:10 +00001251 if (WhichHexagon == "")
1252 return "v4";
1253 else
1254 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001255 }
Sebastian Pop86500282012-01-13 20:37:10 +00001256 else
1257 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001258}
1259
1260void Clang::AddHexagonTargetArgs(const ArgList &Args,
1261 ArgStringList &CmdArgs) const {
1262 llvm::Triple Triple = getToolChain().getTriple();
1263
1264 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001265 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001266 CmdArgs.push_back("-fno-signed-char");
1267 CmdArgs.push_back("-nobuiltininc");
1268
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001269 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001270 CmdArgs.push_back("-mqdsp6-compat");
1271
1272 if (Arg *A = Args.getLastArg(options::OPT_G,
1273 options::OPT_msmall_data_threshold_EQ)) {
1274 std::string SmallDataThreshold="-small-data-threshold=";
Richard Smithbd55daf2012-11-01 04:30:05 +00001275 SmallDataThreshold += A->getValue();
Tony Linthicum76329bf2011-12-12 21:14:55 +00001276 CmdArgs.push_back ("-mllvm");
1277 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1278 A->claim();
1279 }
1280
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001281 if (!Args.hasArg(options::OPT_fno_short_enums))
1282 CmdArgs.push_back("-fshort-enums");
1283 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1284 CmdArgs.push_back ("-mllvm");
1285 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1286 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001287 CmdArgs.push_back ("-mllvm");
1288 CmdArgs.push_back ("-machine-sink-split=0");
1289}
1290
Eric Christopher84fbdb42011-08-19 00:30:14 +00001291static bool
John McCall5fb5df92012-06-20 06:18:46 +00001292shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001293 const llvm::Triple &Triple) {
1294 // We use the zero-cost exception tables for Objective-C if the non-fragile
1295 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1296 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001297 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001298 return true;
1299
Bob Wilson6524dd32011-10-14 05:03:44 +00001300 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001301 return false;
1302
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001303 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001304 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001305 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001306}
1307
Anders Carlssone96ab552011-02-28 02:27:16 +00001308/// addExceptionArgs - Adds exception related arguments to the driver command
1309/// arguments. There's a master flag, -fexceptions and also language specific
1310/// flags to enable/disable C++ and Objective-C exceptions.
1311/// This makes it possible to for example disable C++ exceptions but enable
1312/// Objective-C exceptions.
1313static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1314 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001315 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001316 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001317 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001318 if (KernelOrKext) {
1319 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1320 // arguments now to avoid warnings about unused arguments.
1321 Args.ClaimAllArgs(options::OPT_fexceptions);
1322 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1323 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1324 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1325 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1326 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001327 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001328 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001329
1330 // Exceptions are enabled by default.
1331 bool ExceptionsEnabled = true;
1332
1333 // This keeps track of whether exceptions were explicitly turned on or off.
1334 bool DidHaveExplicitExceptionFlag = false;
1335
Rafael Espindola00a66572009-10-01 13:33:33 +00001336 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1337 options::OPT_fno_exceptions)) {
1338 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001339 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001340 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001341 ExceptionsEnabled = false;
1342
1343 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001344 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001345
Anders Carlssone96ab552011-02-28 02:27:16 +00001346 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001347
Anders Carlssone96ab552011-02-28 02:27:16 +00001348 // Exception tables and cleanups can be enabled with -fexceptions even if the
1349 // language itself doesn't support exceptions.
1350 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1351 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001352
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001353 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1354 // is not necessarily sensible, but follows GCC.
1355 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001356 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001357 options::OPT_fno_objc_exceptions,
1358 true)) {
1359 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001360
Eric Christopher84fbdb42011-08-19 00:30:14 +00001361 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001362 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001363 }
1364
1365 if (types::isCXX(InputType)) {
1366 bool CXXExceptionsEnabled = ExceptionsEnabled;
1367
Eric Christopher84fbdb42011-08-19 00:30:14 +00001368 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1369 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001370 options::OPT_fexceptions,
1371 options::OPT_fno_exceptions)) {
1372 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1373 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001374 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001375 CXXExceptionsEnabled = false;
1376 }
1377
1378 if (CXXExceptionsEnabled) {
1379 CmdArgs.push_back("-fcxx-exceptions");
1380
1381 ShouldUseExceptionTables = true;
1382 }
1383 }
1384
1385 if (ShouldUseExceptionTables)
1386 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001387}
1388
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001389static bool ShouldDisableCFI(const ArgList &Args,
1390 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001391 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001392 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001393 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001394 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001395 Default = Args.hasFlag(options::OPT_integrated_as,
1396 options::OPT_no_integrated_as,
1397 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001398 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001399 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1400 options::OPT_fno_dwarf2_cfi_asm,
1401 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001402}
1403
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001404static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1405 const ToolChain &TC) {
1406 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1407 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1408 options::OPT_no_integrated_as,
1409 IsIADefault);
1410 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1411 options::OPT_fno_dwarf_directory_asm,
1412 UseIntegratedAs);
1413 return !UseDwarfDirectory;
1414}
1415
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001416/// \brief Check whether the given input tree contains any compilation actions.
1417static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001418 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001419 return true;
1420
1421 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1422 if (ContainsCompileAction(*it))
1423 return true;
1424
1425 return false;
1426}
1427
1428/// \brief Check if -relax-all should be passed to the internal assembler.
1429/// This is done by default when compiling non-assembler source with -O0.
1430static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1431 bool RelaxDefault = true;
1432
1433 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1434 RelaxDefault = A->getOption().matches(options::OPT_O0);
1435
1436 if (RelaxDefault) {
1437 RelaxDefault = false;
1438 for (ActionList::const_iterator it = C.getActions().begin(),
1439 ie = C.getActions().end(); it != ie; ++it) {
1440 if (ContainsCompileAction(*it)) {
1441 RelaxDefault = true;
1442 break;
1443 }
1444 }
1445 }
1446
1447 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1448 RelaxDefault);
1449}
1450
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001451/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1452/// This needs to be called before we add the C run-time (malloc, etc).
1453static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001454 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001455 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001456 options::OPT_fno_address_sanitizer, false))
1457 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001458 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001459 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001460 if (!Args.hasArg(options::OPT_pie))
1461 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001462 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001463
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001464 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1465 llvm::sys::path::append(LibAsan, "lib", "linux",
1466 (Twine("libclang_rt.asan-") +
1467 TC.getArchName() + "-android.so"));
1468 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001469 } else {
1470 if (!Args.hasArg(options::OPT_shared)) {
1471 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1472 // resource directory.
1473 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1474 llvm::sys::path::append(LibAsan, "lib", "linux",
1475 (Twine("libclang_rt.asan-") +
1476 TC.getArchName() + ".a"));
1477 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1478 CmdArgs.push_back("-lpthread");
1479 CmdArgs.push_back("-ldl");
1480 CmdArgs.push_back("-export-dynamic");
1481 }
1482 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001483}
1484
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001485/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1486/// This needs to be called before we add the C run-time (malloc, etc).
1487static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1488 ArgStringList &CmdArgs) {
1489 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1490 options::OPT_fno_thread_sanitizer, false))
1491 return;
1492 if (!Args.hasArg(options::OPT_shared)) {
1493 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1494 // resource directory.
1495 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1496 llvm::sys::path::append(LibTsan, "lib", "linux",
1497 (Twine("libclang_rt.tsan-") +
1498 TC.getArchName() + ".a"));
1499 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1500 CmdArgs.push_back("-lpthread");
1501 CmdArgs.push_back("-ldl");
1502 CmdArgs.push_back("-export-dynamic");
1503 }
1504}
1505
Richard Smithe30752c2012-10-09 19:52:38 +00001506/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1507/// (Linux).
1508static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1509 ArgStringList &CmdArgs) {
1510 if (!Args.hasArg(options::OPT_fcatch_undefined_behavior))
1511 return;
1512 if (!Args.hasArg(options::OPT_shared)) {
1513 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1514 // resource directory.
1515 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1516 llvm::sys::path::append(LibUbsan, "lib", "linux",
1517 (Twine("libclang_rt.ubsan-") +
1518 TC.getArchName() + ".a"));
1519 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
1520 }
1521}
1522
Rafael Espindola224dd632011-12-14 21:02:23 +00001523static bool shouldUseFramePointer(const ArgList &Args,
1524 const llvm::Triple &Triple) {
1525 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1526 options::OPT_fomit_frame_pointer))
1527 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1528
Rafael Espindola00b29182011-12-14 21:50:24 +00001529 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001530 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1531 Triple.getArch() == llvm::Triple::x86) &&
1532 Triple.getOS() == llvm::Triple::Linux) {
1533 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1534 if (!A->getOption().matches(options::OPT_O0))
1535 return false;
1536 }
1537
1538 return true;
1539}
1540
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001541void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001542 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001543 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001544 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001545 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001546 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1547 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001548 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001549 ArgStringList CmdArgs;
1550
Daniel Dunbare521a892009-03-31 20:53:55 +00001551 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1552
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001553 // Invoke ourselves in -cc1 mode.
1554 //
1555 // FIXME: Implement custom jobs for internal actions.
1556 CmdArgs.push_back("-cc1");
1557
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001558 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001559 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001560 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001561 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001562
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001563 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001564 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001565
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001566 if (isa<AnalyzeJobAction>(JA)) {
1567 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1568 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001569 } else if (isa<MigrateJobAction>(JA)) {
1570 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001571 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001572 if (Output.getType() == types::TY_Dependencies)
1573 CmdArgs.push_back("-Eonly");
1574 else
1575 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001576 } else if (isa<AssembleJobAction>(JA)) {
1577 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001578
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001579 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001580 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001581
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001582 // When using an integrated assembler, translate -Wa, and -Xassembler
1583 // options.
1584 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1585 options::OPT_Xassembler),
1586 ie = Args.filtered_end(); it != ie; ++it) {
1587 const Arg *A = *it;
1588 A->claim();
1589
1590 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001591 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001592
1593 if (Value == "-force_cpusubtype_ALL") {
1594 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001595 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001596 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001597 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001598 CmdArgs.push_back("-mllvm");
1599 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001600 } else if (Value == "--noexecstack") {
1601 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001602 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001603 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001604 << A->getOption().getName() << Value;
1605 }
1606 }
1607 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001608
1609 // Also ignore explicit -force_cpusubtype_ALL option.
1610 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001611 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001612 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001613 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001614
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001615 if (JA.getType() == types::TY_Nothing)
1616 CmdArgs.push_back("-fsyntax-only");
1617 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001618 CmdArgs.push_back("-emit-pch");
1619 else
1620 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001621 } else {
1622 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001623
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001624 if (JA.getType() == types::TY_Nothing) {
1625 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001626 } else if (JA.getType() == types::TY_LLVM_IR ||
1627 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001628 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001629 } else if (JA.getType() == types::TY_LLVM_BC ||
1630 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001631 CmdArgs.push_back("-emit-llvm-bc");
1632 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001633 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001634 } else if (JA.getType() == types::TY_AST) {
1635 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001636 } else if (JA.getType() == types::TY_RewrittenObjC) {
1637 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001638 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001639 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1640 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001641 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001642 } else {
1643 assert(JA.getType() == types::TY_PP_Asm &&
1644 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001645 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001646 }
1647
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001648 // The make clang go fast button.
1649 CmdArgs.push_back("-disable-free");
1650
John McCallbb79b5f2010-02-13 03:50:24 +00001651 // Disable the verification pass in -asserts builds.
1652#ifdef NDEBUG
1653 CmdArgs.push_back("-disable-llvm-verifier");
1654#endif
1655
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001656 // Set the main file name, so that debug info works even with
1657 // -save-temps.
1658 CmdArgs.push_back("-main-file-name");
1659 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1660
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001661 // Some flags which affect the language (via preprocessor
1662 // defines). See darwin::CC1::AddCPPArgs.
1663 if (Args.hasArg(options::OPT_static))
1664 CmdArgs.push_back("-static-define");
1665
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001666 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001667 // Enable region store model by default.
1668 CmdArgs.push_back("-analyzer-store=region");
1669
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001670 // Treat blocks as analysis entry points.
1671 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1672
Ted Kremenek49c79792011-03-24 00:28:47 +00001673 CmdArgs.push_back("-analyzer-eagerly-assume");
1674
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001675 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001676 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001677 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001678
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001679 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1680 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001681
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001682 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001683 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001684
1685 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001686
1687 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001688 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1689 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1690 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1693 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001694 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001695
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001696 // Set the output format. The default is plist, for (lame) historical
1697 // reasons.
1698 CmdArgs.push_back("-analyzer-output");
1699 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001700 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001701 else
1702 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001703
Ted Kremenekfe449a22010-03-22 22:32:05 +00001704 // Disable the presentation of standard compiler warnings when
1705 // using --analyze. We only want to show static analyzer diagnostics
1706 // or frontend errors.
1707 CmdArgs.push_back("-w");
1708
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001709 // Add -Xanalyzer arguments when running as analyzer.
1710 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001711 }
1712
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001713 CheckCodeGenerationOptions(D, Args);
1714
Daniel Dunbar44e71222009-04-29 18:32:25 +00001715 // Perform argument translation for LLVM backend. This
1716 // takes some care in reconciling with llvm-gcc. The
1717 // issue is that llvm-gcc translates these options based on
1718 // the values in cc1, whereas we are processing based on
1719 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001720
Daniel Dunbar44e71222009-04-29 18:32:25 +00001721 // This comes from the default translation the driver + cc1
1722 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001723
1724 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1725 options::OPT_fpic, options::OPT_fno_pic,
1726 options::OPT_fPIE, options::OPT_fno_PIE,
1727 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001728 bool PICDisabled = false;
1729 bool PICEnabled = false;
1730 bool PICForPIE = false;
1731 if (LastPICArg) {
1732 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1733 LastPICArg->getOption().matches(options::OPT_fpie));
1734 PICEnabled = (PICForPIE ||
1735 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1736 LastPICArg->getOption().matches(options::OPT_fpic));
1737 PICDisabled = !PICEnabled;
1738 }
1739 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1740 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001741 llvm::Triple Triple(TripleStr);
1742 if ((Args.hasArg(options::OPT_mkernel) ||
1743 Args.hasArg(options::OPT_fapple_kext)) &&
1744 (Triple.getOS() != llvm::Triple::IOS ||
1745 Triple.isOSVersionLT(6)))
Chandler Carruthc0c04552012-04-08 16:40:35 +00001746 PICDisabled = true;
1747 if (Args.hasArg(options::OPT_static))
1748 PICDisabled = true;
1749 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1750
1751 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001752 const char *Model = getToolChain().GetForcedPicModel();
1753 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001754 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001755 Model = "dynamic-no-pic";
1756 else if (PICDisabled)
1757 Model = "static";
1758 else if (PICEnabled)
1759 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001760 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001761 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001762 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001763 StringRef ModelStr = Model ? Model : "";
1764 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001765 CmdArgs.push_back("-mrelocation-model");
1766 CmdArgs.push_back(Model);
1767 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001768
Chandler Carruthc0c04552012-04-08 16:40:35 +00001769 // Infer the __PIC__ and __PIE__ values.
1770 if (ModelStr == "pic" && PICForPIE) {
1771 CmdArgs.push_back("-pie-level");
1772 CmdArgs.push_back((LastPICArg &&
1773 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1774 "2" : "1");
1775 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001776 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001777 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1778 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1779 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001780 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001781
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001782 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1783 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001784 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001785
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001786 // LLVM Code Generator Options.
1787
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001788 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1789 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00001790 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001791 }
1792
Roman Divacky65b88cd2011-03-01 17:40:53 +00001793 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1794 CmdArgs.push_back("-mrtd");
1795
Rafael Espindola224dd632011-12-14 21:02:23 +00001796 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001797 CmdArgs.push_back("-mdisable-fp-elim");
1798 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1799 options::OPT_fno_zero_initialized_in_bss))
1800 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001801 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1802 options::OPT_fno_strict_aliasing,
1803 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001804 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001805 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1806 false))
1807 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001808 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1809 options::OPT_fno_optimize_sibling_calls))
1810 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001811
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001812 // Handle various floating point optimization flags, mapping them to the
1813 // appropriate LLVM code generation flags. The pattern for all of these is to
1814 // default off the codegen optimizations, and if any flag enables them and no
1815 // flag disables them after the flag enabling them, enable the codegen
1816 // optimization. This is complicated by several "umbrella" flags.
1817 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001818 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001819 options::OPT_ffinite_math_only,
1820 options::OPT_fno_finite_math_only,
1821 options::OPT_fhonor_infinities,
1822 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001823 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1824 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001825 A->getOption().getID() != options::OPT_fhonor_infinities)
1826 CmdArgs.push_back("-menable-no-infs");
1827 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001828 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001829 options::OPT_ffinite_math_only,
1830 options::OPT_fno_finite_math_only,
1831 options::OPT_fhonor_nans,
1832 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001833 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1834 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001835 A->getOption().getID() != options::OPT_fhonor_nans)
1836 CmdArgs.push_back("-menable-no-nans");
1837
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001838 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1839 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001840 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001841 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001842 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001843 options::OPT_fno_math_errno))
1844 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1845 if (MathErrno)
1846 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001847
1848 // There are several flags which require disabling very specific
1849 // optimizations. Any of these being disabled forces us to turn off the
1850 // entire set of LLVM optimizations, so collect them through all the flag
1851 // madness.
1852 bool AssociativeMath = false;
1853 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001854 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001855 options::OPT_funsafe_math_optimizations,
1856 options::OPT_fno_unsafe_math_optimizations,
1857 options::OPT_fassociative_math,
1858 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001859 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1860 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001861 A->getOption().getID() != options::OPT_fno_associative_math)
1862 AssociativeMath = true;
1863 bool ReciprocalMath = false;
1864 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001865 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001866 options::OPT_funsafe_math_optimizations,
1867 options::OPT_fno_unsafe_math_optimizations,
1868 options::OPT_freciprocal_math,
1869 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001870 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1871 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001872 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1873 ReciprocalMath = true;
1874 bool SignedZeros = true;
1875 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001876 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001877 options::OPT_funsafe_math_optimizations,
1878 options::OPT_fno_unsafe_math_optimizations,
1879 options::OPT_fsigned_zeros,
1880 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001881 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1882 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001883 A->getOption().getID() != options::OPT_fsigned_zeros)
1884 SignedZeros = false;
1885 bool TrappingMath = true;
1886 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001887 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001888 options::OPT_funsafe_math_optimizations,
1889 options::OPT_fno_unsafe_math_optimizations,
1890 options::OPT_ftrapping_math,
1891 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001892 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1893 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001894 A->getOption().getID() != options::OPT_ftrapping_math)
1895 TrappingMath = false;
1896 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1897 !TrappingMath)
1898 CmdArgs.push_back("-menable-unsafe-fp-math");
1899
Lang Hamesaa53b932012-07-06 00:59:19 +00001900
1901 // Validate and pass through -fp-contract option.
1902 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001903 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001904 options::OPT_ffp_contract)) {
1905 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001906 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00001907 if (Val == "fast" || Val == "on" || Val == "off") {
1908 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1909 } else {
1910 D.Diag(diag::err_drv_unsupported_option_argument)
1911 << A->getOption().getName() << Val;
1912 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001913 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001914 // If fast-math is set then set the fp-contract mode to fast.
1915 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1916 }
1917 }
1918
Bob Wilson6a039162012-07-19 03:52:53 +00001919 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1920 // and if we find them, tell the frontend to provide the appropriate
1921 // preprocessor macros. This is distinct from enabling any optimizations as
1922 // these options induce language changes which must survive serialization
1923 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001924 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1925 if (A->getOption().matches(options::OPT_ffast_math))
1926 CmdArgs.push_back("-ffast-math");
1927 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1928 if (A->getOption().matches(options::OPT_ffinite_math_only))
1929 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001930
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001931 // Decide whether to use verbose asm. Verbose assembly is the default on
1932 // toolchains which have the integrated assembler on by default.
1933 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1934 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001935 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001936 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001937 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001938
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001939 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1940 CmdArgs.push_back("-mdebug-pass");
1941 CmdArgs.push_back("Structure");
1942 }
1943 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1944 CmdArgs.push_back("-mdebug-pass");
1945 CmdArgs.push_back("Arguments");
1946 }
1947
John McCall8517abc2010-02-19 02:45:38 +00001948 // Enable -mconstructor-aliases except on darwin, where we have to
1949 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001950 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001951 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001952
John McCall7ef5cb32011-03-18 02:56:14 +00001953 // Darwin's kernel doesn't support guard variables; just die if we
1954 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001955 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001956 CmdArgs.push_back("-fforbid-guard-variables");
1957
Douglas Gregordbe39272011-02-01 15:15:22 +00001958 if (Args.hasArg(options::OPT_mms_bitfields)) {
1959 CmdArgs.push_back("-mms-bitfields");
1960 }
John McCall8517abc2010-02-19 02:45:38 +00001961
Daniel Dunbar306945d2009-09-16 06:17:29 +00001962 // This is a coarse approximation of what llvm-gcc actually does, both
1963 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1964 // complicated ways.
1965 bool AsynchronousUnwindTables =
1966 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1967 options::OPT_fno_asynchronous_unwind_tables,
1968 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001969 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001970 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1971 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001972 CmdArgs.push_back("-munwind-tables");
1973
Rafael Espindola66aa0452012-06-19 01:26:10 +00001974 getToolChain().addClangTargetOptions(CmdArgs);
1975
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001976 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1977 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00001978 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001979 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001980
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001981 // FIXME: Handle -mtune=.
1982 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001983
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001984 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001985 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00001986 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001987 }
1988
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001989 // Add target specific cpu and features flags.
1990 switch(getToolChain().getTriple().getArch()) {
1991 default:
1992 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001993
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001994 case llvm::Triple::arm:
1995 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001996 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001997 break;
1998
Eric Christopher0b26a612010-03-02 02:41:08 +00001999 case llvm::Triple::mips:
2000 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002001 case llvm::Triple::mips64:
2002 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002003 AddMIPSTargetArgs(Args, CmdArgs);
2004 break;
2005
Hal Finkel8eb59282012-06-11 22:35:19 +00002006 case llvm::Triple::ppc:
2007 case llvm::Triple::ppc64:
2008 AddPPCTargetArgs(Args, CmdArgs);
2009 break;
2010
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002011 case llvm::Triple::sparc:
2012 AddSparcTargetArgs(Args, CmdArgs);
2013 break;
2014
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002015 case llvm::Triple::x86:
2016 case llvm::Triple::x86_64:
2017 AddX86TargetArgs(Args, CmdArgs);
2018 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002019
2020 case llvm::Triple::hexagon:
2021 AddHexagonTargetArgs(Args, CmdArgs);
2022 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002023 }
2024
Tony Linthicum76329bf2011-12-12 21:14:55 +00002025
2026
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002027 // Pass the linker version in use.
2028 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2029 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002030 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002031 }
2032
Nick Lewycky75033772011-02-02 06:43:03 +00002033 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002034 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002035 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002036 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002037 CmdArgs.push_back("-momit-leaf-frame-pointer");
2038
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002039 // Explicitly error on some things we know we don't support and can't just
2040 // ignore.
2041 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002042 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2043 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002044 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002045 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002046 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002047 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2048 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002049 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002050 << Unsupported->getOption().getName();
2051 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002052 }
2053
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002054 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002055 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002056 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002057 CmdArgs.push_back("-header-include-file");
2058 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2059 D.CCPrintHeadersFilename : "-");
2060 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002061 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002062 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002063
Chad Rosierbe10f982011-08-02 17:58:04 +00002064 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002065 CmdArgs.push_back("-diagnostic-log-file");
2066 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2067 D.CCLogDiagnosticsFilename : "-");
2068 }
2069
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002070 // Use the last option from "-g" group. "-gline-tables-only" is
2071 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002072 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002073 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2074 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2075 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002076 } else if (!A->getOption().matches(options::OPT_g0) &&
2077 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002078 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002079 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002080 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002081
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002082 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2083 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002084 if (Args.hasArg(options::OPT_gcolumn_info))
2085 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002086
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002087 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2088 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2089
Chris Lattner3c77a352010-06-22 00:03:40 +00002090 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2091
Nick Lewycky207bce32011-04-21 23:44:07 +00002092 if (Args.hasArg(options::OPT_ftest_coverage) ||
2093 Args.hasArg(options::OPT_coverage))
2094 CmdArgs.push_back("-femit-coverage-notes");
2095 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2096 Args.hasArg(options::OPT_coverage))
2097 CmdArgs.push_back("-femit-coverage-data");
2098
Nick Lewycky480cb992011-05-04 20:46:58 +00002099 if (C.getArgs().hasArg(options::OPT_c) ||
2100 C.getArgs().hasArg(options::OPT_S)) {
2101 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002102 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002103 SmallString<128> absFilename(Output.getFilename());
2104 llvm::sys::fs::make_absolute(absFilename);
2105 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002106 }
2107 }
2108
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002109 // Pass options for controlling the default header search paths.
2110 if (Args.hasArg(options::OPT_nostdinc)) {
2111 CmdArgs.push_back("-nostdsysteminc");
2112 CmdArgs.push_back("-nobuiltininc");
2113 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002114 if (Args.hasArg(options::OPT_nostdlibinc))
2115 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002116 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2117 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2118 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002119
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002120 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002121 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002122 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002123
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002124 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2125
Ted Kremenekf7639e12012-03-06 20:06:33 +00002126 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002127 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002128 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002129 options::OPT_ccc_arcmt_modify,
2130 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002131 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002132 switch (A->getOption().getID()) {
2133 default:
2134 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002135 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002136 CmdArgs.push_back("-arcmt-check");
2137 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002138 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002139 CmdArgs.push_back("-arcmt-modify");
2140 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002141 case options::OPT_ccc_arcmt_migrate:
2142 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002143 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002144 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002145
2146 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2147 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002148 break;
John McCalld70fb982011-06-15 23:25:17 +00002149 }
2150 }
2151 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002152
Ted Kremenekf7639e12012-03-06 20:06:33 +00002153 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2154 if (ARCMTEnabled) {
2155 D.Diag(diag::err_drv_argument_not_allowed_with)
2156 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2157 }
2158 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002159 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002160
2161 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2162 options::OPT_objcmt_migrate_subscripting)) {
2163 // None specified, means enable them all.
2164 CmdArgs.push_back("-objcmt-migrate-literals");
2165 CmdArgs.push_back("-objcmt-migrate-subscripting");
2166 } else {
2167 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2168 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2169 }
2170 }
2171
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002172 // Add preprocessing options like -I, -D, etc. if we are using the
2173 // preprocessor.
2174 //
2175 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002176 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002177 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002178
Rafael Espindolaa7431922011-07-21 23:40:37 +00002179 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2180 // that "The compiler can only warn and ignore the option if not recognized".
2181 // When building with ccache, it will pass -D options to clang even on
2182 // preprocessed inputs and configure concludes that -fPIC is not supported.
2183 Args.ClaimAllArgs(options::OPT_D);
2184
Daniel Dunbar58f78332009-09-17 06:53:36 +00002185 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002186 // others.
2187 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002188 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002189 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002190 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002191 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002192 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002193 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002194 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002195 }
2196
Daniel Dunbar945577c2009-10-29 02:24:45 +00002197 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002198 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2199 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002200 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002201 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002202
2203 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2204 // (-ansi is equivalent to -std=c89).
2205 //
2206 // If a std is supplied, only add -trigraphs if it follows the
2207 // option.
2208 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2209 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002210 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002211 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002212 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002213 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002214 else
2215 Std->render(Args, CmdArgs);
2216
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002217 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2218 options::OPT_trigraphs))
2219 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002220 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002221 } else {
2222 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002223 //
2224 // FIXME: Clang doesn't correctly handle -std= when the input language
2225 // doesn't match. For the time being just ignore this for C++ inputs;
2226 // eventually we want to do all the standard defaulting here instead of
2227 // splitting it between the driver and clang -cc1.
2228 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002229 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2230 "-std=", /*Joined=*/true);
2231 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2232 CmdArgs.push_back("-std=c++11");
2233
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002234 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002235 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002236
Chandler Carruthb009b142011-04-23 06:30:43 +00002237 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2238 // '-fconst-strings'; this better indicates its actual behavior.
2239 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2240 false)) {
2241 // For perfect compatibility with GCC, we do this even in the presence of
2242 // '-w'. This flag names something other than a warning for GCC.
2243 CmdArgs.push_back("-fconst-strings");
2244 }
2245
Chandler Carruth61fbf622011-04-23 09:27:53 +00002246 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002247 // during C++ compilation, which it is by default. GCC keeps this define even
2248 // in the presence of '-w', match this behavior bug-for-bug.
2249 if (types::isCXX(InputType) &&
2250 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2251 true)) {
2252 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002253 }
2254
Chandler Carruthe0391482010-05-22 02:21:53 +00002255 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2256 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2257 if (Asm->getOption().matches(options::OPT_fasm))
2258 CmdArgs.push_back("-fgnu-keywords");
2259 else
2260 CmdArgs.push_back("-fno-gnu-keywords");
2261 }
2262
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002263 if (ShouldDisableCFI(Args, getToolChain()))
2264 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002265
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002266 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2267 CmdArgs.push_back("-fno-dwarf-directory-asm");
2268
Nick Lewyckyba743b72011-10-21 02:32:14 +00002269 if (const char *pwd = ::getenv("PWD")) {
2270 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2271 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002272 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002273 std::string CompDir = pwd;
2274 CmdArgs.push_back("-fdebug-compilation-dir");
2275 CmdArgs.push_back(Args.MakeArgString(CompDir));
2276 }
2277 }
2278
Richard Smith9a568822011-11-21 19:36:32 +00002279 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2280 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002281 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002282 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002283 }
2284
Richard Smith9a568822011-11-21 19:36:32 +00002285 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2286 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002287 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002288 }
2289
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002290 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2291 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002292 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002293 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002294 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2295 } else
2296 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002297 }
2298
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002299 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2300 options::OPT_fbounds_checking_EQ)) {
2301 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002302 StringRef val = A->getValue();
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002303 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2304 } else
2305 CmdArgs.push_back("-fbounds-checking=1");
2306 }
2307
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002308 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002309 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002310
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002311 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2312 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002313 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002314 }
David Chisnall5778fce2009-08-31 16:41:57 +00002315
Chris Lattnere23003d2010-01-09 21:54:33 +00002316 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2317 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002318 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002319 }
2320
Chris Lattnerb35583d2010-04-07 20:49:23 +00002321 CmdArgs.push_back("-ferror-limit");
2322 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002323 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002324 else
2325 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002326
Chandler Carrutha77a7272010-05-06 04:55:18 +00002327 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2328 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002329 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002330 }
2331
2332 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2333 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002334 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002335 }
2336
Richard Smithf6f003a2011-12-16 19:06:07 +00002337 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2338 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002339 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002340 }
2341
Daniel Dunbar2c978472009-11-04 06:24:47 +00002342 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002343 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002344 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002345 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002346 } else {
2347 // If -fmessage-length=N was not specified, determine whether this is a
2348 // terminal and, if so, implicitly define -fmessage-length appropriately.
2349 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002350 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002351 }
2352
Daniel Dunbare357d562009-12-03 18:42:11 +00002353 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2354 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002355 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002356 }
2357
Douglas Gregor08329632010-06-15 17:05:35 +00002358 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002359
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002360 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2361
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002362 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002363 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2364 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002365 CmdArgs.push_back("-ffreestanding");
2366
Daniel Dunbare357d562009-12-03 18:42:11 +00002367 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002368 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002369 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002370 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002371 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002372 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002373 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002374 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002375 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2376 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002377
2378 // Report and error for -faltivec on anything other then PowerPC.
2379 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2380 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2381 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2382 D.Diag(diag::err_drv_argument_only_allowed_with)
2383 << A->getAsString(Args) << "ppc/ppc64";
2384
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002385 if (getToolChain().SupportsProfiling())
2386 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002387
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002388 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2389 options::OPT_fno_address_sanitizer, false))
2390 CmdArgs.push_back("-faddress-sanitizer");
2391
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002392 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2393 options::OPT_fno_thread_sanitizer, false))
2394 CmdArgs.push_back("-fthread-sanitizer");
2395
Daniel Dunbar35621a92010-03-16 16:57:46 +00002396 // -flax-vector-conversions is default.
2397 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2398 options::OPT_fno_lax_vector_conversions))
2399 CmdArgs.push_back("-fno-lax-vector-conversions");
2400
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002401 if (Args.getLastArg(options::OPT_fapple_kext))
2402 CmdArgs.push_back("-fapple-kext");
2403
David Blaikie690f21e2012-06-14 18:55:27 +00002404 if (Args.hasFlag(options::OPT_frewrite_includes,
2405 options::OPT_fno_rewrite_includes, false))
2406 CmdArgs.push_back("-frewrite-includes");
2407
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002408 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002409 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002410 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002411 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2412 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002413
2414 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2415 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002416 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002417 }
2418
Bob Wilson14adb362012-02-03 06:27:22 +00002419 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002420
Chandler Carruth6e501032011-03-27 00:04:55 +00002421 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2422 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2423 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2424 options::OPT_fno_wrapv)) {
2425 if (A->getOption().matches(options::OPT_fwrapv))
2426 CmdArgs.push_back("-fwrapv");
2427 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2428 options::OPT_fno_strict_overflow)) {
2429 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2430 CmdArgs.push_back("-fwrapv");
2431 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002432 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002433 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002434
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002435 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2436
Mahesha S6a682be42012-10-27 07:47:56 +00002437
Daniel Dunbar4930e332009-11-17 08:07:36 +00002438 // -stack-protector=0 is default.
2439 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002440 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2441 options::OPT_fstack_protector_all,
2442 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002443 if (A->getOption().matches(options::OPT_fstack_protector))
2444 StackProtectorLevel = 1;
2445 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2446 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002447 } else {
2448 StackProtectorLevel =
2449 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2450 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002451 if (StackProtectorLevel) {
2452 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002453 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002454 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002455
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002456 // --param ssp-buffer-size=
2457 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2458 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002459 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002460 if (Str.startswith("ssp-buffer-size=")) {
2461 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002462 CmdArgs.push_back("-stack-protector-buffer-size");
2463 // FIXME: Verify the argument is a valid integer.
2464 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002465 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002466 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002467 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002468 }
2469
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002470 // Translate -mstackrealign
2471 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2472 false)) {
2473 CmdArgs.push_back("-backend-option");
2474 CmdArgs.push_back("-force-align-stack");
2475 }
2476 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2477 false)) {
2478 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2479 }
2480
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002481 if (Args.hasArg(options::OPT_mstack_alignment)) {
2482 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2483 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002484 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002485
Daniel Dunbard18049a2009-04-07 21:16:11 +00002486 // Forward -f options with positive and negative forms; we translate
2487 // these by hand.
2488
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002489 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002490 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002491 CmdArgs.push_back("-fapple-kext");
2492 if (!Args.hasArg(options::OPT_fbuiltin))
2493 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002494 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002495 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002496 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002497 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002498 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002499
Nuno Lopes13c88c72009-12-16 16:59:22 +00002500 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2501 options::OPT_fno_assume_sane_operator_new))
2502 CmdArgs.push_back("-fno-assume-sane-operator-new");
2503
Daniel Dunbar4930e332009-11-17 08:07:36 +00002504 // -fblocks=0 is default.
2505 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002506 getToolChain().IsBlocksDefault()) ||
2507 (Args.hasArg(options::OPT_fgnu_runtime) &&
2508 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2509 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002510 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002511
2512 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2513 !getToolChain().hasBlocksRuntime())
2514 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002515 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002516
Douglas Gregor226173a2012-01-18 15:19:58 +00002517 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2518 // users must also pass -fcxx-modules. The latter flag will disappear once the
2519 // modules implementation is solid for C++/Objective-C++ programs as well.
2520 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2521 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2522 options::OPT_fno_cxx_modules,
2523 false);
2524 if (AllowedInCXX || !types::isCXX(InputType))
2525 CmdArgs.push_back("-fmodules");
2526 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002527
John McCalldfea9982010-04-09 19:12:06 +00002528 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002529 if (Args.hasFlag(options::OPT_fno_access_control,
2530 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002531 false))
John McCall3155f572010-04-09 19:03:51 +00002532 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002533
Anders Carlssond470fef2010-11-21 00:09:52 +00002534 // -felide-constructors is the default.
2535 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2536 options::OPT_felide_constructors,
2537 false))
2538 CmdArgs.push_back("-fno-elide-constructors");
2539
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002540 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002541 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2542 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002543 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002544
Tony Linthicum76329bf2011-12-12 21:14:55 +00002545 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002546 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002547 options::OPT_fno_short_enums,
2548 getToolChain().getTriple().getArch() ==
2549 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002550 CmdArgs.push_back("-fshort-enums");
2551
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002552 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002553 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002554 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002555 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002556
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002557 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002558 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002559 options::OPT_fno_threadsafe_statics))
2560 CmdArgs.push_back("-fno-threadsafe-statics");
2561
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002562 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002563 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2564 options::OPT_fno_use_cxa_atexit,
2565 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002566 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002567 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2568 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002569 CmdArgs.push_back("-fno-use-cxa-atexit");
2570
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002571 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002572 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002573 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2574 CmdArgs.push_back("-fms-extensions");
2575
Chad Rosiered943242012-07-20 21:20:33 +00002576 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002577 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2578 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002579
Francois Pichet1b4f1632011-09-17 04:32:15 +00002580 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002581 if (Args.hasFlag(options::OPT_fms_compatibility,
2582 options::OPT_fno_ms_compatibility,
2583 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2584 Args.hasFlag(options::OPT_fms_extensions,
2585 options::OPT_fno_ms_extensions,
2586 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002587 CmdArgs.push_back("-fms-compatibility");
2588
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002589 // -fmsc-version=1300 is default.
2590 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2591 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2592 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002593 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002594 if (msc_ver.empty())
2595 CmdArgs.push_back("-fmsc-version=1300");
2596 else
2597 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2598 }
2599
2600
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002601 // -fborland-extensions=0 is default.
2602 if (Args.hasFlag(options::OPT_fborland_extensions,
2603 options::OPT_fno_borland_extensions, false))
2604 CmdArgs.push_back("-fborland-extensions");
2605
Francois Pichet02744872011-09-01 16:38:08 +00002606 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2607 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002608 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2609 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002610 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002611 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002612
Chandler Carruthe03aa552010-04-17 20:17:31 +00002613 // -fgnu-keywords default varies depending on language; only pass if
2614 // specified.
2615 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002616 options::OPT_fno_gnu_keywords))
2617 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002618
Rafael Espindola922a6242011-06-02 17:30:53 +00002619 if (Args.hasFlag(options::OPT_fgnu89_inline,
2620 options::OPT_fno_gnu89_inline,
2621 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002622 CmdArgs.push_back("-fgnu89-inline");
2623
Chad Rosier9c76d242012-03-15 22:31:42 +00002624 if (Args.hasArg(options::OPT_fno_inline))
2625 CmdArgs.push_back("-fno-inline");
2626
Chad Rosier64d6be92012-03-06 21:17:19 +00002627 if (Args.hasArg(options::OPT_fno_inline_functions))
2628 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002629
John McCall5fb5df92012-06-20 06:18:46 +00002630 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002631
John McCall5fb5df92012-06-20 06:18:46 +00002632 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2633 // legacy is the default.
2634 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002635 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2636 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002637 objcRuntime.isLegacyDispatchDefaultForArch(
2638 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002639 if (getToolChain().UseObjCMixedDispatch())
2640 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2641 else
2642 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2643 }
2644 }
2645
Nico Weber97bd94b2012-03-09 21:19:44 +00002646 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2647 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002648 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002649 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2650 }
2651
John McCall24fc0de2011-07-06 00:26:06 +00002652 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2653 // NOTE: This logic is duplicated in ToolChains.cpp.
2654 bool ARC = isObjCAutoRefCount(Args);
2655 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002656 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002657
John McCall24fc0de2011-07-06 00:26:06 +00002658 CmdArgs.push_back("-fobjc-arc");
2659
Chandler Carruth491db322011-11-04 07:34:47 +00002660 // FIXME: It seems like this entire block, and several around it should be
2661 // wrapped in isObjC, but for now we just use it here as this is where it
2662 // was being used previously.
2663 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2664 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2665 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2666 else
2667 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2668 }
2669
John McCall24fc0de2011-07-06 00:26:06 +00002670 // Allow the user to enable full exceptions code emission.
2671 // We define off for Objective-CC, on for Objective-C++.
2672 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2673 options::OPT_fno_objc_arc_exceptions,
2674 /*default*/ types::isCXX(InputType)))
2675 CmdArgs.push_back("-fobjc-arc-exceptions");
2676 }
2677
2678 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2679 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002680 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002681 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002682
John McCall24fc0de2011-07-06 00:26:06 +00002683 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2684 // takes precedence.
2685 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2686 if (!GCArg)
2687 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2688 if (GCArg) {
2689 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002690 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002691 << GCArg->getAsString(Args);
2692 } else if (getToolChain().SupportsObjCGC()) {
2693 GCArg->render(Args, CmdArgs);
2694 } else {
2695 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002696 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002697 << GCArg->getAsString(Args);
2698 }
2699 }
2700
John McCallb5f652e2011-06-22 00:53:57 +00002701 // Add exception args.
2702 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002703 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002704
2705 if (getToolChain().UseSjLjExceptions())
2706 CmdArgs.push_back("-fsjlj-exceptions");
2707
2708 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002709 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2710 options::OPT_fno_assume_sane_operator_new))
2711 CmdArgs.push_back("-fno-assume-sane-operator-new");
2712
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002713 // -fconstant-cfstrings is default, and may be subject to argument translation
2714 // on Darwin.
2715 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2716 options::OPT_fno_constant_cfstrings) ||
2717 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2718 options::OPT_mno_constant_cfstrings))
2719 CmdArgs.push_back("-fno-constant-cfstrings");
2720
John Thompsoned4e2952009-11-05 20:14:16 +00002721 // -fshort-wchar default varies depending on platform; only
2722 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002723 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2724 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002725
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002726 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2727 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002728 //
2729 // FIXME: This is gross; that translation should be pulled from the
2730 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002731 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002732 options::OPT_fno_pascal_strings,
2733 false) ||
2734 Args.hasFlag(options::OPT_mpascal_strings,
2735 options::OPT_mno_pascal_strings,
2736 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002737 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002738
Daniel Dunbar096ed292011-10-05 21:04:55 +00002739 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2740 // -fno-pack-struct doesn't apply to -fpack-struct=.
2741 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002742 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002743 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002744 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002745 } else if (Args.hasFlag(options::OPT_fpack_struct,
2746 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002747 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002748 }
2749
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002750 if (Args.hasArg(options::OPT_mkernel) ||
2751 Args.hasArg(options::OPT_fapple_kext)) {
2752 if (!Args.hasArg(options::OPT_fcommon))
2753 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002754 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002755 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002756
Daniel Dunbard18049a2009-04-07 21:16:11 +00002757 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002758 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002759 CmdArgs.push_back("-fno-common");
2760
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002761 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002762 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002763 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002764 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002765 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002766 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2767
Daniel Dunbar6358d682010-10-15 22:30:42 +00002768 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2769 if (!Args.hasFlag(options::OPT_ffor_scope,
2770 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002771 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002772 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2773
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002774 // -fcaret-diagnostics is default.
2775 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2776 options::OPT_fno_caret_diagnostics, true))
2777 CmdArgs.push_back("-fno-caret-diagnostics");
2778
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002779 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002780 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002781 options::OPT_fno_diagnostics_fixit_info))
2782 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002783
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002784 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002785 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002786 options::OPT_fno_diagnostics_show_option))
2787 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002788
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002789 if (const Arg *A =
2790 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2791 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00002792 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002793 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002794
Douglas Gregor643c9222011-05-21 17:07:29 +00002795 if (const Arg *A =
2796 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2797 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00002798 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00002799 }
2800
Chandler Carruthb6766f02011-03-27 01:50:55 +00002801 if (Arg *A = Args.getLastArg(
2802 options::OPT_fdiagnostics_show_note_include_stack,
2803 options::OPT_fno_diagnostics_show_note_include_stack)) {
2804 if (A->getOption().matches(
2805 options::OPT_fdiagnostics_show_note_include_stack))
2806 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2807 else
2808 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2809 }
2810
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002811 // Color diagnostics are the default, unless the terminal doesn't support
2812 // them.
2813 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002814 options::OPT_fno_color_diagnostics,
2815 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002816 CmdArgs.push_back("-fcolor-diagnostics");
2817
Daniel Dunbardb097022009-06-08 21:13:54 +00002818 if (!Args.hasFlag(options::OPT_fshow_source_location,
2819 options::OPT_fno_show_source_location))
2820 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002821
Douglas Gregor643c9222011-05-21 17:07:29 +00002822 if (!Args.hasFlag(options::OPT_fshow_column,
2823 options::OPT_fno_show_column,
2824 true))
2825 CmdArgs.push_back("-fno-show-column");
2826
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002827 if (!Args.hasFlag(options::OPT_fspell_checking,
2828 options::OPT_fno_spell_checking))
2829 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002830
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002831
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002832 // Silently ignore -fasm-blocks for now.
2833 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2834 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002835
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002836 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2837 A->render(Args, CmdArgs);
2838
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002839 // -fdollars-in-identifiers default varies depending on platform and
2840 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002841 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002842 options::OPT_fno_dollars_in_identifiers)) {
2843 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002844 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002845 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002846 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002847 }
2848
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002849 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2850 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002851 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002852 options::OPT_fno_unit_at_a_time)) {
2853 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002854 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002855 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002856
Eli Friedman055c9702011-11-02 01:53:16 +00002857 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2858 options::OPT_fno_apple_pragma_pack, false))
2859 CmdArgs.push_back("-fapple-pragma-pack");
2860
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002861 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002862 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002863 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002864#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002865 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002866 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2867 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2868 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2869 CmdArgs.push_back("-fno-builtin-strcat");
2870 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2871 CmdArgs.push_back("-fno-builtin-strcpy");
2872 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002873#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002874
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002875 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002876 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002877 options::OPT_traditional_cpp)) {
2878 if (isa<PreprocessJobAction>(JA))
2879 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002880 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002881 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002882 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002883
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002884 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002885 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002886
2887 // Handle serialized diagnostics.
2888 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2889 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00002890 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002891 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002892
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002893 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2894 CmdArgs.push_back("-fretain-comments-from-system-headers");
2895
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002896 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2897 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002898 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002899 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2900 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002901 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002902
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002903 // We translate this by hand to the -cc1 argument, since nightly test uses
2904 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00002905 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002906 CmdArgs.push_back("-disable-llvm-optzns");
2907 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002908 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002909 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002910
Daniel Dunbard67a3222009-03-30 06:36:42 +00002911 if (Output.getType() == types::TY_Dependencies) {
2912 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002913 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002914 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002915 CmdArgs.push_back(Output.getFilename());
2916 } else {
2917 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002918 }
2919
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002920 for (InputInfoList::const_iterator
2921 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2922 const InputInfo &II = *it;
2923 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00002924 if (Args.hasArg(options::OPT_rewrite_objc))
2925 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2926 else
2927 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002928 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002929 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002930 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002931 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002932 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002933
Chris Lattnere9d7d782009-11-03 19:50:27 +00002934 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2935
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002936 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002937
2938 // Optionally embed the -cc1 level arguments into the debug info, for build
2939 // analysis.
2940 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002941 ArgStringList OriginalArgs;
2942 for (ArgList::const_iterator it = Args.begin(),
2943 ie = Args.end(); it != ie; ++it)
2944 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002945
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002946 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002947 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002948 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002949 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002950 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002951 }
2952 CmdArgs.push_back("-dwarf-debug-flags");
2953 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2954 }
2955
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002956 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002957
Roman Divacky178e01602011-02-10 16:52:03 +00002958 if (Arg *A = Args.getLastArg(options::OPT_pg))
2959 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002960 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002961 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002962
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002963 // Claim some arguments which clang supports automatically.
2964
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002965 // -fpch-preprocess is used with gcc to add a special marker in the output to
2966 // include the PCH file. Clang's PTH solution is completely transparent, so we
2967 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002968 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002969
Daniel Dunbar17731772009-03-23 19:03:36 +00002970 // Claim some arguments which clang doesn't support, but we don't
2971 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002972 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2973 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002974
Rafael Espindolad95a8122011-03-01 05:25:27 +00002975 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002976 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002977 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002978}
2979
Jim Grosbach576452b2012-02-10 20:37:10 +00002980void ClangAs::AddARMTargetArgs(const ArgList &Args,
2981 ArgStringList &CmdArgs) const {
2982 const Driver &D = getToolChain().getDriver();
2983 llvm::Triple Triple = getToolChain().getTriple();
2984
2985 // Set the CPU based on -march= and -mcpu=.
2986 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002987 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002988
2989 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002990 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002991 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002992
2993 // Honor -mfpmath=.
2994 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002995 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002996}
2997
John McCall5fb5df92012-06-20 06:18:46 +00002998/// Add options related to the Objective-C runtime/ABI.
2999///
3000/// Returns true if the runtime is non-fragile.
3001ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3002 ArgStringList &cmdArgs,
3003 RewriteKind rewriteKind) const {
3004 // Look for the controlling runtime option.
3005 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3006 options::OPT_fgnu_runtime,
3007 options::OPT_fobjc_runtime_EQ);
3008
3009 // Just forward -fobjc-runtime= to the frontend. This supercedes
3010 // options about fragility.
3011 if (runtimeArg &&
3012 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3013 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003014 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003015 if (runtime.tryParse(value)) {
3016 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3017 << value;
3018 }
3019
3020 runtimeArg->render(args, cmdArgs);
3021 return runtime;
3022 }
3023
3024 // Otherwise, we'll need the ABI "version". Version numbers are
3025 // slightly confusing for historical reasons:
3026 // 1 - Traditional "fragile" ABI
3027 // 2 - Non-fragile ABI, version 1
3028 // 3 - Non-fragile ABI, version 2
3029 unsigned objcABIVersion = 1;
3030 // If -fobjc-abi-version= is present, use that to set the version.
3031 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003032 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003033 if (value == "1")
3034 objcABIVersion = 1;
3035 else if (value == "2")
3036 objcABIVersion = 2;
3037 else if (value == "3")
3038 objcABIVersion = 3;
3039 else
3040 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3041 << value;
3042 } else {
3043 // Otherwise, determine if we are using the non-fragile ABI.
3044 bool nonFragileABIIsDefault =
3045 (rewriteKind == RK_NonFragile ||
3046 (rewriteKind == RK_None &&
3047 getToolChain().IsObjCNonFragileABIDefault()));
3048 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3049 options::OPT_fno_objc_nonfragile_abi,
3050 nonFragileABIIsDefault)) {
3051 // Determine the non-fragile ABI version to use.
3052#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3053 unsigned nonFragileABIVersion = 1;
3054#else
3055 unsigned nonFragileABIVersion = 2;
3056#endif
3057
3058 if (Arg *abiArg = args.getLastArg(
3059 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003060 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003061 if (value == "1")
3062 nonFragileABIVersion = 1;
3063 else if (value == "2")
3064 nonFragileABIVersion = 2;
3065 else
3066 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3067 << value;
3068 }
3069
3070 objcABIVersion = 1 + nonFragileABIVersion;
3071 } else {
3072 objcABIVersion = 1;
3073 }
3074 }
3075
3076 // We don't actually care about the ABI version other than whether
3077 // it's non-fragile.
3078 bool isNonFragile = objcABIVersion != 1;
3079
3080 // If we have no runtime argument, ask the toolchain for its default runtime.
3081 // However, the rewriter only really supports the Mac runtime, so assume that.
3082 ObjCRuntime runtime;
3083 if (!runtimeArg) {
3084 switch (rewriteKind) {
3085 case RK_None:
3086 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3087 break;
3088 case RK_Fragile:
3089 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3090 break;
3091 case RK_NonFragile:
3092 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3093 break;
3094 }
3095
3096 // -fnext-runtime
3097 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3098 // On Darwin, make this use the default behavior for the toolchain.
3099 if (getToolChain().getTriple().isOSDarwin()) {
3100 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3101
3102 // Otherwise, build for a generic macosx port.
3103 } else {
3104 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3105 }
3106
3107 // -fgnu-runtime
3108 } else {
3109 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003110 // Legacy behaviour is to target the gnustep runtime if we are i
3111 // non-fragile mode or the GCC runtime in fragile mode.
3112 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003113 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003114 else
3115 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003116 }
3117
3118 cmdArgs.push_back(args.MakeArgString(
3119 "-fobjc-runtime=" + runtime.getAsString()));
3120 return runtime;
3121}
3122
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003123void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003124 const InputInfo &Output,
3125 const InputInfoList &Inputs,
3126 const ArgList &Args,
3127 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003128 ArgStringList CmdArgs;
3129
3130 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3131 const InputInfo &Input = Inputs[0];
3132
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003133 // Don't warn about "clang -w -c foo.s"
3134 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003135 // and "clang -emit-llvm -c foo.s"
3136 Args.ClaimAllArgs(options::OPT_emit_llvm);
3137 // and "clang -use-gold-plugin -c foo.s"
3138 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003139
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003140 // Invoke ourselves in -cc1as mode.
3141 //
3142 // FIXME: Implement custom jobs for internal actions.
3143 CmdArgs.push_back("-cc1as");
3144
3145 // Add the "effective" target triple.
3146 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003147 std::string TripleStr =
3148 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003149 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3150
3151 // Set the output mode, we currently only expect to be used as a real
3152 // assembler.
3153 CmdArgs.push_back("-filetype");
3154 CmdArgs.push_back("obj");
3155
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003156 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003157 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003158
Jim Grosbach576452b2012-02-10 20:37:10 +00003159 // Add target specific cpu and features flags.
3160 switch(getToolChain().getTriple().getArch()) {
3161 default:
3162 break;
3163
3164 case llvm::Triple::arm:
3165 case llvm::Triple::thumb:
3166 AddARMTargetArgs(Args, CmdArgs);
3167 break;
3168 }
3169
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003170 // Ignore explicit -force_cpusubtype_ALL option.
3171 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003172
Eric Christopherfc3ee562012-01-10 00:38:01 +00003173 // Determine the original source input.
3174 const Action *SourceAction = &JA;
3175 while (SourceAction->getKind() != Action::InputClass) {
3176 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3177 SourceAction = SourceAction->getInputs()[0];
3178 }
3179
3180 // Forward -g, assuming we are dealing with an actual assembly file.
3181 if (SourceAction->getType() == types::TY_Asm ||
3182 SourceAction->getType() == types::TY_PP_Asm) {
3183 Args.ClaimAllArgs(options::OPT_g_Group);
3184 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3185 if (!A->getOption().matches(options::OPT_g0))
3186 CmdArgs.push_back("-g");
3187 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003188
3189 // Optionally embed the -cc1as level arguments into the debug info, for build
3190 // analysis.
3191 if (getToolChain().UseDwarfDebugFlags()) {
3192 ArgStringList OriginalArgs;
3193 for (ArgList::const_iterator it = Args.begin(),
3194 ie = Args.end(); it != ie; ++it)
3195 (*it)->render(Args, OriginalArgs);
3196
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003197 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003198 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3199 Flags += Exec;
3200 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3201 Flags += " ";
3202 Flags += OriginalArgs[i];
3203 }
3204 CmdArgs.push_back("-dwarf-debug-flags");
3205 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3206 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003207
3208 // FIXME: Add -static support, once we have it.
3209
3210 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3211 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003212 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003213
3214 assert(Output.isFilename() && "Unexpected lipo output.");
3215 CmdArgs.push_back("-o");
3216 CmdArgs.push_back(Output.getFilename());
3217
Daniel Dunbarb440f562010-08-02 02:38:21 +00003218 assert(Input.isFilename() && "Invalid input.");
3219 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003220
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003221 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003222 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003223}
3224
Daniel Dunbara3246a02009-03-18 08:07:30 +00003225void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003226 const InputInfo &Output,
3227 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003228 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003229 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003230 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003231 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003232
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003233 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003234 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003235 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003236 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003237 // Don't forward any -g arguments to assembly steps.
3238 if (isa<AssembleJobAction>(JA) &&
3239 A->getOption().matches(options::OPT_g_Group))
3240 continue;
3241
Daniel Dunbar2da02722009-03-19 07:55:12 +00003242 // It is unfortunate that we have to claim here, as this means
3243 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003244 // platforms using a generic gcc, even if we are just using gcc
3245 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003246 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003247 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003248 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003249 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003250
Daniel Dunbar4e295052010-01-25 22:35:08 +00003251 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003252
3253 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003254 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003255 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003256 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003257
3258 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003259 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003260 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003261 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003262 CmdArgs.push_back("ppc64");
3263 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003264 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003265 }
3266
Daniel Dunbar5716d872009-05-02 21:41:52 +00003267 // Try to force gcc to match the tool chain we want, if we recognize
3268 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003269 //
3270 // FIXME: The triple class should directly provide the information we want
3271 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003272 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003273 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003274 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003275 CmdArgs.push_back("-m64");
3276
Daniel Dunbarb440f562010-08-02 02:38:21 +00003277 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003278 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003279 CmdArgs.push_back(Output.getFilename());
3280 } else {
3281 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003282 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003283 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003284
Tony Linthicum76329bf2011-12-12 21:14:55 +00003285 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3286 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003287
3288 // Only pass -x if gcc will understand it; otherwise hope gcc
3289 // understands the suffix correctly. The main use case this would go
3290 // wrong in is for linker inputs if they happened to have an odd
3291 // suffix; really the only way to get this to happen is a command
3292 // like '-x foobar a.c' which will treat a.c like a linker input.
3293 //
3294 // FIXME: For the linker case specifically, can we safely convert
3295 // inputs into '-Wl,' options?
3296 for (InputInfoList::const_iterator
3297 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3298 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003299
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003300 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003301 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3302 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003303 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003304 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003305 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003306 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003307 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003308
Daniel Dunbara3246a02009-03-18 08:07:30 +00003309 if (types::canTypeBeUserSpecified(II.getType())) {
3310 CmdArgs.push_back("-x");
3311 CmdArgs.push_back(types::getTypeName(II.getType()));
3312 }
3313
Daniel Dunbarb440f562010-08-02 02:38:21 +00003314 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003315 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003316 else {
3317 const Arg &A = II.getInputArg();
3318
3319 // Reverse translate some rewritten options.
3320 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3321 CmdArgs.push_back("-lstdc++");
3322 continue;
3323 }
3324
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003325 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003326 A.render(Args, CmdArgs);
3327 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003328 }
3329
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003330 const std::string customGCCName = D.getCCCGenericGCCName();
3331 const char *GCCName;
3332 if (!customGCCName.empty())
3333 GCCName = customGCCName.c_str();
3334 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003335 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003336 } else
3337 GCCName = "gcc";
3338
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003339 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003340 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003341 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003342}
3343
Daniel Dunbar4e295052010-01-25 22:35:08 +00003344void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3345 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003346 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003347}
3348
Daniel Dunbar4e295052010-01-25 22:35:08 +00003349void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3350 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003351 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003352}
3353
Daniel Dunbar4e295052010-01-25 22:35:08 +00003354void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3355 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003356 const Driver &D = getToolChain().getDriver();
3357
Daniel Dunbar4e295052010-01-25 22:35:08 +00003358 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003359 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3360 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003361 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003362 else {
3363 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003364 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003365 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003366
Daniel Dunbar4e295052010-01-25 22:35:08 +00003367 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003368 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003369}
3370
Daniel Dunbar4e295052010-01-25 22:35:08 +00003371void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3372 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003373 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003374}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003375
Daniel Dunbar4e295052010-01-25 22:35:08 +00003376void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3377 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003378 // The types are (hopefully) good enough.
3379}
3380
Tony Linthicum76329bf2011-12-12 21:14:55 +00003381// Hexagon tools start.
3382void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3383 ArgStringList &CmdArgs) const {
3384
3385}
3386void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3387 const InputInfo &Output,
3388 const InputInfoList &Inputs,
3389 const ArgList &Args,
3390 const char *LinkingOutput) const {
3391
3392 const Driver &D = getToolChain().getDriver();
3393 ArgStringList CmdArgs;
3394
3395 std::string MarchString = "-march=";
3396 MarchString += getHexagonTargetCPU(Args);
3397 CmdArgs.push_back(Args.MakeArgString(MarchString));
3398
3399 RenderExtraToolArgs(JA, CmdArgs);
3400
3401 if (Output.isFilename()) {
3402 CmdArgs.push_back("-o");
3403 CmdArgs.push_back(Output.getFilename());
3404 } else {
3405 assert(Output.isNothing() && "Unexpected output");
3406 CmdArgs.push_back("-fsyntax-only");
3407 }
3408
3409
3410 // Only pass -x if gcc will understand it; otherwise hope gcc
3411 // understands the suffix correctly. The main use case this would go
3412 // wrong in is for linker inputs if they happened to have an odd
3413 // suffix; really the only way to get this to happen is a command
3414 // like '-x foobar a.c' which will treat a.c like a linker input.
3415 //
3416 // FIXME: For the linker case specifically, can we safely convert
3417 // inputs into '-Wl,' options?
3418 for (InputInfoList::const_iterator
3419 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3420 const InputInfo &II = *it;
3421
3422 // Don't try to pass LLVM or AST inputs to a generic gcc.
3423 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3424 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3425 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3426 << getToolChain().getTripleString();
3427 else if (II.getType() == types::TY_AST)
3428 D.Diag(clang::diag::err_drv_no_ast_support)
3429 << getToolChain().getTripleString();
3430
3431 if (II.isFilename())
3432 CmdArgs.push_back(II.getFilename());
3433 else
3434 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3435 II.getInputArg().render(Args, CmdArgs);
3436 }
3437
3438 const char *GCCName = "hexagon-as";
3439 const char *Exec =
3440 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3441 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3442
3443}
3444void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3445 ArgStringList &CmdArgs) const {
3446 // The types are (hopefully) good enough.
3447}
3448
3449void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3450 const InputInfo &Output,
3451 const InputInfoList &Inputs,
3452 const ArgList &Args,
3453 const char *LinkingOutput) const {
3454
3455 const Driver &D = getToolChain().getDriver();
3456 ArgStringList CmdArgs;
3457
3458 for (ArgList::const_iterator
3459 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3460 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003461 if (forwardToGCC(A->getOption())) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00003462 // Don't forward any -g arguments to assembly steps.
3463 if (isa<AssembleJobAction>(JA) &&
3464 A->getOption().matches(options::OPT_g_Group))
3465 continue;
3466
3467 // It is unfortunate that we have to claim here, as this means
3468 // we will basically never report anything interesting for
3469 // platforms using a generic gcc, even if we are just using gcc
3470 // to get to the assembler.
3471 A->claim();
3472 A->render(Args, CmdArgs);
3473 }
3474 }
3475
3476 RenderExtraToolArgs(JA, CmdArgs);
3477
3478 // Add Arch Information
3479 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003480 if ((A = getLastHexagonArchArg(Args))) {
3481 if (A->getOption().matches(options::OPT_m_Joined))
3482 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003483 else
Sebastian Pop86500282012-01-13 20:37:10 +00003484 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003485 }
Sebastian Pop86500282012-01-13 20:37:10 +00003486 else {
3487 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3488 }
3489
Tony Linthicum76329bf2011-12-12 21:14:55 +00003490 CmdArgs.push_back("-mqdsp6-compat");
3491
3492 const char *GCCName;
3493 if (C.getDriver().CCCIsCXX)
3494 GCCName = "hexagon-g++";
3495 else
3496 GCCName = "hexagon-gcc";
3497 const char *Exec =
3498 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3499
3500 if (Output.isFilename()) {
3501 CmdArgs.push_back("-o");
3502 CmdArgs.push_back(Output.getFilename());
3503 }
3504
3505 for (InputInfoList::const_iterator
3506 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3507 const InputInfo &II = *it;
3508
3509 // Don't try to pass LLVM or AST inputs to a generic gcc.
3510 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3511 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3512 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3513 << getToolChain().getTripleString();
3514 else if (II.getType() == types::TY_AST)
3515 D.Diag(clang::diag::err_drv_no_ast_support)
3516 << getToolChain().getTripleString();
3517
3518 if (II.isFilename())
3519 CmdArgs.push_back(II.getFilename());
3520 else
3521 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3522 II.getInputArg().render(Args, CmdArgs);
3523 }
3524 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3525
3526}
3527// Hexagon tools end.
3528
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003529llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3530 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3531 // archs which Darwin doesn't use.
3532
3533 // The matching this routine does is fairly pointless, since it is neither the
3534 // complete architecture list, nor a reasonable subset. The problem is that
3535 // historically the driver driver accepts this and also ties its -march=
3536 // handling to the architecture name, so we need to be careful before removing
3537 // support for it.
3538
3539 // This code must be kept in sync with Clang's Darwin specific argument
3540 // translation.
3541
3542 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3543 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3544 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3545 .Case("ppc64", llvm::Triple::ppc64)
3546 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3547 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3548 llvm::Triple::x86)
3549 .Case("x86_64", llvm::Triple::x86_64)
3550 // This is derived from the driver driver.
3551 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3552 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3553 .Case("r600", llvm::Triple::r600)
3554 .Case("nvptx", llvm::Triple::nvptx)
3555 .Case("nvptx64", llvm::Triple::nvptx64)
3556 .Case("amdil", llvm::Triple::amdil)
3557 .Case("spir", llvm::Triple::spir)
3558 .Default(llvm::Triple::UnknownArch);
3559}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003560
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003561const char *darwin::CC1::getCC1Name(types::ID Type) const {
3562 switch (Type) {
3563 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003564 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003565 case types::TY_Asm:
3566 case types::TY_C: case types::TY_CHeader:
3567 case types::TY_PP_C: case types::TY_PP_CHeader:
3568 return "cc1";
3569 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003570 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3571 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003572 return "cc1obj";
3573 case types::TY_CXX: case types::TY_CXXHeader:
3574 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3575 return "cc1plus";
3576 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003577 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3578 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003579 return "cc1objplus";
3580 }
3581}
3582
David Blaikie68e081d2011-12-20 02:48:34 +00003583void darwin::CC1::anchor() {}
3584
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003585const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003586 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003587 return Args.MakeArgString(
3588 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003589}
3590
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003591const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003592 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003593 const char *Str = getBaseInputName(Args, Inputs);
3594
Chris Lattner906bb902011-01-16 08:14:11 +00003595 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003596 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003597
3598 return Str;
3599}
3600
3601const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003602darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003603 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003604 // FIXME: Think about this more.
3605 std::string Res;
3606
3607 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003608 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003609 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003610 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003611 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003612 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003613 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003614}
3615
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003616void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003617 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003618 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003619
3620 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003621 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003622
Bob Wilson7ecbd322012-02-07 01:17:55 +00003623 // Erase both -fmodule-cache-path and its argument.
3624 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3625 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003626 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003627 continue;
3628 }
3629
Bob Wilson7ecbd322012-02-07 01:17:55 +00003630 // Remove unsupported -f options.
3631 if (Option.startswith("-f")) {
3632 // Remove -f/-fno- to reduce the number of cases.
3633 if (Option.startswith("-fno-"))
3634 Option = Option.substr(5);
3635 else
3636 Option = Option.substr(2);
3637 RemoveOption = llvm::StringSwitch<bool>(Option)
3638 .Case("altivec", true)
3639 .Case("modules", true)
3640 .Case("diagnostics-show-note-include-stack", true)
3641 .Default(false);
3642 }
3643
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003644 // Handle machine specific options.
3645 if (Option.startswith("-m")) {
3646 RemoveOption = llvm::StringSwitch<bool>(Option)
3647 .Case("-mthumb", true)
3648 .Case("-mno-thumb", true)
3649 .Case("-mno-fused-madd", true)
3650 .Case("-mlong-branch", true)
3651 .Case("-mlongcall", true)
3652 .Case("-mcpu=G4", true)
3653 .Case("-mcpu=G5", true)
3654 .Default(false);
3655 }
3656
3657 // Handle warning options.
3658 if (Option.startswith("-W")) {
3659 // Remove -W/-Wno- to reduce the number of cases.
3660 if (Option.startswith("-Wno-"))
3661 Option = Option.substr(5);
3662 else
3663 Option = Option.substr(2);
3664
3665 RemoveOption = llvm::StringSwitch<bool>(Option)
3666 .Case("address-of-temporary", true)
3667 .Case("ambiguous-member-template", true)
3668 .Case("analyzer-incompatible-plugin", true)
3669 .Case("array-bounds", true)
3670 .Case("array-bounds-pointer-arithmetic", true)
3671 .Case("bind-to-temporary-copy", true)
3672 .Case("bitwise-op-parentheses", true)
3673 .Case("bool-conversions", true)
3674 .Case("builtin-macro-redefined", true)
3675 .Case("c++-hex-floats", true)
3676 .Case("c++0x-compat", true)
3677 .Case("c++0x-extensions", true)
3678 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003679 .Case("c++11-compat", true)
3680 .Case("c++11-extensions", true)
3681 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003682 .Case("conditional-uninitialized", true)
3683 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003684 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003685 .Case("CFString-literal", true)
3686 .Case("constant-logical-operand", true)
3687 .Case("custom-atomic-properties", true)
3688 .Case("default-arg-special-member", true)
3689 .Case("delegating-ctor-cycles", true)
3690 .Case("delete-non-virtual-dtor", true)
3691 .Case("deprecated-implementations", true)
3692 .Case("deprecated-writable-strings", true)
3693 .Case("distributed-object-modifiers", true)
3694 .Case("duplicate-method-arg", true)
3695 .Case("dynamic-class-memaccess", true)
3696 .Case("enum-compare", true)
Ted Kremeneka88397d2012-10-09 19:29:48 +00003697 .Case("enum-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003698 .Case("exit-time-destructors", true)
3699 .Case("gnu", true)
3700 .Case("gnu-designator", true)
3701 .Case("header-hygiene", true)
3702 .Case("idiomatic-parentheses", true)
3703 .Case("ignored-qualifiers", true)
3704 .Case("implicit-atomic-properties", true)
3705 .Case("incompatible-pointer-types", true)
3706 .Case("incomplete-implementation", true)
Ted Kremenekb4762412012-10-09 19:29:46 +00003707 .Case("int-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003708 .Case("initializer-overrides", true)
3709 .Case("invalid-noreturn", true)
3710 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003711 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003712 .Case("literal-conversion", true)
3713 .Case("literal-range", true)
3714 .Case("local-type-template-args", true)
3715 .Case("logical-op-parentheses", true)
3716 .Case("method-signatures", true)
3717 .Case("microsoft", true)
3718 .Case("mismatched-tags", true)
3719 .Case("missing-method-return-type", true)
3720 .Case("non-pod-varargs", true)
3721 .Case("nonfragile-abi2", true)
3722 .Case("null-arithmetic", true)
3723 .Case("null-dereference", true)
3724 .Case("out-of-line-declaration", true)
3725 .Case("overriding-method-mismatch", true)
3726 .Case("readonly-setter-attrs", true)
3727 .Case("return-stack-address", true)
3728 .Case("self-assign", true)
3729 .Case("semicolon-before-method-body", true)
3730 .Case("sentinel", true)
3731 .Case("shift-overflow", true)
3732 .Case("shift-sign-overflow", true)
3733 .Case("sign-conversion", true)
3734 .Case("sizeof-array-argument", true)
3735 .Case("sizeof-pointer-memaccess", true)
3736 .Case("string-compare", true)
3737 .Case("super-class-method-mismatch", true)
3738 .Case("tautological-compare", true)
3739 .Case("typedef-redefinition", true)
3740 .Case("typename-missing", true)
3741 .Case("undefined-reinterpret-cast", true)
3742 .Case("unknown-warning-option", true)
3743 .Case("unnamed-type-template-args", true)
3744 .Case("unneeded-internal-declaration", true)
3745 .Case("unneeded-member-function", true)
3746 .Case("unused-comparison", true)
3747 .Case("unused-exception-parameter", true)
3748 .Case("unused-member-function", true)
3749 .Case("unused-result", true)
3750 .Case("vector-conversions", true)
3751 .Case("vla", true)
3752 .Case("used-but-marked-unused", true)
3753 .Case("weak-vtables", true)
3754 .Default(false);
3755 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003756 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003757 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003758 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003759 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003760 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003761 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003762 }
3763}
3764
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003765void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003766 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003767 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003768
3769 CheckCodeGenerationOptions(D, Args);
3770
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003771 // Derived from cc1 spec.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003772 if ((!Args.hasArg(options::OPT_mkernel) ||
3773 (getDarwinToolChain().isTargetIPhoneOS() &&
3774 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3775 !Args.hasArg(options::OPT_static) &&
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003776 !Args.hasArg(options::OPT_mdynamic_no_pic))
3777 CmdArgs.push_back("-fPIC");
3778
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003779 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3780 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3781 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3782 CmdArgs.push_back("-fno-builtin-strcat");
3783 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3784 CmdArgs.push_back("-fno-builtin-strcpy");
3785 }
3786
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003787 if (Args.hasArg(options::OPT_g_Flag) &&
3788 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3789 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3790}
3791
3792void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3793 const InputInfoList &Inputs,
3794 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003795 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003796
3797 // Derived from cc1_options spec.
3798 if (Args.hasArg(options::OPT_fast) ||
3799 Args.hasArg(options::OPT_fastf) ||
3800 Args.hasArg(options::OPT_fastcp))
3801 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003802
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003803 if (Arg *A = Args.getLastArg(options::OPT_pg))
3804 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003805 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003806 << A->getAsString(Args) << "-fomit-frame-pointer";
3807
3808 AddCC1Args(Args, CmdArgs);
3809
3810 if (!Args.hasArg(options::OPT_Q))
3811 CmdArgs.push_back("-quiet");
3812
3813 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003814 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003815
3816 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3817
3818 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3819 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3820
3821 // FIXME: The goal is to use the user provided -o if that is our
3822 // final output, otherwise to drive from the original input
3823 // name. Find a clean way to go about this.
3824 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3825 Args.hasArg(options::OPT_o)) {
3826 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3827 CmdArgs.push_back("-auxbase-strip");
Richard Smithbd55daf2012-11-01 04:30:05 +00003828 CmdArgs.push_back(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003829 } else {
3830 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003831 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003832 }
3833
3834 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3835
3836 Args.AddAllArgs(CmdArgs, options::OPT_O);
3837 // FIXME: -Wall is getting some special treatment. Investigate.
3838 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3839 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003840 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003841 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003842 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3843 // Honor -std-default.
3844 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3845 "-std=", /*Joined=*/true);
3846 }
3847
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003848 if (Args.hasArg(options::OPT_v))
3849 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003850 if (Args.hasArg(options::OPT_pg) &&
3851 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003852 CmdArgs.push_back("-p");
3853 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003854
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003855 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003856 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3857 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3858 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3859 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3860 //
3861 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003862 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3863 options::OPT_fsyntax_only),
3864 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003865 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3866 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3867 (*it)->claim();
3868 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003869 }
3870 }
3871 } else
3872 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003873
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003874 // Claim Clang only -f options, they aren't worth warning about.
3875 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3876
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003877 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3878 if (Args.hasArg(options::OPT_Qn))
3879 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003880
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003881 // FIXME: This isn't correct.
3882 //Args.AddLastArg(CmdArgs, options::OPT__help)
3883 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3884
3885 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3886
3887 // FIXME: Still don't get what is happening here. Investigate.
3888 Args.AddAllArgs(CmdArgs, options::OPT__param);
3889
3890 if (Args.hasArg(options::OPT_fmudflap) ||
3891 Args.hasArg(options::OPT_fmudflapth)) {
3892 CmdArgs.push_back("-fno-builtin");
3893 CmdArgs.push_back("-fno-merge-constants");
3894 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003895
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003896 if (Args.hasArg(options::OPT_coverage)) {
3897 CmdArgs.push_back("-fprofile-arcs");
3898 CmdArgs.push_back("-ftest-coverage");
3899 }
3900
3901 if (types::isCXX(Inputs[0].getType()))
3902 CmdArgs.push_back("-D__private_extern__=extern");
3903}
3904
3905void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3906 const InputInfoList &Inputs,
3907 const ArgStringList &OutputArgs) const {
3908 // Derived from cpp_options
3909 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003910
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003911 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3912
3913 AddCC1Args(Args, CmdArgs);
3914
3915 // NOTE: The code below has some commonality with cpp_options, but
3916 // in classic gcc style ends up sending things in different
3917 // orders. This may be a good merge candidate once we drop pedantic
3918 // compatibility.
3919
3920 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003921 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003922 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003923 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3924 // Honor -std-default.
3925 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3926 "-std=", /*Joined=*/true);
3927 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003928 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3929 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003930
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003931 // The driver treats -fsyntax-only specially.
3932 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3933
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003934 // Claim Clang only -f options, they aren't worth warning about.
3935 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3936
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003937 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3938 !Args.hasArg(options::OPT_fno_working_directory))
3939 CmdArgs.push_back("-fworking-directory");
3940
3941 Args.AddAllArgs(CmdArgs, options::OPT_O);
3942 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3943 if (Args.hasArg(options::OPT_save_temps))
3944 CmdArgs.push_back("-fpch-preprocess");
3945}
3946
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003947void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003948 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003949 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003950 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003951
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003952 CheckPreprocessingOptions(D, Args);
3953
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003954 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003955 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3956 Args.AddLastArg(CmdArgs, options::OPT_C);
3957 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003958 if (!Args.hasArg(options::OPT_Q))
3959 CmdArgs.push_back("-quiet");
3960 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003961 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003962 Args.AddLastArg(CmdArgs, options::OPT_v);
3963 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3964 Args.AddLastArg(CmdArgs, options::OPT_P);
3965
3966 // FIXME: Handle %I properly.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003967 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003968 CmdArgs.push_back("-imultilib");
3969 CmdArgs.push_back("x86_64");
3970 }
3971
3972 if (Args.hasArg(options::OPT_MD)) {
3973 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003974 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003975 }
3976
3977 if (Args.hasArg(options::OPT_MMD)) {
3978 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003979 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003980 }
3981
3982 Args.AddLastArg(CmdArgs, options::OPT_M);
3983 Args.AddLastArg(CmdArgs, options::OPT_MM);
3984 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3985 Args.AddLastArg(CmdArgs, options::OPT_MG);
3986 Args.AddLastArg(CmdArgs, options::OPT_MP);
3987 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3988 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3989 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3990 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3991 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3992 CmdArgs.push_back("-MQ");
Richard Smithbd55daf2012-11-01 04:30:05 +00003993 CmdArgs.push_back(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003994 }
3995 }
3996
3997 Args.AddLastArg(CmdArgs, options::OPT_remap);
3998 if (Args.hasArg(options::OPT_g3))
3999 CmdArgs.push_back("-dD");
4000 Args.AddLastArg(CmdArgs, options::OPT_H);
4001
4002 AddCPPArgs(Args, CmdArgs);
4003
4004 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
4005 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
4006
4007 for (InputInfoList::const_iterator
4008 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4009 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004010
Daniel Dunbarb440f562010-08-02 02:38:21 +00004011 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004012 }
4013
4014 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
4015 options::OPT_Xpreprocessor);
4016
4017 if (Args.hasArg(options::OPT_fmudflap)) {
4018 CmdArgs.push_back("-D_MUDFLAP");
4019 CmdArgs.push_back("-include");
4020 CmdArgs.push_back("mf-runtime.h");
4021 }
4022
4023 if (Args.hasArg(options::OPT_fmudflapth)) {
4024 CmdArgs.push_back("-D_MUDFLAP");
4025 CmdArgs.push_back("-D_MUDFLAPTH");
4026 CmdArgs.push_back("-include");
4027 CmdArgs.push_back("mf-runtime.h");
4028 }
4029}
4030
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004031void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004032 ArgStringList &CmdArgs) const {
4033 // Derived from cpp spec.
4034
4035 if (Args.hasArg(options::OPT_static)) {
4036 // The gcc spec is broken here, it refers to dynamic but
4037 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004038
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004039 // if (!Args.hasArg(arglist.parser.dynamicOption))
4040 CmdArgs.push_back("-D__STATIC__");
4041 } else
4042 CmdArgs.push_back("-D__DYNAMIC__");
4043
4044 if (Args.hasArg(options::OPT_pthread))
4045 CmdArgs.push_back("-D_REENTRANT");
4046}
4047
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004048void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004049 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004050 const InputInfoList &Inputs,
4051 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004052 const char *LinkingOutput) const {
4053 ArgStringList CmdArgs;
4054
4055 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4056
4057 CmdArgs.push_back("-E");
4058
4059 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004060 Args.hasArg(options::OPT_traditional_cpp))
4061 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004062
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004063 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004064 assert(Output.isFilename() && "Unexpected CC1 output.");
4065 OutputArgs.push_back("-o");
4066 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004067
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00004068 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00004069 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4070 } else {
4071 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4072 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4073 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004074
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00004075 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
4076
Chad Rosierc31e48d2011-09-08 00:38:00 +00004077 RemoveCC1UnsupportedArgs(CmdArgs);
4078
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004079 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004080 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004081 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004082 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004083}
4084
4085void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004086 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004087 const InputInfoList &Inputs,
4088 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004089 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004090 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004091 ArgStringList CmdArgs;
4092
4093 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4094
Bob Wilson0090df22012-04-01 23:03:29 +00004095 // Silence warning about unused --serialize-diagnostics
4096 Args.ClaimAllArgs(options::OPT__serialize_diags);
4097
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004098 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00004099 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004100 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004101 << A->getAsString(Args) << "-E";
4102
Daniel Dunbar24e52992010-06-07 23:28:45 +00004103 if (JA.getType() == types::TY_LLVM_IR ||
4104 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004105 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00004106 else if (JA.getType() == types::TY_LLVM_BC ||
4107 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004108 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004109 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004110 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004111 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004112 else if (JA.getType() != types::TY_PP_Asm &&
4113 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004114 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004115 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004116
4117 ArgStringList OutputArgs;
4118 if (Output.getType() != types::TY_PCH) {
4119 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004120 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004121 OutputArgs.push_back("/dev/null");
4122 else
4123 OutputArgs.push_back(Output.getFilename());
4124 }
4125
4126 // There is no need for this level of compatibility, but it makes
4127 // diffing easier.
4128 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4129 Args.hasArg(options::OPT_S));
4130
4131 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004132 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004133 if (OutputArgsEarly) {
4134 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4135 } else {
4136 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4137 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4138 }
4139 } else {
4140 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004141
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004142 for (InputInfoList::const_iterator
4143 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4144 const InputInfo &II = *it;
4145
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004146 // Reject AST inputs.
4147 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004148 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004149 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004150 return;
4151 }
4152
Daniel Dunbarb440f562010-08-02 02:38:21 +00004153 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004154 }
4155
4156 if (OutputArgsEarly) {
4157 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4158 } else {
4159 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4160 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4161 }
4162 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004163
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004164 if (Output.getType() == types::TY_PCH) {
4165 assert(Output.isFilename() && "Invalid PCH output.");
4166
4167 CmdArgs.push_back("-o");
4168 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4169 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004170 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004171 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004172 C.addTempFile(TmpPath);
4173 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004174
Eric Christopher84fbdb42011-08-19 00:30:14 +00004175 // If we're emitting a pch file with the last 4 characters of ".pth"
4176 // and falling back to llvm-gcc we want to use ".gch" instead.
4177 std::string OutputFile(Output.getFilename());
4178 size_t loc = OutputFile.rfind(".pth");
4179 if (loc != std::string::npos)
4180 OutputFile.replace(loc, 4, ".gch");
4181 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4182 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004183 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004184
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004185 RemoveCC1UnsupportedArgs(CmdArgs);
4186
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004187 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004188 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004189 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004190 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004191}
4192
Daniel Dunbarbe220842009-03-20 16:06:39 +00004193void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004194 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004195 const InputInfoList &Inputs,
4196 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004197 const char *LinkingOutput) const {
4198 ArgStringList CmdArgs;
4199
4200 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4201 const InputInfo &Input = Inputs[0];
4202
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004203 // Determine the original source input.
4204 const Action *SourceAction = &JA;
4205 while (SourceAction->getKind() != Action::InputClass) {
4206 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4207 SourceAction = SourceAction->getInputs()[0];
4208 }
4209
4210 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004211 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004212 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004213 if (Args.hasArg(options::OPT_gstabs))
4214 CmdArgs.push_back("--gstabs");
4215 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004216 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004217 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004218
Daniel Dunbarbe220842009-03-20 16:06:39 +00004219 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004220 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004221
Daniel Dunbar6d484762010-07-22 01:47:22 +00004222 // Use -force_cpusubtype_ALL on x86 by default.
4223 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4224 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004225 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4226 CmdArgs.push_back("-force_cpusubtype_ALL");
4227
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004228 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004229 (((Args.hasArg(options::OPT_mkernel) ||
4230 Args.hasArg(options::OPT_fapple_kext)) &&
4231 (!getDarwinToolChain().isTargetIPhoneOS() ||
4232 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4233 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004234 CmdArgs.push_back("-static");
4235
Daniel Dunbarbe220842009-03-20 16:06:39 +00004236 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4237 options::OPT_Xassembler);
4238
4239 assert(Output.isFilename() && "Unexpected lipo output.");
4240 CmdArgs.push_back("-o");
4241 CmdArgs.push_back(Output.getFilename());
4242
Daniel Dunbarb440f562010-08-02 02:38:21 +00004243 assert(Input.isFilename() && "Invalid input.");
4244 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004245
4246 // asm_final spec is empty.
4247
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004248 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004249 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004250 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004251}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004252
David Blaikie68e081d2011-12-20 02:48:34 +00004253void darwin::DarwinTool::anchor() {}
4254
Daniel Dunbare9ded432009-09-09 18:36:20 +00004255void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4256 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004257 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004258
Daniel Dunbarc1964212009-03-26 16:23:12 +00004259 // Derived from darwin_arch spec.
4260 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004261 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004262
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004263 // FIXME: Is this needed anymore?
4264 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004265 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004266}
4267
Bill Wendling3b2000f2012-10-02 18:02:50 +00004268bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4269 // We only need to generate a temp path for LTO if we aren't compiling object
4270 // files. When compiling source files, we run 'dsymutil' after linking. We
4271 // don't run 'dsymutil' when compiling object files.
4272 for (InputInfoList::const_iterator
4273 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4274 if (it->getType() != types::TY_Object)
4275 return true;
4276
4277 return false;
4278}
4279
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004280void darwin::Link::AddLinkArgs(Compilation &C,
4281 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004282 ArgStringList &CmdArgs,
4283 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004284 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004285 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004286
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004287 unsigned Version[3] = { 0, 0, 0 };
4288 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4289 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004290 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004291 Version[1], Version[2], HadExtra) ||
4292 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004293 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004294 << A->getAsString(Args);
4295 }
4296
4297 // Newer linkers support -demangle, pass it if supported and not disabled by
4298 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004299 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004300 // Don't pass -demangle to ld_classic.
4301 //
4302 // FIXME: This is a temporary workaround, ld should be handling this.
4303 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4304 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004305 if (getToolChain().getArch() == llvm::Triple::x86) {
4306 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4307 options::OPT_Wl_COMMA),
4308 ie = Args.filtered_end(); it != ie; ++it) {
4309 const Arg *A = *it;
4310 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004311 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004312 UsesLdClassic = true;
4313 }
4314 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004315 if (!UsesLdClassic)
4316 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004317 }
4318
Daniel Dunbaref889c72011-06-21 20:55:11 +00004319 // If we are using LTO, then automatically create a temporary file path for
4320 // the linker to use, so that it's lifetime will extend past a possible
4321 // dsymutil step.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004322 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004323 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004324 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004325 C.addTempFile(TmpPath);
4326 CmdArgs.push_back("-object_path_lto");
4327 CmdArgs.push_back(TmpPath);
4328 }
4329
Daniel Dunbarc1964212009-03-26 16:23:12 +00004330 // Derived from the "link" spec.
4331 Args.AddAllArgs(CmdArgs, options::OPT_static);
4332 if (!Args.hasArg(options::OPT_static))
4333 CmdArgs.push_back("-dynamic");
4334 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4335 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4336 // here. How do we wish to handle such things?
4337 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004338
Daniel Dunbarc1964212009-03-26 16:23:12 +00004339 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004340 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004341 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004342 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004343
4344 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4345 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4346 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4347
4348 Arg *A;
4349 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4350 (A = Args.getLastArg(options::OPT_current__version)) ||
4351 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004352 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004353 << A->getAsString(Args) << "-dynamiclib";
4354
4355 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4356 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4357 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4358 } else {
4359 CmdArgs.push_back("-dylib");
4360
4361 Arg *A;
4362 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4363 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4364 (A = Args.getLastArg(options::OPT_client__name)) ||
4365 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4366 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4367 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004368 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004369 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004370
Daniel Dunbarc1964212009-03-26 16:23:12 +00004371 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4372 "-dylib_compatibility_version");
4373 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4374 "-dylib_current_version");
4375
Daniel Dunbara48823f2010-01-22 02:04:52 +00004376 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004377
4378 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4379 "-dylib_install_name");
4380 }
4381
4382 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4383 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4384 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004385 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004386 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004387 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4388 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4389 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4390 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4391 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4392 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004393 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004394 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4395 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4396 Args.AddAllArgs(CmdArgs, options::OPT_init);
4397
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004398 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004399 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004400
4401 // If we had an explicit -mios-simulator-version-min argument, honor that,
4402 // otherwise use the traditional deployment targets. We can't just check the
4403 // is-sim attribute because existing code follows this path, and the linker
4404 // may not handle the argument.
4405 //
4406 // FIXME: We may be able to remove this, once we can verify no one depends on
4407 // it.
4408 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4409 CmdArgs.push_back("-ios_simulator_version_min");
4410 else if (DarwinTC.isTargetIPhoneOS())
4411 CmdArgs.push_back("-iphoneos_version_min");
4412 else
4413 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004414 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004415
Daniel Dunbarc1964212009-03-26 16:23:12 +00004416 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4417 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4418 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4419 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4420 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004421
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004422 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4423 options::OPT_fno_pie,
4424 options::OPT_fno_PIE)) {
4425 if (A->getOption().matches(options::OPT_fpie) ||
4426 A->getOption().matches(options::OPT_fPIE))
4427 CmdArgs.push_back("-pie");
4428 else
4429 CmdArgs.push_back("-no_pie");
4430 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004431
4432 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4433 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4434 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4435 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4436 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4437 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4438 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4439 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4440 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4441 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4442 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4443 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4444 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4445 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4446 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4447 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004448
Daniel Dunbar84384642011-05-02 21:03:47 +00004449 // Give --sysroot= preference, over the Apple specific behavior to also use
4450 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004451 StringRef sysroot = C.getSysRoot();
4452 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004453 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004454 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004455 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4456 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004457 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004458 }
4459
Daniel Dunbarc1964212009-03-26 16:23:12 +00004460 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4461 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4462 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4463 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4464 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004465 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004466 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4467 Args.AddAllArgs(CmdArgs, options::OPT_y);
4468 Args.AddLastArg(CmdArgs, options::OPT_w);
4469 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4470 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4471 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4472 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4473 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4474 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4475 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4476 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4477 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4478 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4479 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4480 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4481}
4482
4483void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004484 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004485 const InputInfoList &Inputs,
4486 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004487 const char *LinkingOutput) const {
4488 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004489
Daniel Dunbarc1964212009-03-26 16:23:12 +00004490 // The logic here is derived from gcc's behavior; most of which
4491 // comes from specs (starting with link_command). Consult gcc for
4492 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004493 ArgStringList CmdArgs;
4494
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004495 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4496 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4497 options::OPT_ccc_arcmt_migrate)) {
4498 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4499 (*I)->claim();
4500 const char *Exec =
4501 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4502 CmdArgs.push_back(Output.getFilename());
4503 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4504 return;
4505 }
4506
Daniel Dunbarc1964212009-03-26 16:23:12 +00004507 // I'm not sure why this particular decomposition exists in gcc, but
4508 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004509 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004510
Daniel Dunbarc1964212009-03-26 16:23:12 +00004511 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4512 Args.AddAllArgs(CmdArgs, options::OPT_s);
4513 Args.AddAllArgs(CmdArgs, options::OPT_t);
4514 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4515 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004516 Args.AddLastArg(CmdArgs, options::OPT_e);
4517 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4518 Args.AddAllArgs(CmdArgs, options::OPT_r);
4519
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004520 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4521 // members of static archive libraries which implement Objective-C classes or
4522 // categories.
4523 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4524 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004525
Daniel Dunbarc1964212009-03-26 16:23:12 +00004526 CmdArgs.push_back("-o");
4527 CmdArgs.push_back(Output.getFilename());
4528
Chad Rosier06fd3c62012-05-16 23:45:12 +00004529 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004530 !Args.hasArg(options::OPT_nostartfiles)) {
4531 // Derived from startfile spec.
4532 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004533 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004534 if (getDarwinToolChain().isTargetIOSSimulator()) {
4535 // The simulator doesn't have a versioned crt1 file.
4536 CmdArgs.push_back("-ldylib1.o");
4537 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004538 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4539 CmdArgs.push_back("-ldylib1.o");
4540 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004541 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004542 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004543 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004544 CmdArgs.push_back("-ldylib1.10.5.o");
4545 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004546 } else {
4547 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004548 if (!Args.hasArg(options::OPT_static)) {
4549 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004550 if (getDarwinToolChain().isTargetIOSSimulator()) {
4551 // The simulator doesn't have a versioned crt1 file.
4552 CmdArgs.push_back("-lbundle1.o");
4553 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004554 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4555 CmdArgs.push_back("-lbundle1.o");
4556 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004557 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004558 CmdArgs.push_back("-lbundle1.o");
4559 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004560 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004561 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004562 if (Args.hasArg(options::OPT_pg) &&
4563 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004564 if (Args.hasArg(options::OPT_static) ||
4565 Args.hasArg(options::OPT_object) ||
4566 Args.hasArg(options::OPT_preload)) {
4567 CmdArgs.push_back("-lgcrt0.o");
4568 } else {
4569 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004570
Daniel Dunbarc1964212009-03-26 16:23:12 +00004571 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004572 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004573 // By default on OS X 10.8 and later, we don't link with a crt1.o
4574 // file and the linker knows to use _main as the entry point. But,
4575 // when compiling with -pg, we need to link with the gcrt1.o file,
4576 // so pass the -no_new_main option to tell the linker to use the
4577 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004578 if (getDarwinToolChain().isTargetMacOS() &&
4579 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4580 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004581 } else {
4582 if (Args.hasArg(options::OPT_static) ||
4583 Args.hasArg(options::OPT_object) ||
4584 Args.hasArg(options::OPT_preload)) {
4585 CmdArgs.push_back("-lcrt0.o");
4586 } else {
4587 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004588 if (getDarwinToolChain().isTargetIOSSimulator()) {
4589 // The simulator doesn't have a versioned crt1 file.
4590 CmdArgs.push_back("-lcrt1.o");
4591 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004592 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4593 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004594 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004595 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004596 } else {
4597 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4598 CmdArgs.push_back("-lcrt1.o");
4599 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4600 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004601 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004602 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004603
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004604 // darwin_crt2 spec is empty.
4605 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004606 }
4607 }
4608 }
4609 }
4610
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004611 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4612 Args.hasArg(options::OPT_shared_libgcc) &&
4613 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004614 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004615 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004616 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004617 }
4618 }
4619
4620 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004621
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004622 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4623 // symbols may appear. Mark all of them as dynamic_lookup.
4624 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4625 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4626 options::OPT_fno_address_sanitizer, false)) {
4627 if (Args.hasArg(options::OPT_dynamiclib) ||
4628 Args.hasArg(options::OPT_bundle)) {
4629 CmdArgs.push_back("-undefined");
4630 CmdArgs.push_back("dynamic_lookup");
4631 }
4632 }
4633
Daniel Dunbarc1964212009-03-26 16:23:12 +00004634 if (Args.hasArg(options::OPT_fopenmp))
4635 // This is more complicated in gcc...
4636 CmdArgs.push_back("-lgomp");
4637
Douglas Gregor9295df02012-05-15 21:00:27 +00004638 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4639
Bob Wilson16d93952012-05-15 18:57:39 +00004640 if (isObjCRuntimeLinked(Args) &&
4641 !Args.hasArg(options::OPT_nostdlib) &&
4642 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004643 // Avoid linking compatibility stubs on i386 mac.
4644 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004645 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004646 // If we don't have ARC or subscripting runtime support, link in the
4647 // runtime stubs. We have to do this *before* adding any of the normal
4648 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004649 ObjCRuntime runtime =
4650 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004651 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004652 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004653 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004654 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004655 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004656 CmdArgs.push_back("-framework");
4657 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004658 // Link libobj.
4659 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004660 }
John McCall31168b02011-06-15 23:02:42 +00004661
Daniel Dunbarc1964212009-03-26 16:23:12 +00004662 if (LinkingOutput) {
4663 CmdArgs.push_back("-arch_multiple");
4664 CmdArgs.push_back("-final_output");
4665 CmdArgs.push_back(LinkingOutput);
4666 }
4667
Daniel Dunbarc1964212009-03-26 16:23:12 +00004668 if (Args.hasArg(options::OPT_fnested_functions))
4669 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004670
Daniel Dunbarc1964212009-03-26 16:23:12 +00004671 if (!Args.hasArg(options::OPT_nostdlib) &&
4672 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004673 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004674 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004675
Daniel Dunbarc1964212009-03-26 16:23:12 +00004676 // link_ssp spec is empty.
4677
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004678 // Let the tool chain choose which runtime library to link.
4679 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004680 }
4681
Chad Rosier06fd3c62012-05-16 23:45:12 +00004682 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004683 !Args.hasArg(options::OPT_nostartfiles)) {
4684 // endfile_spec is empty.
4685 }
4686
4687 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4688 Args.AddAllArgs(CmdArgs, options::OPT_F);
4689
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004690 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004691 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004692 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004693}
4694
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004695void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004696 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004697 const InputInfoList &Inputs,
4698 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004699 const char *LinkingOutput) const {
4700 ArgStringList CmdArgs;
4701
4702 CmdArgs.push_back("-create");
4703 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004704
4705 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004706 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004707
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004708 for (InputInfoList::const_iterator
4709 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4710 const InputInfo &II = *it;
4711 assert(II.isFilename() && "Unexpected lipo input.");
4712 CmdArgs.push_back(II.getFilename());
4713 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004714 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004715 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004716 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004717}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004718
Daniel Dunbar88299622010-06-04 18:28:36 +00004719void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004720 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004721 const InputInfoList &Inputs,
4722 const ArgList &Args,
4723 const char *LinkingOutput) const {
4724 ArgStringList CmdArgs;
4725
Daniel Dunbareb86b042011-05-09 17:23:16 +00004726 CmdArgs.push_back("-o");
4727 CmdArgs.push_back(Output.getFilename());
4728
Daniel Dunbar88299622010-06-04 18:28:36 +00004729 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4730 const InputInfo &Input = Inputs[0];
4731 assert(Input.isFilename() && "Unexpected dsymutil input.");
4732 CmdArgs.push_back(Input.getFilename());
4733
Daniel Dunbar88299622010-06-04 18:28:36 +00004734 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004735 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004736 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004737}
4738
Eric Christopher551ef452011-08-23 17:56:55 +00004739void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4740 const InputInfo &Output,
4741 const InputInfoList &Inputs,
4742 const ArgList &Args,
4743 const char *LinkingOutput) const {
4744 ArgStringList CmdArgs;
4745 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004746 CmdArgs.push_back("--debug-info");
4747 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004748 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004749
4750 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4751 const InputInfo &Input = Inputs[0];
4752 assert(Input.isFilename() && "Unexpected verify input");
4753
4754 // Grabbing the output of the earlier dsymutil run.
4755 CmdArgs.push_back(Input.getFilename());
4756
4757 const char *Exec =
4758 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4759 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4760}
4761
David Chisnallf571cde2012-02-15 13:39:01 +00004762void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4763 const InputInfo &Output,
4764 const InputInfoList &Inputs,
4765 const ArgList &Args,
4766 const char *LinkingOutput) const {
4767 ArgStringList CmdArgs;
4768
4769 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4770 options::OPT_Xassembler);
4771
4772 CmdArgs.push_back("-o");
4773 CmdArgs.push_back(Output.getFilename());
4774
4775 for (InputInfoList::const_iterator
4776 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4777 const InputInfo &II = *it;
4778 CmdArgs.push_back(II.getFilename());
4779 }
4780
4781 const char *Exec =
4782 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4783 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4784}
4785
4786
4787void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4788 const InputInfo &Output,
4789 const InputInfoList &Inputs,
4790 const ArgList &Args,
4791 const char *LinkingOutput) const {
4792 // FIXME: Find a real GCC, don't hard-code versions here
4793 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4794 const llvm::Triple &T = getToolChain().getTriple();
4795 std::string LibPath = "/usr/lib/";
4796 llvm::Triple::ArchType Arch = T.getArch();
4797 switch (Arch) {
4798 case llvm::Triple::x86:
4799 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4800 T.getOSName()).str() + "/4.5.2/";
4801 break;
4802 case llvm::Triple::x86_64:
4803 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4804 T.getOSName()).str();
4805 GCCLibPath += "/4.5.2/amd64/";
4806 LibPath += "amd64/";
4807 break;
4808 default:
4809 assert(0 && "Unsupported architecture");
4810 }
4811
4812 ArgStringList CmdArgs;
4813
David Chisnall272a0712012-02-29 15:06:12 +00004814 // Demangle C++ names in errors
4815 CmdArgs.push_back("-C");
4816
David Chisnallf571cde2012-02-15 13:39:01 +00004817 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4818 (!Args.hasArg(options::OPT_shared))) {
4819 CmdArgs.push_back("-e");
4820 CmdArgs.push_back("_start");
4821 }
4822
4823 if (Args.hasArg(options::OPT_static)) {
4824 CmdArgs.push_back("-Bstatic");
4825 CmdArgs.push_back("-dn");
4826 } else {
4827 CmdArgs.push_back("-Bdynamic");
4828 if (Args.hasArg(options::OPT_shared)) {
4829 CmdArgs.push_back("-shared");
4830 } else {
4831 CmdArgs.push_back("--dynamic-linker");
4832 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4833 }
4834 }
4835
4836 if (Output.isFilename()) {
4837 CmdArgs.push_back("-o");
4838 CmdArgs.push_back(Output.getFilename());
4839 } else {
4840 assert(Output.isNothing() && "Invalid output.");
4841 }
4842
4843 if (!Args.hasArg(options::OPT_nostdlib) &&
4844 !Args.hasArg(options::OPT_nostartfiles)) {
4845 if (!Args.hasArg(options::OPT_shared)) {
4846 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4847 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004848 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004849 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4850 } else {
4851 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004852 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4853 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004854 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004855 if (getToolChain().getDriver().CCCIsCXX)
4856 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004857 }
4858
4859 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4860
4861 Args.AddAllArgs(CmdArgs, options::OPT_L);
4862 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4863 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004864 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004865
4866 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4867
4868 if (!Args.hasArg(options::OPT_nostdlib) &&
4869 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004870 if (getToolChain().getDriver().CCCIsCXX)
4871 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004872 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004873 if (!Args.hasArg(options::OPT_shared)) {
4874 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004875 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004876 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004877 }
David Chisnallf571cde2012-02-15 13:39:01 +00004878 }
4879
4880 if (!Args.hasArg(options::OPT_nostdlib) &&
4881 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004882 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004883 }
David Chisnall96de9932012-02-16 16:00:47 +00004884 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004885
4886 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4887
4888 const char *Exec =
4889 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4890 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4891}
4892
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004893void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004894 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004895 const InputInfoList &Inputs,
4896 const ArgList &Args,
4897 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004898 ArgStringList CmdArgs;
4899
4900 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4901 options::OPT_Xassembler);
4902
4903 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004904 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004905
4906 for (InputInfoList::const_iterator
4907 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4908 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004909 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004910 }
4911
4912 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004913 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004914 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004915}
4916
4917void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004918 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004919 const InputInfoList &Inputs,
4920 const ArgList &Args,
4921 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004922 ArgStringList CmdArgs;
4923
4924 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004925 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004926 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004927 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004928 }
4929
4930 if (Args.hasArg(options::OPT_static)) {
4931 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004932 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004933 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004934// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004935 CmdArgs.push_back("-Bdynamic");
4936 if (Args.hasArg(options::OPT_shared)) {
4937 CmdArgs.push_back("-shared");
4938 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004939 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004940 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4941 }
4942 }
4943
Daniel Dunbarb440f562010-08-02 02:38:21 +00004944 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004945 CmdArgs.push_back("-o");
4946 CmdArgs.push_back(Output.getFilename());
4947 } else {
4948 assert(Output.isNothing() && "Invalid output.");
4949 }
4950
4951 if (!Args.hasArg(options::OPT_nostdlib) &&
4952 !Args.hasArg(options::OPT_nostartfiles)) {
4953 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004954 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004955 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004956 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004957 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004958 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004959 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004960 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004961 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004962 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004963 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004964 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004965 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004966 }
4967
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004968 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4969 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004970 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004971
4972 Args.AddAllArgs(CmdArgs, options::OPT_L);
4973 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4974 Args.AddAllArgs(CmdArgs, options::OPT_e);
4975
Daniel Dunbar54423b22010-09-17 00:24:54 +00004976 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004977
4978 if (!Args.hasArg(options::OPT_nostdlib) &&
4979 !Args.hasArg(options::OPT_nodefaultlibs)) {
4980 // FIXME: For some reason GCC passes -lgcc before adding
4981 // the default system libraries. Just mimic this for now.
4982 CmdArgs.push_back("-lgcc");
4983
4984 if (Args.hasArg(options::OPT_pthread))
4985 CmdArgs.push_back("-pthread");
4986 if (!Args.hasArg(options::OPT_shared))
4987 CmdArgs.push_back("-lc");
4988 CmdArgs.push_back("-lgcc");
4989 }
4990
4991 if (!Args.hasArg(options::OPT_nostdlib) &&
4992 !Args.hasArg(options::OPT_nostartfiles)) {
4993 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004994 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004995 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004996 }
4997
Bill Wendling08760582011-06-27 19:15:03 +00004998 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004999
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005000 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005001 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005002 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005003}
5004
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005005void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005006 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005007 const InputInfoList &Inputs,
5008 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005009 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005010 ArgStringList CmdArgs;
5011
5012 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5013 options::OPT_Xassembler);
5014
5015 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005016 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005017
5018 for (InputInfoList::const_iterator
5019 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5020 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005021 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005022 }
5023
5024 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005025 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005026 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005027}
5028
5029void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005030 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005031 const InputInfoList &Inputs,
5032 const ArgList &Args,
5033 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005034 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005035 ArgStringList CmdArgs;
5036
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005037 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005038 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005039 CmdArgs.push_back("-e");
5040 CmdArgs.push_back("__start");
5041 }
5042
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005043 if (Args.hasArg(options::OPT_static)) {
5044 CmdArgs.push_back("-Bstatic");
5045 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005046 if (Args.hasArg(options::OPT_rdynamic))
5047 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005048 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005049 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005050 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005051 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005052 } else {
5053 CmdArgs.push_back("-dynamic-linker");
5054 CmdArgs.push_back("/usr/libexec/ld.so");
5055 }
5056 }
5057
Daniel Dunbarb440f562010-08-02 02:38:21 +00005058 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005059 CmdArgs.push_back("-o");
5060 CmdArgs.push_back(Output.getFilename());
5061 } else {
5062 assert(Output.isNothing() && "Invalid output.");
5063 }
5064
5065 if (!Args.hasArg(options::OPT_nostdlib) &&
5066 !Args.hasArg(options::OPT_nostartfiles)) {
5067 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005068 if (Args.hasArg(options::OPT_pg))
5069 CmdArgs.push_back(Args.MakeArgString(
5070 getToolChain().GetFilePath("gcrt0.o")));
5071 else
5072 CmdArgs.push_back(Args.MakeArgString(
5073 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005074 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005075 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005076 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005077 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005078 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005079 }
5080 }
5081
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005082 std::string Triple = getToolChain().getTripleString();
5083 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005084 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005085 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005086 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005087
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005088 Args.AddAllArgs(CmdArgs, options::OPT_L);
5089 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5090 Args.AddAllArgs(CmdArgs, options::OPT_e);
5091
Daniel Dunbar54423b22010-09-17 00:24:54 +00005092 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005093
5094 if (!Args.hasArg(options::OPT_nostdlib) &&
5095 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005096 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005097 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005098 if (Args.hasArg(options::OPT_pg))
5099 CmdArgs.push_back("-lm_p");
5100 else
5101 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005102 }
5103
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005104 // FIXME: For some reason GCC passes -lgcc before adding
5105 // the default system libraries. Just mimic this for now.
5106 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005107
Eric Christopher17674ec2012-09-13 06:32:34 +00005108 if (Args.hasArg(options::OPT_pthread)) {
5109 if (!Args.hasArg(options::OPT_shared) &&
5110 Args.hasArg(options::OPT_pg))
5111 CmdArgs.push_back("-lpthread_p");
5112 else
5113 CmdArgs.push_back("-lpthread");
5114 }
5115
Chandler Carruth45661652011-12-17 22:32:42 +00005116 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005117 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005118 CmdArgs.push_back("-lc_p");
5119 else
5120 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005121 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005122
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005123 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005124 }
5125
5126 if (!Args.hasArg(options::OPT_nostdlib) &&
5127 !Args.hasArg(options::OPT_nostartfiles)) {
5128 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005129 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005130 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005131 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005132 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005133 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005134 }
5135
5136 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005137 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005138 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005139}
Ed Schoutene33194b2009-04-02 19:13:12 +00005140
Eli Friedman9fa28852012-08-08 23:57:20 +00005141void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5142 const InputInfo &Output,
5143 const InputInfoList &Inputs,
5144 const ArgList &Args,
5145 const char *LinkingOutput) const {
5146 ArgStringList CmdArgs;
5147
5148 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5149 options::OPT_Xassembler);
5150
5151 CmdArgs.push_back("-o");
5152 CmdArgs.push_back(Output.getFilename());
5153
5154 for (InputInfoList::const_iterator
5155 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5156 const InputInfo &II = *it;
5157 CmdArgs.push_back(II.getFilename());
5158 }
5159
5160 const char *Exec =
5161 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5162 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5163}
5164
5165void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5166 const InputInfo &Output,
5167 const InputInfoList &Inputs,
5168 const ArgList &Args,
5169 const char *LinkingOutput) const {
5170 const Driver &D = getToolChain().getDriver();
5171 ArgStringList CmdArgs;
5172
5173 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5174 (!Args.hasArg(options::OPT_shared))) {
5175 CmdArgs.push_back("-e");
5176 CmdArgs.push_back("__start");
5177 }
5178
5179 if (Args.hasArg(options::OPT_static)) {
5180 CmdArgs.push_back("-Bstatic");
5181 } else {
5182 if (Args.hasArg(options::OPT_rdynamic))
5183 CmdArgs.push_back("-export-dynamic");
5184 CmdArgs.push_back("--eh-frame-hdr");
5185 CmdArgs.push_back("-Bdynamic");
5186 if (Args.hasArg(options::OPT_shared)) {
5187 CmdArgs.push_back("-shared");
5188 } else {
5189 CmdArgs.push_back("-dynamic-linker");
5190 CmdArgs.push_back("/usr/libexec/ld.so");
5191 }
5192 }
5193
5194 if (Output.isFilename()) {
5195 CmdArgs.push_back("-o");
5196 CmdArgs.push_back(Output.getFilename());
5197 } else {
5198 assert(Output.isNothing() && "Invalid output.");
5199 }
5200
5201 if (!Args.hasArg(options::OPT_nostdlib) &&
5202 !Args.hasArg(options::OPT_nostartfiles)) {
5203 if (!Args.hasArg(options::OPT_shared)) {
5204 if (Args.hasArg(options::OPT_pg))
5205 CmdArgs.push_back(Args.MakeArgString(
5206 getToolChain().GetFilePath("gcrt0.o")));
5207 else
5208 CmdArgs.push_back(Args.MakeArgString(
5209 getToolChain().GetFilePath("crt0.o")));
5210 CmdArgs.push_back(Args.MakeArgString(
5211 getToolChain().GetFilePath("crtbegin.o")));
5212 } else {
5213 CmdArgs.push_back(Args.MakeArgString(
5214 getToolChain().GetFilePath("crtbeginS.o")));
5215 }
5216 }
5217
5218 Args.AddAllArgs(CmdArgs, options::OPT_L);
5219 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5220 Args.AddAllArgs(CmdArgs, options::OPT_e);
5221
5222 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5223
5224 if (!Args.hasArg(options::OPT_nostdlib) &&
5225 !Args.hasArg(options::OPT_nodefaultlibs)) {
5226 if (D.CCCIsCXX) {
5227 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5228 if (Args.hasArg(options::OPT_pg))
5229 CmdArgs.push_back("-lm_p");
5230 else
5231 CmdArgs.push_back("-lm");
5232 }
5233
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005234 if (Args.hasArg(options::OPT_pthread)) {
5235 if (!Args.hasArg(options::OPT_shared) &&
5236 Args.hasArg(options::OPT_pg))
5237 CmdArgs.push_back("-lpthread_p");
5238 else
5239 CmdArgs.push_back("-lpthread");
5240 }
5241
Eli Friedman9fa28852012-08-08 23:57:20 +00005242 if (!Args.hasArg(options::OPT_shared)) {
5243 if (Args.hasArg(options::OPT_pg))
5244 CmdArgs.push_back("-lc_p");
5245 else
5246 CmdArgs.push_back("-lc");
5247 }
5248
5249 std::string myarch = "-lclang_rt.";
5250 const llvm::Triple &T = getToolChain().getTriple();
5251 llvm::Triple::ArchType Arch = T.getArch();
5252 switch (Arch) {
5253 case llvm::Triple::arm:
5254 myarch += ("arm");
5255 break;
5256 case llvm::Triple::x86:
5257 myarch += ("i386");
5258 break;
5259 case llvm::Triple::x86_64:
5260 myarch += ("amd64");
5261 break;
5262 default:
5263 assert(0 && "Unsupported architecture");
5264 }
5265 CmdArgs.push_back(Args.MakeArgString(myarch));
5266 }
5267
5268 if (!Args.hasArg(options::OPT_nostdlib) &&
5269 !Args.hasArg(options::OPT_nostartfiles)) {
5270 if (!Args.hasArg(options::OPT_shared))
5271 CmdArgs.push_back(Args.MakeArgString(
5272 getToolChain().GetFilePath("crtend.o")));
5273 else
5274 CmdArgs.push_back(Args.MakeArgString(
5275 getToolChain().GetFilePath("crtendS.o")));
5276 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005277
5278 const char *Exec =
5279 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5280 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005281}
5282
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005283void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005284 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005285 const InputInfoList &Inputs,
5286 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005287 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005288 ArgStringList CmdArgs;
5289
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005290 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5291 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005292 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005293 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005294 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005295 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005296 else if (getToolChain().getArch() == llvm::Triple::mips ||
5297 getToolChain().getArch() == llvm::Triple::mipsel ||
5298 getToolChain().getArch() == llvm::Triple::mips64 ||
5299 getToolChain().getArch() == llvm::Triple::mips64el) {
5300 StringRef CPUName;
5301 StringRef ABIName;
5302 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005303
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005304 CmdArgs.push_back("-march");
5305 CmdArgs.push_back(CPUName.data());
5306
5307 // Convert ABI name to the GNU tools acceptable variant.
5308 if (ABIName == "o32")
5309 ABIName = "32";
5310 else if (ABIName == "n64")
5311 ABIName = "64";
5312
5313 CmdArgs.push_back("-mabi");
5314 CmdArgs.push_back(ABIName.data());
5315
5316 if (getToolChain().getArch() == llvm::Triple::mips ||
5317 getToolChain().getArch() == llvm::Triple::mips64)
5318 CmdArgs.push_back("-EB");
5319 else
5320 CmdArgs.push_back("-EL");
5321
5322 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5323 options::OPT_fpic, options::OPT_fno_pic,
5324 options::OPT_fPIE, options::OPT_fno_PIE,
5325 options::OPT_fpie, options::OPT_fno_pie);
5326 if (LastPICArg &&
5327 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5328 LastPICArg->getOption().matches(options::OPT_fpic) ||
5329 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5330 LastPICArg->getOption().matches(options::OPT_fpie))) {
5331 CmdArgs.push_back("-KPIC");
5332 }
5333 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005334
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005335 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5336 options::OPT_Xassembler);
5337
5338 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005339 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005340
5341 for (InputInfoList::const_iterator
5342 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5343 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005344 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005345 }
5346
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005347 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005348 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005349 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005350}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005351
5352void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005353 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005354 const InputInfoList &Inputs,
5355 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005356 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005357 const toolchains::FreeBSD& ToolChain =
5358 static_cast<const toolchains::FreeBSD&>(getToolChain());
5359 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005360 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005361
5362 // Silence warning for "clang -g foo.o -o foo"
5363 Args.ClaimAllArgs(options::OPT_g_Group);
5364 // and "clang -emit-llvm foo.o -o foo"
5365 Args.ClaimAllArgs(options::OPT_emit_llvm);
5366 // and for "clang -w foo.o -o foo". Other warning options are already
5367 // handled somewhere else.
5368 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005369
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005370 if (!D.SysRoot.empty())
5371 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5372
Roman Divackyafe2f232012-08-28 15:09:03 +00005373 if (Args.hasArg(options::OPT_pie))
5374 CmdArgs.push_back("-pie");
5375
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005376 if (Args.hasArg(options::OPT_static)) {
5377 CmdArgs.push_back("-Bstatic");
5378 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005379 if (Args.hasArg(options::OPT_rdynamic))
5380 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005381 CmdArgs.push_back("--eh-frame-hdr");
5382 if (Args.hasArg(options::OPT_shared)) {
5383 CmdArgs.push_back("-Bshareable");
5384 } else {
5385 CmdArgs.push_back("-dynamic-linker");
5386 CmdArgs.push_back("/libexec/ld-elf.so.1");
5387 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005388 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5389 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005390 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5391 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5392 CmdArgs.push_back("--hash-style=both");
5393 }
5394 }
5395 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005396 }
5397
5398 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5399 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005400 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005401 CmdArgs.push_back("-m");
5402 CmdArgs.push_back("elf_i386_fbsd");
5403 }
5404
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005405 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005406 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005407 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005408 }
5409
Daniel Dunbarb440f562010-08-02 02:38:21 +00005410 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005411 CmdArgs.push_back("-o");
5412 CmdArgs.push_back(Output.getFilename());
5413 } else {
5414 assert(Output.isNothing() && "Invalid output.");
5415 }
5416
5417 if (!Args.hasArg(options::OPT_nostdlib) &&
5418 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005419 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005420 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005421 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005422 crt1 = "gcrt1.o";
5423 else if (Args.hasArg(options::OPT_pie))
5424 crt1 = "Scrt1.o";
5425 else
5426 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005427 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005428 if (crt1)
5429 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5430
5431 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5432
5433 const char *crtbegin = NULL;
5434 if (Args.hasArg(options::OPT_static))
5435 crtbegin = "crtbeginT.o";
5436 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5437 crtbegin = "crtbeginS.o";
5438 else
5439 crtbegin = "crtbegin.o";
5440
5441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005442 }
5443
5444 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005445 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005446 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5447 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005448 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005449 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5450 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005451 Args.AddAllArgs(CmdArgs, options::OPT_s);
5452 Args.AddAllArgs(CmdArgs, options::OPT_t);
5453 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5454 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005455
Roman Divackyafe2f232012-08-28 15:09:03 +00005456 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005457
5458 if (!Args.hasArg(options::OPT_nostdlib) &&
5459 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005460 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005461 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005462 if (Args.hasArg(options::OPT_pg))
5463 CmdArgs.push_back("-lm_p");
5464 else
5465 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005466 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005467 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5468 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005469 if (Args.hasArg(options::OPT_pg))
5470 CmdArgs.push_back("-lgcc_p");
5471 else
5472 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005473 if (Args.hasArg(options::OPT_static)) {
5474 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005475 } else if (Args.hasArg(options::OPT_pg)) {
5476 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005477 } else {
5478 CmdArgs.push_back("--as-needed");
5479 CmdArgs.push_back("-lgcc_s");
5480 CmdArgs.push_back("--no-as-needed");
5481 }
5482
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005483 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005484 if (Args.hasArg(options::OPT_pg))
5485 CmdArgs.push_back("-lpthread_p");
5486 else
5487 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005488 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005489
Roman Divacky66f22762011-02-10 16:59:40 +00005490 if (Args.hasArg(options::OPT_pg)) {
5491 if (Args.hasArg(options::OPT_shared))
5492 CmdArgs.push_back("-lc");
5493 else
5494 CmdArgs.push_back("-lc_p");
5495 CmdArgs.push_back("-lgcc_p");
5496 } else {
5497 CmdArgs.push_back("-lc");
5498 CmdArgs.push_back("-lgcc");
5499 }
5500
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005501 if (Args.hasArg(options::OPT_static)) {
5502 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005503 } else if (Args.hasArg(options::OPT_pg)) {
5504 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005505 } else {
5506 CmdArgs.push_back("--as-needed");
5507 CmdArgs.push_back("-lgcc_s");
5508 CmdArgs.push_back("--no-as-needed");
5509 }
5510 }
5511
5512 if (!Args.hasArg(options::OPT_nostdlib) &&
5513 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005514 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005515 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005516 else
5517 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005518 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005519 }
5520
Roman Divackyafe2f232012-08-28 15:09:03 +00005521 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005522
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005523 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005524 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005525 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005526}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005527
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005528void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5529 const InputInfo &Output,
5530 const InputInfoList &Inputs,
5531 const ArgList &Args,
5532 const char *LinkingOutput) const {
5533 ArgStringList CmdArgs;
5534
5535 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5536 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005537 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005538 CmdArgs.push_back("--32");
5539
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005540 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005541 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005542 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005543 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005544 CmdArgs.push_back("-EL");
5545
5546 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5547 options::OPT_Xassembler);
5548
5549 CmdArgs.push_back("-o");
5550 CmdArgs.push_back(Output.getFilename());
5551
5552 for (InputInfoList::const_iterator
5553 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5554 const InputInfo &II = *it;
5555 CmdArgs.push_back(II.getFilename());
5556 }
5557
David Chisnallddbd68f2011-09-27 22:03:18 +00005558 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005559 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5560}
5561
5562void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5563 const InputInfo &Output,
5564 const InputInfoList &Inputs,
5565 const ArgList &Args,
5566 const char *LinkingOutput) const {
5567 const Driver &D = getToolChain().getDriver();
5568 ArgStringList CmdArgs;
5569
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005570 if (!D.SysRoot.empty())
5571 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5572
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005573 if (Args.hasArg(options::OPT_static)) {
5574 CmdArgs.push_back("-Bstatic");
5575 } else {
5576 if (Args.hasArg(options::OPT_rdynamic))
5577 CmdArgs.push_back("-export-dynamic");
5578 CmdArgs.push_back("--eh-frame-hdr");
5579 if (Args.hasArg(options::OPT_shared)) {
5580 CmdArgs.push_back("-Bshareable");
5581 } else {
5582 CmdArgs.push_back("-dynamic-linker");
5583 CmdArgs.push_back("/libexec/ld.elf_so");
5584 }
5585 }
5586
5587 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5588 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005589 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005590 CmdArgs.push_back("-m");
5591 CmdArgs.push_back("elf_i386");
5592 }
5593
5594 if (Output.isFilename()) {
5595 CmdArgs.push_back("-o");
5596 CmdArgs.push_back(Output.getFilename());
5597 } else {
5598 assert(Output.isNothing() && "Invalid output.");
5599 }
5600
5601 if (!Args.hasArg(options::OPT_nostdlib) &&
5602 !Args.hasArg(options::OPT_nostartfiles)) {
5603 if (!Args.hasArg(options::OPT_shared)) {
5604 CmdArgs.push_back(Args.MakeArgString(
5605 getToolChain().GetFilePath("crt0.o")));
5606 CmdArgs.push_back(Args.MakeArgString(
5607 getToolChain().GetFilePath("crti.o")));
5608 CmdArgs.push_back(Args.MakeArgString(
5609 getToolChain().GetFilePath("crtbegin.o")));
5610 } else {
5611 CmdArgs.push_back(Args.MakeArgString(
5612 getToolChain().GetFilePath("crti.o")));
5613 CmdArgs.push_back(Args.MakeArgString(
5614 getToolChain().GetFilePath("crtbeginS.o")));
5615 }
5616 }
5617
5618 Args.AddAllArgs(CmdArgs, options::OPT_L);
5619 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5620 Args.AddAllArgs(CmdArgs, options::OPT_e);
5621 Args.AddAllArgs(CmdArgs, options::OPT_s);
5622 Args.AddAllArgs(CmdArgs, options::OPT_t);
5623 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5624 Args.AddAllArgs(CmdArgs, options::OPT_r);
5625
5626 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5627
5628 if (!Args.hasArg(options::OPT_nostdlib) &&
5629 !Args.hasArg(options::OPT_nodefaultlibs)) {
5630 if (D.CCCIsCXX) {
5631 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5632 CmdArgs.push_back("-lm");
5633 }
5634 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5635 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005636 if (Args.hasArg(options::OPT_static)) {
5637 CmdArgs.push_back("-lgcc_eh");
5638 } else {
5639 CmdArgs.push_back("--as-needed");
5640 CmdArgs.push_back("-lgcc_s");
5641 CmdArgs.push_back("--no-as-needed");
5642 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005643 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005644
5645 if (Args.hasArg(options::OPT_pthread))
5646 CmdArgs.push_back("-lpthread");
5647 CmdArgs.push_back("-lc");
5648
5649 CmdArgs.push_back("-lgcc");
5650 if (Args.hasArg(options::OPT_static)) {
5651 CmdArgs.push_back("-lgcc_eh");
5652 } else {
5653 CmdArgs.push_back("--as-needed");
5654 CmdArgs.push_back("-lgcc_s");
5655 CmdArgs.push_back("--no-as-needed");
5656 }
5657 }
5658
5659 if (!Args.hasArg(options::OPT_nostdlib) &&
5660 !Args.hasArg(options::OPT_nostartfiles)) {
5661 if (!Args.hasArg(options::OPT_shared))
5662 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5663 "crtend.o")));
5664 else
5665 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5666 "crtendS.o")));
5667 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5668 "crtn.o")));
5669 }
5670
Bill Wendling08760582011-06-27 19:15:03 +00005671 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005672
David Chisnallddbd68f2011-09-27 22:03:18 +00005673 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005674 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5675}
5676
Rafael Espindola92b00932010-08-10 00:25:48 +00005677void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5678 const InputInfo &Output,
5679 const InputInfoList &Inputs,
5680 const ArgList &Args,
5681 const char *LinkingOutput) const {
5682 ArgStringList CmdArgs;
5683
5684 // Add --32/--64 to make sure we get the format we want.
5685 // This is incomplete
5686 if (getToolChain().getArch() == llvm::Triple::x86) {
5687 CmdArgs.push_back("--32");
5688 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5689 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005690 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5691 CmdArgs.push_back("-a32");
5692 CmdArgs.push_back("-mppc");
5693 CmdArgs.push_back("-many");
5694 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5695 CmdArgs.push_back("-a64");
5696 CmdArgs.push_back("-mppc64");
5697 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005698 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005699 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005700 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5701 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005702
5703 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5704 getToolChain().getTriple());
5705 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005706
5707 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5708 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5709 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005710 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5711 getToolChain().getArch() == llvm::Triple::mipsel ||
5712 getToolChain().getArch() == llvm::Triple::mips64 ||
5713 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005714 StringRef CPUName;
5715 StringRef ABIName;
5716 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005717
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005718 CmdArgs.push_back("-march");
5719 CmdArgs.push_back(CPUName.data());
5720
5721 // Convert ABI name to the GNU tools acceptable variant.
5722 if (ABIName == "o32")
5723 ABIName = "32";
5724 else if (ABIName == "n64")
5725 ABIName = "64";
5726
5727 CmdArgs.push_back("-mabi");
5728 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005729
5730 if (getToolChain().getArch() == llvm::Triple::mips ||
5731 getToolChain().getArch() == llvm::Triple::mips64)
5732 CmdArgs.push_back("-EB");
5733 else
5734 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005735
5736 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5737 options::OPT_fpic, options::OPT_fno_pic,
5738 options::OPT_fPIE, options::OPT_fno_PIE,
5739 options::OPT_fpie, options::OPT_fno_pie);
5740 if (LastPICArg &&
5741 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5742 LastPICArg->getOption().matches(options::OPT_fpic) ||
5743 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5744 LastPICArg->getOption().matches(options::OPT_fpie))) {
5745 CmdArgs.push_back("-KPIC");
5746 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005747 }
5748
5749 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5750 options::OPT_Xassembler);
5751
5752 CmdArgs.push_back("-o");
5753 CmdArgs.push_back(Output.getFilename());
5754
5755 for (InputInfoList::const_iterator
5756 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5757 const InputInfo &II = *it;
5758 CmdArgs.push_back(II.getFilename());
5759 }
5760
5761 const char *Exec =
5762 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5763 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5764}
5765
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005766static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5767 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005768 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005769 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005770 Args.hasArg(options::OPT_static_libgcc);
5771 if (!D.CCCIsCXX)
5772 CmdArgs.push_back("-lgcc");
5773
5774 if (StaticLibgcc) {
5775 if (D.CCCIsCXX)
5776 CmdArgs.push_back("-lgcc");
5777 } else {
5778 if (!D.CCCIsCXX)
5779 CmdArgs.push_back("--as-needed");
5780 CmdArgs.push_back("-lgcc_s");
5781 if (!D.CCCIsCXX)
5782 CmdArgs.push_back("--no-as-needed");
5783 }
5784
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005785 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005786 CmdArgs.push_back("-lgcc_eh");
5787 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5788 CmdArgs.push_back("-lgcc");
5789}
5790
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005791static bool hasMipsN32ABIArg(const ArgList &Args) {
5792 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005793 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005794}
5795
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005796void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5797 const InputInfo &Output,
5798 const InputInfoList &Inputs,
5799 const ArgList &Args,
5800 const char *LinkingOutput) const {
5801 const toolchains::Linux& ToolChain =
5802 static_cast<const toolchains::Linux&>(getToolChain());
5803 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005804 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005805 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005806
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005807 ArgStringList CmdArgs;
5808
Rafael Espindolad1002f62010-11-15 18:28:16 +00005809 // Silence warning for "clang -g foo.o -o foo"
5810 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005811 // and "clang -emit-llvm foo.o -o foo"
5812 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005813 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005814 // handled somewhere else.
5815 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005816
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005817 if (!D.SysRoot.empty())
5818 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005819
Rafael Espindolad47ac232010-11-17 22:26:15 +00005820 if (Args.hasArg(options::OPT_pie))
5821 CmdArgs.push_back("-pie");
5822
Rafael Espindola1c76c592010-11-07 22:57:16 +00005823 if (Args.hasArg(options::OPT_rdynamic))
5824 CmdArgs.push_back("-export-dynamic");
5825
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005826 if (Args.hasArg(options::OPT_s))
5827 CmdArgs.push_back("-s");
5828
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005829 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5830 e = ToolChain.ExtraOpts.end();
5831 i != e; ++i)
5832 CmdArgs.push_back(i->c_str());
5833
5834 if (!Args.hasArg(options::OPT_static)) {
5835 CmdArgs.push_back("--eh-frame-hdr");
5836 }
5837
5838 CmdArgs.push_back("-m");
5839 if (ToolChain.getArch() == llvm::Triple::x86)
5840 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005841 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005842 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005843 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005844 else if (ToolChain.getArch() == llvm::Triple::ppc)
5845 CmdArgs.push_back("elf32ppclinux");
5846 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5847 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005848 else if (ToolChain.getArch() == llvm::Triple::mips)
5849 CmdArgs.push_back("elf32btsmip");
5850 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5851 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005852 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5853 if (hasMipsN32ABIArg(Args))
5854 CmdArgs.push_back("elf32btsmipn32");
5855 else
5856 CmdArgs.push_back("elf64btsmip");
5857 }
5858 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5859 if (hasMipsN32ABIArg(Args))
5860 CmdArgs.push_back("elf32ltsmipn32");
5861 else
5862 CmdArgs.push_back("elf64ltsmip");
5863 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005864 else
5865 CmdArgs.push_back("elf_x86_64");
5866
5867 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005868 if (ToolChain.getArch() == llvm::Triple::arm
5869 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005870 CmdArgs.push_back("-Bstatic");
5871 else
5872 CmdArgs.push_back("-static");
5873 } else if (Args.hasArg(options::OPT_shared)) {
5874 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005875 if ((ToolChain.getArch() == llvm::Triple::arm
5876 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5877 CmdArgs.push_back("-Bsymbolic");
5878 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005879 }
5880
5881 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005882 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005883 (!Args.hasArg(options::OPT_static) &&
5884 !Args.hasArg(options::OPT_shared))) {
5885 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005886 if (isAndroid)
5887 CmdArgs.push_back("/system/bin/linker");
5888 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005889 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005890 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005891 ToolChain.getArch() == llvm::Triple::thumb) {
5892 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5893 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5894 else
5895 CmdArgs.push_back("/lib/ld-linux.so.3");
5896 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005897 else if (ToolChain.getArch() == llvm::Triple::mips ||
5898 ToolChain.getArch() == llvm::Triple::mipsel)
5899 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005900 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005901 ToolChain.getArch() == llvm::Triple::mips64el) {
5902 if (hasMipsN32ABIArg(Args))
5903 CmdArgs.push_back("/lib32/ld.so.1");
5904 else
5905 CmdArgs.push_back("/lib64/ld.so.1");
5906 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005907 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005908 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005909 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005910 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005911 else
5912 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5913 }
5914
5915 CmdArgs.push_back("-o");
5916 CmdArgs.push_back(Output.getFilename());
5917
Rafael Espindola81937ec2010-12-01 01:52:43 +00005918 if (!Args.hasArg(options::OPT_nostdlib) &&
5919 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005920 if (!isAndroid) {
5921 const char *crt1 = NULL;
5922 if (!Args.hasArg(options::OPT_shared)){
5923 if (Args.hasArg(options::OPT_pie))
5924 crt1 = "Scrt1.o";
5925 else
5926 crt1 = "crt1.o";
5927 }
5928 if (crt1)
5929 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005930
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5932 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005933
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005934 const char *crtbegin;
5935 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005936 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005937 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005938 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005939 else if (Args.hasArg(options::OPT_pie))
5940 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005941 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005942 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005943 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005944
5945 // Add crtfastmath.o if available and fast math is enabled.
5946 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005947 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005948
5949 Args.AddAllArgs(CmdArgs, options::OPT_L);
5950
5951 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5952
Roman Divackyee8188a2011-03-01 17:53:14 +00005953 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5954 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005955 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005956
Rafael Espindola9446d762012-04-09 23:53:34 +00005957 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5958 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5959 // forward.
5960 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5961 CmdArgs.push_back("-plugin");
5962 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5963 CmdArgs.push_back(Args.MakeArgString(Plugin));
5964 }
5965
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005966 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5967 CmdArgs.push_back("--no-demangle");
5968
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005969 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5970
Richard Smith4d3110a2012-10-25 02:14:12 +00005971 // Call this before we add the C++ ABI library.
5972 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
5973
Chandler Carruth94a32012012-05-14 18:31:18 +00005974 if (D.CCCIsCXX &&
5975 !Args.hasArg(options::OPT_nostdlib) &&
5976 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005977 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5978 !Args.hasArg(options::OPT_static);
5979 if (OnlyLibstdcxxStatic)
5980 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005981 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005982 if (OnlyLibstdcxxStatic)
5983 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005984 CmdArgs.push_back("-lm");
5985 }
5986
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005987 // Call this before we add the C run-time.
5988 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005989 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005990
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005991 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005992 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5993 if (Args.hasArg(options::OPT_static))
5994 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005995
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005996 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005997
Chandler Carruth94a32012012-05-14 18:31:18 +00005998 if (Args.hasArg(options::OPT_pthread) ||
5999 Args.hasArg(options::OPT_pthreads))
6000 CmdArgs.push_back("-lpthread");
6001
6002 CmdArgs.push_back("-lc");
6003
6004 if (Args.hasArg(options::OPT_static))
6005 CmdArgs.push_back("--end-group");
6006 else
6007 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6008 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006009
Rafael Espindola81937ec2010-12-01 01:52:43 +00006010 if (!Args.hasArg(options::OPT_nostartfiles)) {
6011 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006012 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006013 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006014 else if (Args.hasArg(options::OPT_pie))
6015 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006016 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006017 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006018
Rafael Espindola81937ec2010-12-01 01:52:43 +00006019 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006020 if (!isAndroid)
6021 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006022 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006023 }
6024
Bill Wendling08760582011-06-27 19:15:03 +00006025 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006026
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006027 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6028}
Rafael Espindola92b00932010-08-10 00:25:48 +00006029
Chris Lattner3e2ee142010-07-07 16:01:42 +00006030void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006031 const InputInfo &Output,
6032 const InputInfoList &Inputs,
6033 const ArgList &Args,
6034 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006035 ArgStringList CmdArgs;
6036
6037 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6038 options::OPT_Xassembler);
6039
6040 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006041 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006042
6043 for (InputInfoList::const_iterator
6044 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6045 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006046 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006047 }
6048
6049 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006050 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006051 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006052}
6053
6054void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006055 const InputInfo &Output,
6056 const InputInfoList &Inputs,
6057 const ArgList &Args,
6058 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006059 const Driver &D = getToolChain().getDriver();
6060 ArgStringList CmdArgs;
6061
Daniel Dunbarb440f562010-08-02 02:38:21 +00006062 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006063 CmdArgs.push_back("-o");
6064 CmdArgs.push_back(Output.getFilename());
6065 } else {
6066 assert(Output.isNothing() && "Invalid output.");
6067 }
6068
6069 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006070 !Args.hasArg(options::OPT_nostartfiles)) {
6071 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6072 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6073 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6074 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6075 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006076
6077 Args.AddAllArgs(CmdArgs, options::OPT_L);
6078 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6079 Args.AddAllArgs(CmdArgs, options::OPT_e);
6080
Daniel Dunbar54423b22010-09-17 00:24:54 +00006081 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006082
Eli Friedman83de5132011-12-08 23:54:21 +00006083 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6084
Chris Lattner3e2ee142010-07-07 16:01:42 +00006085 if (!Args.hasArg(options::OPT_nostdlib) &&
6086 !Args.hasArg(options::OPT_nodefaultlibs)) {
6087 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006088 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006089 CmdArgs.push_back("-lm");
6090 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006091 }
6092
6093 if (!Args.hasArg(options::OPT_nostdlib) &&
6094 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006095 if (Args.hasArg(options::OPT_pthread))
6096 CmdArgs.push_back("-lpthread");
6097 CmdArgs.push_back("-lc");
6098 CmdArgs.push_back("-lCompilerRT-Generic");
6099 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6100 CmdArgs.push_back(
6101 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006102 }
6103
Eli Friedman83de5132011-12-08 23:54:21 +00006104 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006105 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006106}
6107
Daniel Dunbarcc912342009-05-02 18:28:39 +00006108/// DragonFly Tools
6109
6110// For now, DragonFly Assemble does just about the same as for
6111// FreeBSD, but this may change soon.
6112void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006113 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006114 const InputInfoList &Inputs,
6115 const ArgList &Args,
6116 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006117 ArgStringList CmdArgs;
6118
6119 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6120 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006121 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006122 CmdArgs.push_back("--32");
6123
6124 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6125 options::OPT_Xassembler);
6126
6127 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006128 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006129
6130 for (InputInfoList::const_iterator
6131 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6132 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006133 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006134 }
6135
6136 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006137 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006138 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006139}
6140
6141void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006142 const InputInfo &Output,
6143 const InputInfoList &Inputs,
6144 const ArgList &Args,
6145 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006146 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006147 ArgStringList CmdArgs;
6148
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006149 if (!D.SysRoot.empty())
6150 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6151
Daniel Dunbarcc912342009-05-02 18:28:39 +00006152 if (Args.hasArg(options::OPT_static)) {
6153 CmdArgs.push_back("-Bstatic");
6154 } else {
6155 if (Args.hasArg(options::OPT_shared))
6156 CmdArgs.push_back("-Bshareable");
6157 else {
6158 CmdArgs.push_back("-dynamic-linker");
6159 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6160 }
6161 }
6162
6163 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6164 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006165 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006166 CmdArgs.push_back("-m");
6167 CmdArgs.push_back("elf_i386");
6168 }
6169
Daniel Dunbarb440f562010-08-02 02:38:21 +00006170 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006171 CmdArgs.push_back("-o");
6172 CmdArgs.push_back(Output.getFilename());
6173 } else {
6174 assert(Output.isNothing() && "Invalid output.");
6175 }
6176
6177 if (!Args.hasArg(options::OPT_nostdlib) &&
6178 !Args.hasArg(options::OPT_nostartfiles)) {
6179 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006180 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006181 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006182 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006183 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006184 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006185 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006186 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006187 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006188 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006189 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006190 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006191 }
6192 }
6193
6194 Args.AddAllArgs(CmdArgs, options::OPT_L);
6195 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6196 Args.AddAllArgs(CmdArgs, options::OPT_e);
6197
Daniel Dunbar54423b22010-09-17 00:24:54 +00006198 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006199
6200 if (!Args.hasArg(options::OPT_nostdlib) &&
6201 !Args.hasArg(options::OPT_nodefaultlibs)) {
6202 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6203 // rpaths
6204 CmdArgs.push_back("-L/usr/lib/gcc41");
6205
6206 if (!Args.hasArg(options::OPT_static)) {
6207 CmdArgs.push_back("-rpath");
6208 CmdArgs.push_back("/usr/lib/gcc41");
6209
6210 CmdArgs.push_back("-rpath-link");
6211 CmdArgs.push_back("/usr/lib/gcc41");
6212
6213 CmdArgs.push_back("-rpath");
6214 CmdArgs.push_back("/usr/lib");
6215
6216 CmdArgs.push_back("-rpath-link");
6217 CmdArgs.push_back("/usr/lib");
6218 }
6219
Rafael Espindola38360b32010-07-20 12:59:03 +00006220 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006221 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006222 CmdArgs.push_back("-lm");
6223 }
6224
Daniel Dunbarcc912342009-05-02 18:28:39 +00006225 if (Args.hasArg(options::OPT_shared)) {
6226 CmdArgs.push_back("-lgcc_pic");
6227 } else {
6228 CmdArgs.push_back("-lgcc");
6229 }
6230
6231
6232 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006233 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006234
6235 if (!Args.hasArg(options::OPT_nolibc)) {
6236 CmdArgs.push_back("-lc");
6237 }
6238
6239 if (Args.hasArg(options::OPT_shared)) {
6240 CmdArgs.push_back("-lgcc_pic");
6241 } else {
6242 CmdArgs.push_back("-lgcc");
6243 }
6244 }
6245
6246 if (!Args.hasArg(options::OPT_nostdlib) &&
6247 !Args.hasArg(options::OPT_nostartfiles)) {
6248 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006249 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006250 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006251 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006252 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006253 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006254 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006255 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006256 }
6257
Bill Wendling08760582011-06-27 19:15:03 +00006258 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006259
Daniel Dunbarcc912342009-05-02 18:28:39 +00006260 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006261 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006262 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006263}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006264
6265void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6266 const InputInfo &Output,
6267 const InputInfoList &Inputs,
6268 const ArgList &Args,
6269 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006270 ArgStringList CmdArgs;
6271
6272 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006273 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6274 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006275 } else {
6276 assert(Output.isNothing() && "Invalid output.");
6277 }
6278
6279 if (!Args.hasArg(options::OPT_nostdlib) &&
6280 !Args.hasArg(options::OPT_nostartfiles)) {
6281 CmdArgs.push_back("-defaultlib:libcmt");
6282 }
6283
6284 CmdArgs.push_back("-nologo");
6285
Michael J. Spencere2f49362012-06-18 16:56:04 +00006286 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6287
6288 // Add filenames immediately.
6289 for (InputInfoList::const_iterator
6290 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6291 if (it->isFilename())
6292 CmdArgs.push_back(it->getFilename());
6293 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006294
6295 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006296 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006297 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6298}