blob: 6ae24da49860e19fedfd1d0d0284d49f4103dd17 [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 {
Rafael Espindola7df35012012-11-02 20:41:30 +00001113 const bool isAndroid =
1114 getToolChain().getTriple().getEnvironment() == llvm::Triple::Android;
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001115 if (!Args.hasFlag(options::OPT_mred_zone,
1116 options::OPT_mno_red_zone,
1117 true) ||
1118 Args.hasArg(options::OPT_mkernel) ||
1119 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001120 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001121
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001122 if (Args.hasFlag(options::OPT_msoft_float,
1123 options::OPT_mno_soft_float,
1124 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001125 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001126
Daniel Dunbare13ada62009-11-14 22:04:54 +00001127 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001128 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001129 if (StringRef(A->getValue()) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001130 // FIXME: Reject attempts to use -march=native unless the target matches
1131 // the host.
1132 //
1133 // FIXME: We should also incorporate the detected target features for use
1134 // with -native.
1135 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001136 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001137 CPUName = Args.MakeArgString(CPU);
1138 } else
Richard Smithbd55daf2012-11-01 04:30:05 +00001139 CPUName = A->getValue();
Daniel Dunbare13ada62009-11-14 22:04:54 +00001140 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001141
Daniel Dunbare13ada62009-11-14 22:04:54 +00001142 // Select the default CPU if none was given (or detection failed).
1143 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001144 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001145 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001146 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001147 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001148 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001149 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001150 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001151 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001152 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001153 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001154 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001155 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001156 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001157 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001158 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001159 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001160 } else if (getToolChain().getOS().startswith("bitrig")) {
1161 if (getToolChain().getArch() == llvm::Triple::x86_64)
1162 CPUName = "x86-64";
1163 else if (getToolChain().getArch() == llvm::Triple::x86)
1164 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001165 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001166 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001167 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001168 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001169 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001170 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001171 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001172 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001173 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001174 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001175 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001176 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001177 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001178 else if (getToolChain().getArch() == llvm::Triple::x86)
Rafael Espindola7df35012012-11-02 20:41:30 +00001179 // All x86 devices running Android have core2 as their common
1180 // denominator. This makes a better choice than pentium4.
1181 CPUName = isAndroid ? "core2" : "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001182 }
1183 }
1184
Daniel Dunbare13ada62009-11-14 22:04:54 +00001185 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001186 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001187 CmdArgs.push_back(CPUName);
1188 }
1189
Eli Friedmanad811f02011-07-02 00:34:19 +00001190 // The required algorithm here is slightly strange: the options are applied
1191 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1192 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1193 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1194 // former correctly, but not the latter; handle directly-overridden
1195 // attributes here.
1196 llvm::StringMap<unsigned> PrevFeature;
1197 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001198 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1199 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001200 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001201 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001202
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001203 // Skip over "-m".
Michael J. Spencer929fccd2012-10-22 22:13:48 +00001204 assert(Name.startswith("m") && "Invalid feature name.");
1205 Name = Name.substr(1);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001206
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001207 bool IsNegative = Name.startswith("no-");
1208 if (IsNegative)
1209 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001210
Eli Friedmanad811f02011-07-02 00:34:19 +00001211 unsigned& Prev = PrevFeature[Name];
1212 if (Prev)
1213 Features[Prev - 1] = 0;
1214 Prev = Features.size() + 1;
1215 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1216 }
1217 for (unsigned i = 0; i < Features.size(); i++) {
1218 if (Features[i]) {
1219 CmdArgs.push_back("-target-feature");
1220 CmdArgs.push_back(Features[i]);
1221 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001222 }
1223}
1224
Tony Linthicum76329bf2011-12-12 21:14:55 +00001225static Arg* getLastHexagonArchArg (const ArgList &Args)
1226{
1227 Arg * A = NULL;
1228
Sebastian Pop86500282012-01-13 20:37:10 +00001229 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1230 it != ie; ++it) {
1231 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001232 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1233 A = *it;
1234 A->claim();
1235 }
Sebastian Pop86500282012-01-13 20:37:10 +00001236 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
Richard Smithbd55daf2012-11-01 04:30:05 +00001237 StringRef Value = (*it)->getValue(0);
Sebastian Pop86500282012-01-13 20:37:10 +00001238 if (Value.startswith("v")) {
1239 A = *it;
1240 A->claim();
1241 }
1242 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001243 }
1244 return A;
1245}
1246
Sebastian Pop86500282012-01-13 20:37:10 +00001247static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001248{
1249 Arg *A;
1250 llvm::StringRef WhichHexagon;
1251
Sebastian Pop86500282012-01-13 20:37:10 +00001252 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001253 if ((A = getLastHexagonArchArg (Args))) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001254 WhichHexagon = A->getValue();
Sebastian Pop86500282012-01-13 20:37:10 +00001255 if (WhichHexagon == "")
1256 return "v4";
1257 else
1258 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001259 }
Sebastian Pop86500282012-01-13 20:37:10 +00001260 else
1261 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001262}
1263
1264void Clang::AddHexagonTargetArgs(const ArgList &Args,
1265 ArgStringList &CmdArgs) const {
1266 llvm::Triple Triple = getToolChain().getTriple();
1267
1268 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001269 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001270 CmdArgs.push_back("-fno-signed-char");
1271 CmdArgs.push_back("-nobuiltininc");
1272
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001273 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001274 CmdArgs.push_back("-mqdsp6-compat");
1275
1276 if (Arg *A = Args.getLastArg(options::OPT_G,
1277 options::OPT_msmall_data_threshold_EQ)) {
1278 std::string SmallDataThreshold="-small-data-threshold=";
Richard Smithbd55daf2012-11-01 04:30:05 +00001279 SmallDataThreshold += A->getValue();
Tony Linthicum76329bf2011-12-12 21:14:55 +00001280 CmdArgs.push_back ("-mllvm");
1281 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1282 A->claim();
1283 }
1284
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001285 if (!Args.hasArg(options::OPT_fno_short_enums))
1286 CmdArgs.push_back("-fshort-enums");
1287 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1288 CmdArgs.push_back ("-mllvm");
1289 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1290 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001291 CmdArgs.push_back ("-mllvm");
1292 CmdArgs.push_back ("-machine-sink-split=0");
1293}
1294
Eric Christopher84fbdb42011-08-19 00:30:14 +00001295static bool
John McCall5fb5df92012-06-20 06:18:46 +00001296shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001297 const llvm::Triple &Triple) {
1298 // We use the zero-cost exception tables for Objective-C if the non-fragile
1299 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1300 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001301 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001302 return true;
1303
Bob Wilson6524dd32011-10-14 05:03:44 +00001304 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001305 return false;
1306
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001307 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001308 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001309 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001310}
1311
Anders Carlssone96ab552011-02-28 02:27:16 +00001312/// addExceptionArgs - Adds exception related arguments to the driver command
1313/// arguments. There's a master flag, -fexceptions and also language specific
1314/// flags to enable/disable C++ and Objective-C exceptions.
1315/// This makes it possible to for example disable C++ exceptions but enable
1316/// Objective-C exceptions.
1317static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1318 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001319 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001320 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001321 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001322 if (KernelOrKext) {
1323 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1324 // arguments now to avoid warnings about unused arguments.
1325 Args.ClaimAllArgs(options::OPT_fexceptions);
1326 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1327 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1328 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1329 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1330 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001331 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001332 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001333
1334 // Exceptions are enabled by default.
1335 bool ExceptionsEnabled = true;
1336
1337 // This keeps track of whether exceptions were explicitly turned on or off.
1338 bool DidHaveExplicitExceptionFlag = false;
1339
Rafael Espindola00a66572009-10-01 13:33:33 +00001340 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1341 options::OPT_fno_exceptions)) {
1342 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001343 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001344 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001345 ExceptionsEnabled = false;
1346
1347 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001348 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001349
Anders Carlssone96ab552011-02-28 02:27:16 +00001350 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001351
Anders Carlssone96ab552011-02-28 02:27:16 +00001352 // Exception tables and cleanups can be enabled with -fexceptions even if the
1353 // language itself doesn't support exceptions.
1354 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1355 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001356
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001357 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1358 // is not necessarily sensible, but follows GCC.
1359 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001360 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001361 options::OPT_fno_objc_exceptions,
1362 true)) {
1363 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001364
Eric Christopher84fbdb42011-08-19 00:30:14 +00001365 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001366 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001367 }
1368
1369 if (types::isCXX(InputType)) {
1370 bool CXXExceptionsEnabled = ExceptionsEnabled;
1371
Eric Christopher84fbdb42011-08-19 00:30:14 +00001372 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1373 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001374 options::OPT_fexceptions,
1375 options::OPT_fno_exceptions)) {
1376 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1377 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001378 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001379 CXXExceptionsEnabled = false;
1380 }
1381
1382 if (CXXExceptionsEnabled) {
1383 CmdArgs.push_back("-fcxx-exceptions");
1384
1385 ShouldUseExceptionTables = true;
1386 }
1387 }
1388
1389 if (ShouldUseExceptionTables)
1390 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001391}
1392
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001393static bool ShouldDisableCFI(const ArgList &Args,
1394 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001395 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001396 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001397 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001398 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001399 Default = Args.hasFlag(options::OPT_integrated_as,
1400 options::OPT_no_integrated_as,
1401 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001402 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001403 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1404 options::OPT_fno_dwarf2_cfi_asm,
1405 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001406}
1407
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001408static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1409 const ToolChain &TC) {
1410 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1411 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1412 options::OPT_no_integrated_as,
1413 IsIADefault);
1414 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1415 options::OPT_fno_dwarf_directory_asm,
1416 UseIntegratedAs);
1417 return !UseDwarfDirectory;
1418}
1419
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001420/// \brief Check whether the given input tree contains any compilation actions.
1421static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001422 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001423 return true;
1424
1425 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1426 if (ContainsCompileAction(*it))
1427 return true;
1428
1429 return false;
1430}
1431
1432/// \brief Check if -relax-all should be passed to the internal assembler.
1433/// This is done by default when compiling non-assembler source with -O0.
1434static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1435 bool RelaxDefault = true;
1436
1437 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1438 RelaxDefault = A->getOption().matches(options::OPT_O0);
1439
1440 if (RelaxDefault) {
1441 RelaxDefault = false;
1442 for (ActionList::const_iterator it = C.getActions().begin(),
1443 ie = C.getActions().end(); it != ie; ++it) {
1444 if (ContainsCompileAction(*it)) {
1445 RelaxDefault = true;
1446 break;
1447 }
1448 }
1449 }
1450
1451 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1452 RelaxDefault);
1453}
1454
Richard Smith52be6192012-11-05 22:04:41 +00001455namespace {
1456struct SanitizerArgs {
1457 /// Assign ordinals to sanitizer flags. We'll use the ordinal values as
1458 /// bit positions within \c Kind.
1459 enum SanitizeOrdinal {
1460#define SANITIZER(NAME, ID) SO_##ID,
1461#include "clang/Basic/Sanitizers.def"
1462 SO_Count
1463 };
1464
1465 /// Bugs to catch at runtime.
1466 enum SanitizeKind {
1467#define SANITIZER(NAME, ID) ID = 1 << SO_##ID,
1468#define SANITIZER_GROUP(NAME, ID, ALIAS) ID = ALIAS,
1469#include "clang/Basic/Sanitizers.def"
1470
1471 NeedsAsanRt = Address,
1472 NeedsTsanRt = Thread,
1473 NeedsUbsanRt = Undefined
1474 };
1475 unsigned Kind;
1476
1477 SanitizerArgs() : Kind(0) {}
1478
1479 bool needsAsanRt() const { return Kind & NeedsAsanRt; }
1480 bool needsTsanRt() const { return Kind & NeedsTsanRt; }
1481 bool needsUbsanRt() const { return Kind & NeedsUbsanRt; }
1482
1483 /// Parse a single value from a -fsanitize= or -fno-sanitize= value list.
1484 /// Returns a member of the \c SanitizeKind enumeration, or \c 0 if \p Value
1485 /// is not known.
1486 static unsigned parse(const char *Value) {
1487 return llvm::StringSwitch<SanitizeKind>(Value)
1488#define SANITIZER(NAME, ID) .Case(NAME, ID)
1489#define SANITIZER_GROUP(NAME, ID, ALIAS) .Case(NAME, ID)
1490#include "clang/Basic/Sanitizers.def"
1491 .Default(SanitizeKind());
1492 }
1493
1494 /// Parse a -fsanitize= or -fno-sanitize= argument's values, diagnosing any
1495 /// invalid components.
1496 static unsigned parse(const Driver &D, const Arg *A) {
1497 unsigned Kind = 0;
1498 for (unsigned I = 0, N = A->getNumValues(); I != N; ++I) {
1499 if (unsigned K = parse(A->getValue(I)))
1500 Kind |= K;
1501 else
1502 D.Diag(diag::err_drv_unsupported_option_argument)
1503 << A->getOption().getName() << A->getValue(I);
1504 }
1505 return Kind;
1506 }
1507
1508 void addArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
Richard Smith52be6192012-11-05 22:04:41 +00001509 if (!Kind)
1510 return;
1511 llvm::SmallString<256> SanitizeOpt("-fsanitize=");
1512#define SANITIZER(NAME, ID) \
1513 if (Kind & ID) \
1514 SanitizeOpt += NAME ",";
1515#include "clang/Basic/Sanitizers.def"
1516 SanitizeOpt.pop_back();
1517 CmdArgs.push_back(Args.MakeArgString(SanitizeOpt));
1518 }
1519};
1520}
1521
1522/// Produce an argument string from argument \p A, which shows how it provides a
1523/// value in \p Mask. For instance, the argument "-fsanitize=address,alignment"
1524/// with mask \c NeedsUbsanRt would produce "-fsanitize=alignment".
1525static std::string describeSanitizeArg(const Arg *A, unsigned Mask) {
1526 if (!A->getOption().matches(options::OPT_fsanitize_EQ))
1527 return A->getOption().getName();
1528
1529 for (unsigned I = 0, N = A->getNumValues(); I != N; ++I)
1530 if (SanitizerArgs::parse(A->getValue(I)) & Mask)
1531 return std::string("-fsanitize=") + A->getValue(I);
1532
1533 llvm_unreachable("arg didn't provide expected value");
1534}
1535
1536/// Parse the sanitizer arguments from an argument list.
1537static SanitizerArgs getSanitizerArgs(const Driver &D, const ArgList &Args) {
1538 SanitizerArgs Sanitize;
1539
1540 const Arg *AsanArg, *TsanArg, *UbsanArg;
1541
1542 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
1543 unsigned Add = 0, Remove = 0;
1544 if ((*I)->getOption().matches(options::OPT_faddress_sanitizer))
1545 Add = SanitizerArgs::Address;
1546 else if ((*I)->getOption().matches(options::OPT_fno_address_sanitizer))
1547 Remove = SanitizerArgs::Address;
1548 else if ((*I)->getOption().matches(options::OPT_fthread_sanitizer))
1549 Add = SanitizerArgs::Thread;
1550 else if ((*I)->getOption().matches(options::OPT_fno_thread_sanitizer))
1551 Remove = SanitizerArgs::Thread;
1552 else if ((*I)->getOption().matches(options::OPT_fcatch_undefined_behavior))
1553 Add = SanitizerArgs::Undefined;
1554 else if ((*I)->getOption().matches(options::OPT_fsanitize_EQ))
1555 Add = SanitizerArgs::parse(D, *I);
1556 else if ((*I)->getOption().matches(options::OPT_fno_sanitize_EQ))
1557 Remove = SanitizerArgs::parse(D, *I);
1558 else
1559 continue;
1560
1561 (*I)->claim();
1562
1563 Sanitize.Kind |= Add;
1564 Sanitize.Kind &= ~Remove;
1565
1566 if (Add & SanitizerArgs::NeedsAsanRt) AsanArg = *I;
1567 if (Add & SanitizerArgs::NeedsTsanRt) TsanArg = *I;
1568 if (Add & SanitizerArgs::NeedsUbsanRt) UbsanArg = *I;
1569 }
1570
1571 // Only one runtime library can be used at once.
1572 // FIXME: Allow Ubsan to be combined with the other two.
1573 bool NeedsAsan = Sanitize.needsAsanRt();
1574 bool NeedsTsan = Sanitize.needsTsanRt();
1575 bool NeedsUbsan = Sanitize.needsUbsanRt();
1576 if (NeedsAsan + NeedsTsan + NeedsUbsan > 1)
1577 D.Diag(diag::err_drv_argument_not_allowed_with)
1578 << describeSanitizeArg(NeedsAsan ? AsanArg : TsanArg,
1579 NeedsAsan ? SanitizerArgs::NeedsAsanRt
1580 : SanitizerArgs::NeedsTsanRt)
1581 << describeSanitizeArg(NeedsUbsan ? UbsanArg : TsanArg,
1582 NeedsUbsan ? SanitizerArgs::NeedsUbsanRt
1583 : SanitizerArgs::NeedsTsanRt);
1584
1585 return Sanitize;
1586}
1587
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001588/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1589/// This needs to be called before we add the C run-time (malloc, etc).
1590static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001591 ArgStringList &CmdArgs) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001592 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001593 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001594 if (!Args.hasArg(options::OPT_pie))
1595 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001596 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001597
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001598 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1599 llvm::sys::path::append(LibAsan, "lib", "linux",
1600 (Twine("libclang_rt.asan-") +
1601 TC.getArchName() + "-android.so"));
1602 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001603 } else {
1604 if (!Args.hasArg(options::OPT_shared)) {
1605 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1606 // resource directory.
1607 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1608 llvm::sys::path::append(LibAsan, "lib", "linux",
1609 (Twine("libclang_rt.asan-") +
1610 TC.getArchName() + ".a"));
1611 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1612 CmdArgs.push_back("-lpthread");
1613 CmdArgs.push_back("-ldl");
1614 CmdArgs.push_back("-export-dynamic");
1615 }
1616 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001617}
1618
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001619/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1620/// This needs to be called before we add the C run-time (malloc, etc).
1621static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1622 ArgStringList &CmdArgs) {
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001623 if (!Args.hasArg(options::OPT_shared)) {
1624 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1625 // resource directory.
1626 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1627 llvm::sys::path::append(LibTsan, "lib", "linux",
1628 (Twine("libclang_rt.tsan-") +
1629 TC.getArchName() + ".a"));
1630 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1631 CmdArgs.push_back("-lpthread");
1632 CmdArgs.push_back("-ldl");
1633 CmdArgs.push_back("-export-dynamic");
1634 }
1635}
1636
Richard Smithe30752c2012-10-09 19:52:38 +00001637/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1638/// (Linux).
1639static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1640 ArgStringList &CmdArgs) {
Richard Smithe30752c2012-10-09 19:52:38 +00001641 if (!Args.hasArg(options::OPT_shared)) {
1642 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1643 // resource directory.
1644 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1645 llvm::sys::path::append(LibUbsan, "lib", "linux",
1646 (Twine("libclang_rt.ubsan-") +
1647 TC.getArchName() + ".a"));
1648 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
Richard Smith437abed2012-11-02 20:32:19 +00001649 CmdArgs.push_back("-lpthread");
Richard Smithe30752c2012-10-09 19:52:38 +00001650 }
1651}
1652
Rafael Espindola224dd632011-12-14 21:02:23 +00001653static bool shouldUseFramePointer(const ArgList &Args,
1654 const llvm::Triple &Triple) {
1655 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1656 options::OPT_fomit_frame_pointer))
1657 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1658
Rafael Espindola00b29182011-12-14 21:50:24 +00001659 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001660 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1661 Triple.getArch() == llvm::Triple::x86) &&
1662 Triple.getOS() == llvm::Triple::Linux) {
1663 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1664 if (!A->getOption().matches(options::OPT_O0))
1665 return false;
1666 }
1667
1668 return true;
1669}
1670
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001671void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001672 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001673 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001674 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001675 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001676 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1677 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001678 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001679 ArgStringList CmdArgs;
1680
Daniel Dunbare521a892009-03-31 20:53:55 +00001681 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1682
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001683 // Invoke ourselves in -cc1 mode.
1684 //
1685 // FIXME: Implement custom jobs for internal actions.
1686 CmdArgs.push_back("-cc1");
1687
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001688 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001689 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001690 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001691 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001692
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001693 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001694 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001695
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001696 if (isa<AnalyzeJobAction>(JA)) {
1697 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1698 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001699 } else if (isa<MigrateJobAction>(JA)) {
1700 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001701 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001702 if (Output.getType() == types::TY_Dependencies)
1703 CmdArgs.push_back("-Eonly");
1704 else
1705 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001706 } else if (isa<AssembleJobAction>(JA)) {
1707 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001708
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001709 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001710 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001711
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001712 // When using an integrated assembler, translate -Wa, and -Xassembler
1713 // options.
1714 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1715 options::OPT_Xassembler),
1716 ie = Args.filtered_end(); it != ie; ++it) {
1717 const Arg *A = *it;
1718 A->claim();
1719
1720 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001721 StringRef Value = A->getValue(i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001722
1723 if (Value == "-force_cpusubtype_ALL") {
1724 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001725 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001726 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001727 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001728 CmdArgs.push_back("-mllvm");
1729 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001730 } else if (Value == "--noexecstack") {
1731 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001732 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001733 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001734 << A->getOption().getName() << Value;
1735 }
1736 }
1737 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001738
1739 // Also ignore explicit -force_cpusubtype_ALL option.
1740 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001741 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001742 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001743 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001744
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001745 if (JA.getType() == types::TY_Nothing)
1746 CmdArgs.push_back("-fsyntax-only");
1747 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001748 CmdArgs.push_back("-emit-pch");
1749 else
1750 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001751 } else {
1752 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001753
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001754 if (JA.getType() == types::TY_Nothing) {
1755 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001756 } else if (JA.getType() == types::TY_LLVM_IR ||
1757 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001758 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001759 } else if (JA.getType() == types::TY_LLVM_BC ||
1760 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001761 CmdArgs.push_back("-emit-llvm-bc");
1762 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001763 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001764 } else if (JA.getType() == types::TY_AST) {
1765 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001766 } else if (JA.getType() == types::TY_RewrittenObjC) {
1767 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001768 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001769 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1770 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001771 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001772 } else {
1773 assert(JA.getType() == types::TY_PP_Asm &&
1774 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001775 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001776 }
1777
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001778 // The make clang go fast button.
1779 CmdArgs.push_back("-disable-free");
1780
John McCallbb79b5f2010-02-13 03:50:24 +00001781 // Disable the verification pass in -asserts builds.
1782#ifdef NDEBUG
1783 CmdArgs.push_back("-disable-llvm-verifier");
1784#endif
1785
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001786 // Set the main file name, so that debug info works even with
1787 // -save-temps.
1788 CmdArgs.push_back("-main-file-name");
1789 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1790
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001791 // Some flags which affect the language (via preprocessor
1792 // defines). See darwin::CC1::AddCPPArgs.
1793 if (Args.hasArg(options::OPT_static))
1794 CmdArgs.push_back("-static-define");
1795
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001796 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001797 // Enable region store model by default.
1798 CmdArgs.push_back("-analyzer-store=region");
1799
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001800 // Treat blocks as analysis entry points.
1801 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1802
Ted Kremenek49c79792011-03-24 00:28:47 +00001803 CmdArgs.push_back("-analyzer-eagerly-assume");
1804
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001805 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001806 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001807 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001808
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001809 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1810 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001811
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001812 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001813 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001814
1815 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001816
1817 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001818 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1819 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1820 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1821 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1822 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1823 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001824 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001825
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001826 // Set the output format. The default is plist, for (lame) historical
1827 // reasons.
1828 CmdArgs.push_back("-analyzer-output");
1829 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00001830 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001831 else
1832 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001833
Ted Kremenekfe449a22010-03-22 22:32:05 +00001834 // Disable the presentation of standard compiler warnings when
1835 // using --analyze. We only want to show static analyzer diagnostics
1836 // or frontend errors.
1837 CmdArgs.push_back("-w");
1838
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001839 // Add -Xanalyzer arguments when running as analyzer.
1840 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001841 }
1842
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001843 CheckCodeGenerationOptions(D, Args);
1844
Daniel Dunbar44e71222009-04-29 18:32:25 +00001845 // Perform argument translation for LLVM backend. This
1846 // takes some care in reconciling with llvm-gcc. The
1847 // issue is that llvm-gcc translates these options based on
1848 // the values in cc1, whereas we are processing based on
1849 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001850
Daniel Dunbar44e71222009-04-29 18:32:25 +00001851 // This comes from the default translation the driver + cc1
1852 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001853
1854 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1855 options::OPT_fpic, options::OPT_fno_pic,
1856 options::OPT_fPIE, options::OPT_fno_PIE,
1857 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001858 bool PICDisabled = false;
1859 bool PICEnabled = false;
1860 bool PICForPIE = false;
1861 if (LastPICArg) {
1862 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1863 LastPICArg->getOption().matches(options::OPT_fpie));
1864 PICEnabled = (PICForPIE ||
1865 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1866 LastPICArg->getOption().matches(options::OPT_fpic));
1867 PICDisabled = !PICEnabled;
1868 }
1869 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1870 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001871 llvm::Triple Triple(TripleStr);
1872 if ((Args.hasArg(options::OPT_mkernel) ||
1873 Args.hasArg(options::OPT_fapple_kext)) &&
1874 (Triple.getOS() != llvm::Triple::IOS ||
1875 Triple.isOSVersionLT(6)))
Chandler Carruthc0c04552012-04-08 16:40:35 +00001876 PICDisabled = true;
1877 if (Args.hasArg(options::OPT_static))
1878 PICDisabled = true;
1879 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1880
1881 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001882 const char *Model = getToolChain().GetForcedPicModel();
1883 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001884 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001885 Model = "dynamic-no-pic";
1886 else if (PICDisabled)
1887 Model = "static";
1888 else if (PICEnabled)
1889 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001890 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001891 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001892 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001893 StringRef ModelStr = Model ? Model : "";
1894 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001895 CmdArgs.push_back("-mrelocation-model");
1896 CmdArgs.push_back(Model);
1897 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001898
Chandler Carruthc0c04552012-04-08 16:40:35 +00001899 // Infer the __PIC__ and __PIE__ values.
1900 if (ModelStr == "pic" && PICForPIE) {
1901 CmdArgs.push_back("-pie-level");
1902 CmdArgs.push_back((LastPICArg &&
1903 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1904 "2" : "1");
1905 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001906 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001907 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1908 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1909 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001910 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001911
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001912 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1913 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001914 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001915
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001916 // LLVM Code Generator Options.
1917
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001918 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1919 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00001920 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001921 }
1922
Roman Divacky65b88cd2011-03-01 17:40:53 +00001923 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1924 CmdArgs.push_back("-mrtd");
1925
Rafael Espindola224dd632011-12-14 21:02:23 +00001926 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001927 CmdArgs.push_back("-mdisable-fp-elim");
1928 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1929 options::OPT_fno_zero_initialized_in_bss))
1930 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001931 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1932 options::OPT_fno_strict_aliasing,
1933 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001934 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001935 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1936 false))
1937 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001938 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1939 options::OPT_fno_optimize_sibling_calls))
1940 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001941
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001942 // Handle various floating point optimization flags, mapping them to the
1943 // appropriate LLVM code generation flags. The pattern for all of these is to
1944 // default off the codegen optimizations, and if any flag enables them and no
1945 // flag disables them after the flag enabling them, enable the codegen
1946 // optimization. This is complicated by several "umbrella" flags.
1947 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001948 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001949 options::OPT_ffinite_math_only,
1950 options::OPT_fno_finite_math_only,
1951 options::OPT_fhonor_infinities,
1952 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001953 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1954 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001955 A->getOption().getID() != options::OPT_fhonor_infinities)
1956 CmdArgs.push_back("-menable-no-infs");
1957 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001958 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001959 options::OPT_ffinite_math_only,
1960 options::OPT_fno_finite_math_only,
1961 options::OPT_fhonor_nans,
1962 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001963 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1964 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001965 A->getOption().getID() != options::OPT_fhonor_nans)
1966 CmdArgs.push_back("-menable-no-nans");
1967
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001968 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1969 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001970 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001971 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001972 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001973 options::OPT_fno_math_errno))
1974 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1975 if (MathErrno)
1976 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001977
1978 // There are several flags which require disabling very specific
1979 // optimizations. Any of these being disabled forces us to turn off the
1980 // entire set of LLVM optimizations, so collect them through all the flag
1981 // madness.
1982 bool AssociativeMath = false;
1983 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001984 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001985 options::OPT_funsafe_math_optimizations,
1986 options::OPT_fno_unsafe_math_optimizations,
1987 options::OPT_fassociative_math,
1988 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001989 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1990 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001991 A->getOption().getID() != options::OPT_fno_associative_math)
1992 AssociativeMath = true;
1993 bool ReciprocalMath = false;
1994 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001995 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001996 options::OPT_funsafe_math_optimizations,
1997 options::OPT_fno_unsafe_math_optimizations,
1998 options::OPT_freciprocal_math,
1999 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002000 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2001 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002002 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2003 ReciprocalMath = true;
2004 bool SignedZeros = true;
2005 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002006 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002007 options::OPT_funsafe_math_optimizations,
2008 options::OPT_fno_unsafe_math_optimizations,
2009 options::OPT_fsigned_zeros,
2010 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002011 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2012 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002013 A->getOption().getID() != options::OPT_fsigned_zeros)
2014 SignedZeros = false;
2015 bool TrappingMath = true;
2016 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002017 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002018 options::OPT_funsafe_math_optimizations,
2019 options::OPT_fno_unsafe_math_optimizations,
2020 options::OPT_ftrapping_math,
2021 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002022 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2023 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002024 A->getOption().getID() != options::OPT_ftrapping_math)
2025 TrappingMath = false;
2026 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2027 !TrappingMath)
2028 CmdArgs.push_back("-menable-unsafe-fp-math");
2029
Lang Hamesaa53b932012-07-06 00:59:19 +00002030
2031 // Validate and pass through -fp-contract option.
2032 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002033 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002034 options::OPT_ffp_contract)) {
2035 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002036 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002037 if (Val == "fast" || Val == "on" || Val == "off") {
2038 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2039 } else {
2040 D.Diag(diag::err_drv_unsupported_option_argument)
2041 << A->getOption().getName() << Val;
2042 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002043 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002044 // If fast-math is set then set the fp-contract mode to fast.
2045 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2046 }
2047 }
2048
Bob Wilson6a039162012-07-19 03:52:53 +00002049 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2050 // and if we find them, tell the frontend to provide the appropriate
2051 // preprocessor macros. This is distinct from enabling any optimizations as
2052 // these options induce language changes which must survive serialization
2053 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002054 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
2055 if (A->getOption().matches(options::OPT_ffast_math))
2056 CmdArgs.push_back("-ffast-math");
2057 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
2058 if (A->getOption().matches(options::OPT_ffinite_math_only))
2059 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002060
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002061 // Decide whether to use verbose asm. Verbose assembly is the default on
2062 // toolchains which have the integrated assembler on by default.
2063 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
2064 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002065 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002066 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002067 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002068
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002069 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2070 CmdArgs.push_back("-mdebug-pass");
2071 CmdArgs.push_back("Structure");
2072 }
2073 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2074 CmdArgs.push_back("-mdebug-pass");
2075 CmdArgs.push_back("Arguments");
2076 }
2077
John McCall8517abc2010-02-19 02:45:38 +00002078 // Enable -mconstructor-aliases except on darwin, where we have to
2079 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002080 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002081 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002082
John McCall7ef5cb32011-03-18 02:56:14 +00002083 // Darwin's kernel doesn't support guard variables; just die if we
2084 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002085 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002086 CmdArgs.push_back("-fforbid-guard-variables");
2087
Douglas Gregordbe39272011-02-01 15:15:22 +00002088 if (Args.hasArg(options::OPT_mms_bitfields)) {
2089 CmdArgs.push_back("-mms-bitfields");
2090 }
John McCall8517abc2010-02-19 02:45:38 +00002091
Daniel Dunbar306945d2009-09-16 06:17:29 +00002092 // This is a coarse approximation of what llvm-gcc actually does, both
2093 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2094 // complicated ways.
2095 bool AsynchronousUnwindTables =
2096 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2097 options::OPT_fno_asynchronous_unwind_tables,
2098 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002099 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002100 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2101 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002102 CmdArgs.push_back("-munwind-tables");
2103
Rafael Espindola66aa0452012-06-19 01:26:10 +00002104 getToolChain().addClangTargetOptions(CmdArgs);
2105
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002106 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2107 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002108 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002109 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002110
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002111 // FIXME: Handle -mtune=.
2112 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002113
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002114 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002115 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002116 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002117 }
2118
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002119 // Add target specific cpu and features flags.
2120 switch(getToolChain().getTriple().getArch()) {
2121 default:
2122 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002123
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002124 case llvm::Triple::arm:
2125 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002126 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002127 break;
2128
Eric Christopher0b26a612010-03-02 02:41:08 +00002129 case llvm::Triple::mips:
2130 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002131 case llvm::Triple::mips64:
2132 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002133 AddMIPSTargetArgs(Args, CmdArgs);
2134 break;
2135
Hal Finkel8eb59282012-06-11 22:35:19 +00002136 case llvm::Triple::ppc:
2137 case llvm::Triple::ppc64:
2138 AddPPCTargetArgs(Args, CmdArgs);
2139 break;
2140
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002141 case llvm::Triple::sparc:
2142 AddSparcTargetArgs(Args, CmdArgs);
2143 break;
2144
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002145 case llvm::Triple::x86:
2146 case llvm::Triple::x86_64:
2147 AddX86TargetArgs(Args, CmdArgs);
2148 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002149
2150 case llvm::Triple::hexagon:
2151 AddHexagonTargetArgs(Args, CmdArgs);
2152 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002153 }
2154
Tony Linthicum76329bf2011-12-12 21:14:55 +00002155
2156
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002157 // Pass the linker version in use.
2158 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2159 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002160 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002161 }
2162
Nick Lewycky75033772011-02-02 06:43:03 +00002163 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002164 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002165 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002166 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002167 CmdArgs.push_back("-momit-leaf-frame-pointer");
2168
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002169 // Explicitly error on some things we know we don't support and can't just
2170 // ignore.
2171 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002172 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2173 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002174 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002175 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002176 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002177 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2178 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002179 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002180 << Unsupported->getOption().getName();
2181 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002182 }
2183
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002184 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002185 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002186 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002187 CmdArgs.push_back("-header-include-file");
2188 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2189 D.CCPrintHeadersFilename : "-");
2190 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002191 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002192 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002193
Chad Rosierbe10f982011-08-02 17:58:04 +00002194 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002195 CmdArgs.push_back("-diagnostic-log-file");
2196 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2197 D.CCLogDiagnosticsFilename : "-");
2198 }
2199
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002200 // Use the last option from "-g" group. "-gline-tables-only" is
2201 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002202 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002203 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2204 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2205 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002206 } else if (!A->getOption().matches(options::OPT_g0) &&
2207 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002208 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002209 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002210 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002211
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002212 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2213 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002214 if (Args.hasArg(options::OPT_gcolumn_info))
2215 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002216
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002217 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2218 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2219
Chris Lattner3c77a352010-06-22 00:03:40 +00002220 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2221
Nick Lewycky207bce32011-04-21 23:44:07 +00002222 if (Args.hasArg(options::OPT_ftest_coverage) ||
2223 Args.hasArg(options::OPT_coverage))
2224 CmdArgs.push_back("-femit-coverage-notes");
2225 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2226 Args.hasArg(options::OPT_coverage))
2227 CmdArgs.push_back("-femit-coverage-data");
2228
Nick Lewycky480cb992011-05-04 20:46:58 +00002229 if (C.getArgs().hasArg(options::OPT_c) ||
2230 C.getArgs().hasArg(options::OPT_S)) {
2231 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002232 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002233 SmallString<128> absFilename(Output.getFilename());
2234 llvm::sys::fs::make_absolute(absFilename);
2235 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002236 }
2237 }
2238
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002239 // Pass options for controlling the default header search paths.
2240 if (Args.hasArg(options::OPT_nostdinc)) {
2241 CmdArgs.push_back("-nostdsysteminc");
2242 CmdArgs.push_back("-nobuiltininc");
2243 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002244 if (Args.hasArg(options::OPT_nostdlibinc))
2245 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002246 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2247 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2248 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002249
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002250 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002251 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002252 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002253
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002254 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2255
Ted Kremenekf7639e12012-03-06 20:06:33 +00002256 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002257 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002258 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002259 options::OPT_ccc_arcmt_modify,
2260 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002261 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002262 switch (A->getOption().getID()) {
2263 default:
2264 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002265 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002266 CmdArgs.push_back("-arcmt-check");
2267 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002268 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002269 CmdArgs.push_back("-arcmt-modify");
2270 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002271 case options::OPT_ccc_arcmt_migrate:
2272 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002273 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002274 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002275
2276 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2277 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002278 break;
John McCalld70fb982011-06-15 23:25:17 +00002279 }
2280 }
2281 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002282
Ted Kremenekf7639e12012-03-06 20:06:33 +00002283 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2284 if (ARCMTEnabled) {
2285 D.Diag(diag::err_drv_argument_not_allowed_with)
2286 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2287 }
2288 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00002289 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00002290
2291 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2292 options::OPT_objcmt_migrate_subscripting)) {
2293 // None specified, means enable them all.
2294 CmdArgs.push_back("-objcmt-migrate-literals");
2295 CmdArgs.push_back("-objcmt-migrate-subscripting");
2296 } else {
2297 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2298 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2299 }
2300 }
2301
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002302 // Add preprocessing options like -I, -D, etc. if we are using the
2303 // preprocessor.
2304 //
2305 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002306 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002307 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002308
Rafael Espindolaa7431922011-07-21 23:40:37 +00002309 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2310 // that "The compiler can only warn and ignore the option if not recognized".
2311 // When building with ccache, it will pass -D options to clang even on
2312 // preprocessed inputs and configure concludes that -fPIC is not supported.
2313 Args.ClaimAllArgs(options::OPT_D);
2314
Daniel Dunbar58f78332009-09-17 06:53:36 +00002315 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002316 // others.
2317 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002318 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002319 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002320 else if (A->getOption().matches(options::OPT_O) &&
Richard Smithbd55daf2012-11-01 04:30:05 +00002321 A->getValue()[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002322 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002323 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002324 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002325 }
2326
Daniel Dunbar945577c2009-10-29 02:24:45 +00002327 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002328 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2329 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002330 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002331 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002332
2333 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2334 // (-ansi is equivalent to -std=c89).
2335 //
2336 // If a std is supplied, only add -trigraphs if it follows the
2337 // option.
2338 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2339 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002340 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002341 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002342 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002343 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002344 else
2345 Std->render(Args, CmdArgs);
2346
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002347 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2348 options::OPT_trigraphs))
2349 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002350 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002351 } else {
2352 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002353 //
2354 // FIXME: Clang doesn't correctly handle -std= when the input language
2355 // doesn't match. For the time being just ignore this for C++ inputs;
2356 // eventually we want to do all the standard defaulting here instead of
2357 // splitting it between the driver and clang -cc1.
2358 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002359 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2360 "-std=", /*Joined=*/true);
2361 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2362 CmdArgs.push_back("-std=c++11");
2363
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002364 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002365 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002366
Chandler Carruthb009b142011-04-23 06:30:43 +00002367 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2368 // '-fconst-strings'; this better indicates its actual behavior.
2369 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2370 false)) {
2371 // For perfect compatibility with GCC, we do this even in the presence of
2372 // '-w'. This flag names something other than a warning for GCC.
2373 CmdArgs.push_back("-fconst-strings");
2374 }
2375
Chandler Carruth61fbf622011-04-23 09:27:53 +00002376 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002377 // during C++ compilation, which it is by default. GCC keeps this define even
2378 // in the presence of '-w', match this behavior bug-for-bug.
2379 if (types::isCXX(InputType) &&
2380 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2381 true)) {
2382 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002383 }
2384
Chandler Carruthe0391482010-05-22 02:21:53 +00002385 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2386 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2387 if (Asm->getOption().matches(options::OPT_fasm))
2388 CmdArgs.push_back("-fgnu-keywords");
2389 else
2390 CmdArgs.push_back("-fno-gnu-keywords");
2391 }
2392
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002393 if (ShouldDisableCFI(Args, getToolChain()))
2394 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002395
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002396 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2397 CmdArgs.push_back("-fno-dwarf-directory-asm");
2398
Nick Lewyckyba743b72011-10-21 02:32:14 +00002399 if (const char *pwd = ::getenv("PWD")) {
2400 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2401 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002402 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002403 std::string CompDir = pwd;
2404 CmdArgs.push_back("-fdebug-compilation-dir");
2405 CmdArgs.push_back(Args.MakeArgString(CompDir));
2406 }
2407 }
2408
Richard Smith9a568822011-11-21 19:36:32 +00002409 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2410 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002411 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002412 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002413 }
2414
Richard Smith9a568822011-11-21 19:36:32 +00002415 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2416 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00002417 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00002418 }
2419
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002420 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2421 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002422 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002423 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002424 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2425 } else
2426 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002427 }
2428
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002429 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2430 options::OPT_fbounds_checking_EQ)) {
2431 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002432 StringRef val = A->getValue();
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002433 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2434 } else
2435 CmdArgs.push_back("-fbounds-checking=1");
2436 }
2437
Michael J. Spencer929fccd2012-10-22 22:13:48 +00002438 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002439 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002440
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002441 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2442 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00002443 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002444 }
David Chisnall5778fce2009-08-31 16:41:57 +00002445
Chris Lattnere23003d2010-01-09 21:54:33 +00002446 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2447 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00002448 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00002449 }
2450
Chris Lattnerb35583d2010-04-07 20:49:23 +00002451 CmdArgs.push_back("-ferror-limit");
2452 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00002453 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00002454 else
2455 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002456
Chandler Carrutha77a7272010-05-06 04:55:18 +00002457 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2458 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002459 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002460 }
2461
2462 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2463 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002464 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00002465 }
2466
Richard Smithf6f003a2011-12-16 19:06:07 +00002467 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2468 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00002469 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00002470 }
2471
Daniel Dunbar2c978472009-11-04 06:24:47 +00002472 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002473 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002474 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002475 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00002476 } else {
2477 // If -fmessage-length=N was not specified, determine whether this is a
2478 // terminal and, if so, implicitly define -fmessage-length appropriately.
2479 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002480 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002481 }
2482
Daniel Dunbare357d562009-12-03 18:42:11 +00002483 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2484 CmdArgs.push_back("-fvisibility");
Richard Smithbd55daf2012-11-01 04:30:05 +00002485 CmdArgs.push_back(A->getValue());
Daniel Dunbare357d562009-12-03 18:42:11 +00002486 }
2487
Douglas Gregor08329632010-06-15 17:05:35 +00002488 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002489
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002490 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2491
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002492 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002493 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2494 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002495 CmdArgs.push_back("-ffreestanding");
2496
Daniel Dunbare357d562009-12-03 18:42:11 +00002497 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002498 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002499 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002500 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002501 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002502 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002503 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002504 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2505 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002506
Richard Smith52be6192012-11-05 22:04:41 +00002507 SanitizerArgs Sanitize = getSanitizerArgs(D, Args);
2508 Sanitize.addArgs(Args, CmdArgs);
2509
Chad Rosier864dfe12012-03-13 23:45:51 +00002510 // Report and error for -faltivec on anything other then PowerPC.
2511 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2512 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2513 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2514 D.Diag(diag::err_drv_argument_only_allowed_with)
2515 << A->getAsString(Args) << "ppc/ppc64";
2516
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002517 if (getToolChain().SupportsProfiling())
2518 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002519
2520 // -flax-vector-conversions is default.
2521 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2522 options::OPT_fno_lax_vector_conversions))
2523 CmdArgs.push_back("-fno-lax-vector-conversions");
2524
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002525 if (Args.getLastArg(options::OPT_fapple_kext))
2526 CmdArgs.push_back("-fapple-kext");
2527
David Blaikie690f21e2012-06-14 18:55:27 +00002528 if (Args.hasFlag(options::OPT_frewrite_includes,
2529 options::OPT_fno_rewrite_includes, false))
2530 CmdArgs.push_back("-frewrite-includes");
2531
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002532 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002533 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002534 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002535 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2536 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002537
2538 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2539 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00002540 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00002541 }
2542
Bob Wilson14adb362012-02-03 06:27:22 +00002543 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002544
Chandler Carruth6e501032011-03-27 00:04:55 +00002545 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2546 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2547 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2548 options::OPT_fno_wrapv)) {
2549 if (A->getOption().matches(options::OPT_fwrapv))
2550 CmdArgs.push_back("-fwrapv");
2551 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2552 options::OPT_fno_strict_overflow)) {
2553 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2554 CmdArgs.push_back("-fwrapv");
2555 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002556 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002557 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002558
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002559 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2560
Mahesha S6a682be42012-10-27 07:47:56 +00002561
Daniel Dunbar4930e332009-11-17 08:07:36 +00002562 // -stack-protector=0 is default.
2563 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002564 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2565 options::OPT_fstack_protector_all,
2566 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002567 if (A->getOption().matches(options::OPT_fstack_protector))
2568 StackProtectorLevel = 1;
2569 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2570 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002571 } else {
2572 StackProtectorLevel =
2573 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2574 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002575 if (StackProtectorLevel) {
2576 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002577 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002578 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002579
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002580 // --param ssp-buffer-size=
2581 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2582 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002583 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002584 if (Str.startswith("ssp-buffer-size=")) {
2585 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002586 CmdArgs.push_back("-stack-protector-buffer-size");
2587 // FIXME: Verify the argument is a valid integer.
2588 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002589 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002590 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002591 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002592 }
2593
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002594 // Translate -mstackrealign
2595 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2596 false)) {
2597 CmdArgs.push_back("-backend-option");
2598 CmdArgs.push_back("-force-align-stack");
2599 }
2600 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2601 false)) {
2602 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2603 }
2604
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002605 if (Args.hasArg(options::OPT_mstack_alignment)) {
2606 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2607 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002608 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002609
Daniel Dunbard18049a2009-04-07 21:16:11 +00002610 // Forward -f options with positive and negative forms; we translate
2611 // these by hand.
2612
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002613 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002614 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002615 CmdArgs.push_back("-fapple-kext");
2616 if (!Args.hasArg(options::OPT_fbuiltin))
2617 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002618 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002619 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002620 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002621 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002622 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002623
Nuno Lopes13c88c72009-12-16 16:59:22 +00002624 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2625 options::OPT_fno_assume_sane_operator_new))
2626 CmdArgs.push_back("-fno-assume-sane-operator-new");
2627
Daniel Dunbar4930e332009-11-17 08:07:36 +00002628 // -fblocks=0 is default.
2629 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002630 getToolChain().IsBlocksDefault()) ||
2631 (Args.hasArg(options::OPT_fgnu_runtime) &&
2632 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2633 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002634 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002635
2636 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2637 !getToolChain().hasBlocksRuntime())
2638 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002639 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002640
Douglas Gregor226173a2012-01-18 15:19:58 +00002641 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2642 // users must also pass -fcxx-modules. The latter flag will disappear once the
2643 // modules implementation is solid for C++/Objective-C++ programs as well.
2644 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2645 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2646 options::OPT_fno_cxx_modules,
2647 false);
2648 if (AllowedInCXX || !types::isCXX(InputType))
2649 CmdArgs.push_back("-fmodules");
2650 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002651
John McCalldfea9982010-04-09 19:12:06 +00002652 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002653 if (Args.hasFlag(options::OPT_fno_access_control,
2654 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002655 false))
John McCall3155f572010-04-09 19:03:51 +00002656 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002657
Anders Carlssond470fef2010-11-21 00:09:52 +00002658 // -felide-constructors is the default.
2659 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2660 options::OPT_felide_constructors,
2661 false))
2662 CmdArgs.push_back("-fno-elide-constructors");
2663
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002664 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002665 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00002666 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00002667 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002668
Richard Smith52be6192012-11-05 22:04:41 +00002669 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
2670 if (Sanitize.Kind & SanitizerArgs::Vptr) {
2671 llvm::StringRef NoRttiArg =
2672 Args.getLastArg(options::OPT_mkernel,
2673 options::OPT_fapple_kext,
2674 options::OPT_fno_rtti)->getOption().getName();
2675 D.Diag(diag::err_drv_argument_not_allowed_with)
2676 << "-fsanitize=vptr" << NoRttiArg;
2677 }
2678 }
2679
Tony Linthicum76329bf2011-12-12 21:14:55 +00002680 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002681 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002682 options::OPT_fno_short_enums,
2683 getToolChain().getTriple().getArch() ==
2684 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002685 CmdArgs.push_back("-fshort-enums");
2686
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002687 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002688 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002689 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002690 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002691
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002692 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002693 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002694 options::OPT_fno_threadsafe_statics))
2695 CmdArgs.push_back("-fno-threadsafe-statics");
2696
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002697 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002698 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2699 options::OPT_fno_use_cxa_atexit,
2700 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002701 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002702 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2703 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002704 CmdArgs.push_back("-fno-use-cxa-atexit");
2705
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002706 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002707 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002708 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2709 CmdArgs.push_back("-fms-extensions");
2710
Chad Rosiered943242012-07-20 21:20:33 +00002711 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002712 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2713 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002714
Francois Pichet1b4f1632011-09-17 04:32:15 +00002715 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002716 if (Args.hasFlag(options::OPT_fms_compatibility,
2717 options::OPT_fno_ms_compatibility,
2718 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2719 Args.hasFlag(options::OPT_fms_extensions,
2720 options::OPT_fno_ms_extensions,
2721 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002722 CmdArgs.push_back("-fms-compatibility");
2723
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002724 // -fmsc-version=1300 is default.
2725 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2726 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2727 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002728 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002729 if (msc_ver.empty())
2730 CmdArgs.push_back("-fmsc-version=1300");
2731 else
2732 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2733 }
2734
2735
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002736 // -fborland-extensions=0 is default.
2737 if (Args.hasFlag(options::OPT_fborland_extensions,
2738 options::OPT_fno_borland_extensions, false))
2739 CmdArgs.push_back("-fborland-extensions");
2740
Francois Pichet02744872011-09-01 16:38:08 +00002741 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2742 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002743 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2744 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002745 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002746 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002747
Chandler Carruthe03aa552010-04-17 20:17:31 +00002748 // -fgnu-keywords default varies depending on language; only pass if
2749 // specified.
2750 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002751 options::OPT_fno_gnu_keywords))
2752 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002753
Rafael Espindola922a6242011-06-02 17:30:53 +00002754 if (Args.hasFlag(options::OPT_fgnu89_inline,
2755 options::OPT_fno_gnu89_inline,
2756 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002757 CmdArgs.push_back("-fgnu89-inline");
2758
Chad Rosier9c76d242012-03-15 22:31:42 +00002759 if (Args.hasArg(options::OPT_fno_inline))
2760 CmdArgs.push_back("-fno-inline");
2761
Chad Rosier64d6be92012-03-06 21:17:19 +00002762 if (Args.hasArg(options::OPT_fno_inline_functions))
2763 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002764
John McCall5fb5df92012-06-20 06:18:46 +00002765 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002766
John McCall5fb5df92012-06-20 06:18:46 +00002767 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2768 // legacy is the default.
2769 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002770 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2771 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002772 objcRuntime.isLegacyDispatchDefaultForArch(
2773 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002774 if (getToolChain().UseObjCMixedDispatch())
2775 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2776 else
2777 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2778 }
2779 }
2780
Nico Weber97bd94b2012-03-09 21:19:44 +00002781 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2782 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002783 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002784 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2785 }
2786
John McCall24fc0de2011-07-06 00:26:06 +00002787 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2788 // NOTE: This logic is duplicated in ToolChains.cpp.
2789 bool ARC = isObjCAutoRefCount(Args);
2790 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002791 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002792
John McCall24fc0de2011-07-06 00:26:06 +00002793 CmdArgs.push_back("-fobjc-arc");
2794
Chandler Carruth491db322011-11-04 07:34:47 +00002795 // FIXME: It seems like this entire block, and several around it should be
2796 // wrapped in isObjC, but for now we just use it here as this is where it
2797 // was being used previously.
2798 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2799 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2800 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2801 else
2802 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2803 }
2804
John McCall24fc0de2011-07-06 00:26:06 +00002805 // Allow the user to enable full exceptions code emission.
2806 // We define off for Objective-CC, on for Objective-C++.
2807 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2808 options::OPT_fno_objc_arc_exceptions,
2809 /*default*/ types::isCXX(InputType)))
2810 CmdArgs.push_back("-fobjc-arc-exceptions");
2811 }
2812
2813 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2814 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002815 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002816 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002817
John McCall24fc0de2011-07-06 00:26:06 +00002818 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2819 // takes precedence.
2820 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2821 if (!GCArg)
2822 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2823 if (GCArg) {
2824 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002825 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002826 << GCArg->getAsString(Args);
2827 } else if (getToolChain().SupportsObjCGC()) {
2828 GCArg->render(Args, CmdArgs);
2829 } else {
2830 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002831 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002832 << GCArg->getAsString(Args);
2833 }
2834 }
2835
John McCallb5f652e2011-06-22 00:53:57 +00002836 // Add exception args.
2837 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002838 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002839
2840 if (getToolChain().UseSjLjExceptions())
2841 CmdArgs.push_back("-fsjlj-exceptions");
2842
2843 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002844 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2845 options::OPT_fno_assume_sane_operator_new))
2846 CmdArgs.push_back("-fno-assume-sane-operator-new");
2847
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002848 // -fconstant-cfstrings is default, and may be subject to argument translation
2849 // on Darwin.
2850 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2851 options::OPT_fno_constant_cfstrings) ||
2852 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2853 options::OPT_mno_constant_cfstrings))
2854 CmdArgs.push_back("-fno-constant-cfstrings");
2855
John Thompsoned4e2952009-11-05 20:14:16 +00002856 // -fshort-wchar default varies depending on platform; only
2857 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002858 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2859 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002860
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002861 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2862 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002863 //
2864 // FIXME: This is gross; that translation should be pulled from the
2865 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002866 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002867 options::OPT_fno_pascal_strings,
2868 false) ||
2869 Args.hasFlag(options::OPT_mpascal_strings,
2870 options::OPT_mno_pascal_strings,
2871 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002872 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002873
Daniel Dunbar096ed292011-10-05 21:04:55 +00002874 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2875 // -fno-pack-struct doesn't apply to -fpack-struct=.
2876 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002877 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00002878 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00002879 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002880 } else if (Args.hasFlag(options::OPT_fpack_struct,
2881 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002882 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002883 }
2884
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002885 if (Args.hasArg(options::OPT_mkernel) ||
2886 Args.hasArg(options::OPT_fapple_kext)) {
2887 if (!Args.hasArg(options::OPT_fcommon))
2888 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002889 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002890 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002891
Daniel Dunbard18049a2009-04-07 21:16:11 +00002892 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002893 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002894 CmdArgs.push_back("-fno-common");
2895
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002896 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002897 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002898 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002899 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002900 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002901 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2902
Daniel Dunbar6358d682010-10-15 22:30:42 +00002903 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2904 if (!Args.hasFlag(options::OPT_ffor_scope,
2905 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002906 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002907 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2908
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002909 // -fcaret-diagnostics is default.
2910 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2911 options::OPT_fno_caret_diagnostics, true))
2912 CmdArgs.push_back("-fno-caret-diagnostics");
2913
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002914 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002915 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002916 options::OPT_fno_diagnostics_fixit_info))
2917 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002918
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002919 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002920 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002921 options::OPT_fno_diagnostics_show_option))
2922 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002923
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002924 if (const Arg *A =
2925 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2926 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00002927 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002928 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002929
Douglas Gregor643c9222011-05-21 17:07:29 +00002930 if (const Arg *A =
2931 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2932 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00002933 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00002934 }
2935
Chandler Carruthb6766f02011-03-27 01:50:55 +00002936 if (Arg *A = Args.getLastArg(
2937 options::OPT_fdiagnostics_show_note_include_stack,
2938 options::OPT_fno_diagnostics_show_note_include_stack)) {
2939 if (A->getOption().matches(
2940 options::OPT_fdiagnostics_show_note_include_stack))
2941 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2942 else
2943 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2944 }
2945
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002946 // Color diagnostics are the default, unless the terminal doesn't support
2947 // them.
2948 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002949 options::OPT_fno_color_diagnostics,
2950 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002951 CmdArgs.push_back("-fcolor-diagnostics");
2952
Daniel Dunbardb097022009-06-08 21:13:54 +00002953 if (!Args.hasFlag(options::OPT_fshow_source_location,
2954 options::OPT_fno_show_source_location))
2955 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002956
Douglas Gregor643c9222011-05-21 17:07:29 +00002957 if (!Args.hasFlag(options::OPT_fshow_column,
2958 options::OPT_fno_show_column,
2959 true))
2960 CmdArgs.push_back("-fno-show-column");
2961
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002962 if (!Args.hasFlag(options::OPT_fspell_checking,
2963 options::OPT_fno_spell_checking))
2964 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002965
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002966
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002967 // Silently ignore -fasm-blocks for now.
2968 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2969 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002970
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002971 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2972 A->render(Args, CmdArgs);
2973
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002974 // -fdollars-in-identifiers default varies depending on platform and
2975 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002976 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002977 options::OPT_fno_dollars_in_identifiers)) {
2978 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002979 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002980 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002981 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002982 }
2983
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002984 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2985 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002986 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002987 options::OPT_fno_unit_at_a_time)) {
2988 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002989 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002990 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002991
Eli Friedman055c9702011-11-02 01:53:16 +00002992 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2993 options::OPT_fno_apple_pragma_pack, false))
2994 CmdArgs.push_back("-fapple-pragma-pack");
2995
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002996 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002997 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002998 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002999#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00003000 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003001 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3002 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
3003 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3004 CmdArgs.push_back("-fno-builtin-strcat");
3005 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3006 CmdArgs.push_back("-fno-builtin-strcpy");
3007 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00003008#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003009
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003010 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00003011 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003012 options::OPT_traditional_cpp)) {
3013 if (isa<PreprocessJobAction>(JA))
3014 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003015 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003016 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00003017 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00003018
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003019 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00003020 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003021
3022 // Handle serialized diagnostics.
3023 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
3024 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00003025 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00003026 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003027
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00003028 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
3029 CmdArgs.push_back("-fretain-comments-from-system-headers");
3030
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003031 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
3032 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003033 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003034 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
3035 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003036 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00003037
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003038 // We translate this by hand to the -cc1 argument, since nightly test uses
3039 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00003040 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003041 CmdArgs.push_back("-disable-llvm-optzns");
3042 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00003043 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00003044 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003045
Daniel Dunbard67a3222009-03-30 06:36:42 +00003046 if (Output.getType() == types::TY_Dependencies) {
3047 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003048 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003049 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003050 CmdArgs.push_back(Output.getFilename());
3051 } else {
3052 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003053 }
3054
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003055 for (InputInfoList::const_iterator
3056 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3057 const InputInfo &II = *it;
3058 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00003059 if (Args.hasArg(options::OPT_rewrite_objc))
3060 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3061 else
3062 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00003063 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003064 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003065 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003066 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003067 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003068
Chris Lattnere9d7d782009-11-03 19:50:27 +00003069 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3070
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003071 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003072
3073 // Optionally embed the -cc1 level arguments into the debug info, for build
3074 // analysis.
3075 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003076 ArgStringList OriginalArgs;
3077 for (ArgList::const_iterator it = Args.begin(),
3078 ie = Args.end(); it != ie; ++it)
3079 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003080
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003081 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003082 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003083 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003084 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00003085 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00003086 }
3087 CmdArgs.push_back("-dwarf-debug-flags");
3088 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3089 }
3090
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003091 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00003092
Roman Divacky178e01602011-02-10 16:52:03 +00003093 if (Arg *A = Args.getLastArg(options::OPT_pg))
3094 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003095 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00003096 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003097
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003098 // Claim some arguments which clang supports automatically.
3099
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00003100 // -fpch-preprocess is used with gcc to add a special marker in the output to
3101 // include the PCH file. Clang's PTH solution is completely transparent, so we
3102 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00003103 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003104
Daniel Dunbar17731772009-03-23 19:03:36 +00003105 // Claim some arguments which clang doesn't support, but we don't
3106 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003107 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
3108 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00003109
Rafael Espindolad95a8122011-03-01 05:25:27 +00003110 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00003111 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003112 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003113}
3114
Jim Grosbach576452b2012-02-10 20:37:10 +00003115void ClangAs::AddARMTargetArgs(const ArgList &Args,
3116 ArgStringList &CmdArgs) const {
3117 const Driver &D = getToolChain().getDriver();
3118 llvm::Triple Triple = getToolChain().getTriple();
3119
3120 // Set the CPU based on -march= and -mcpu=.
3121 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00003122 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00003123
3124 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00003125 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00003126 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00003127
3128 // Honor -mfpmath=.
3129 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00003130 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00003131}
3132
John McCall5fb5df92012-06-20 06:18:46 +00003133/// Add options related to the Objective-C runtime/ABI.
3134///
3135/// Returns true if the runtime is non-fragile.
3136ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
3137 ArgStringList &cmdArgs,
3138 RewriteKind rewriteKind) const {
3139 // Look for the controlling runtime option.
3140 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
3141 options::OPT_fgnu_runtime,
3142 options::OPT_fobjc_runtime_EQ);
3143
3144 // Just forward -fobjc-runtime= to the frontend. This supercedes
3145 // options about fragility.
3146 if (runtimeArg &&
3147 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
3148 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00003149 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003150 if (runtime.tryParse(value)) {
3151 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
3152 << value;
3153 }
3154
3155 runtimeArg->render(args, cmdArgs);
3156 return runtime;
3157 }
3158
3159 // Otherwise, we'll need the ABI "version". Version numbers are
3160 // slightly confusing for historical reasons:
3161 // 1 - Traditional "fragile" ABI
3162 // 2 - Non-fragile ABI, version 1
3163 // 3 - Non-fragile ABI, version 2
3164 unsigned objcABIVersion = 1;
3165 // If -fobjc-abi-version= is present, use that to set the version.
3166 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003167 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003168 if (value == "1")
3169 objcABIVersion = 1;
3170 else if (value == "2")
3171 objcABIVersion = 2;
3172 else if (value == "3")
3173 objcABIVersion = 3;
3174 else
3175 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3176 << value;
3177 } else {
3178 // Otherwise, determine if we are using the non-fragile ABI.
3179 bool nonFragileABIIsDefault =
3180 (rewriteKind == RK_NonFragile ||
3181 (rewriteKind == RK_None &&
3182 getToolChain().IsObjCNonFragileABIDefault()));
3183 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3184 options::OPT_fno_objc_nonfragile_abi,
3185 nonFragileABIIsDefault)) {
3186 // Determine the non-fragile ABI version to use.
3187#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3188 unsigned nonFragileABIVersion = 1;
3189#else
3190 unsigned nonFragileABIVersion = 2;
3191#endif
3192
3193 if (Arg *abiArg = args.getLastArg(
3194 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003195 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00003196 if (value == "1")
3197 nonFragileABIVersion = 1;
3198 else if (value == "2")
3199 nonFragileABIVersion = 2;
3200 else
3201 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3202 << value;
3203 }
3204
3205 objcABIVersion = 1 + nonFragileABIVersion;
3206 } else {
3207 objcABIVersion = 1;
3208 }
3209 }
3210
3211 // We don't actually care about the ABI version other than whether
3212 // it's non-fragile.
3213 bool isNonFragile = objcABIVersion != 1;
3214
3215 // If we have no runtime argument, ask the toolchain for its default runtime.
3216 // However, the rewriter only really supports the Mac runtime, so assume that.
3217 ObjCRuntime runtime;
3218 if (!runtimeArg) {
3219 switch (rewriteKind) {
3220 case RK_None:
3221 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3222 break;
3223 case RK_Fragile:
3224 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3225 break;
3226 case RK_NonFragile:
3227 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3228 break;
3229 }
3230
3231 // -fnext-runtime
3232 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3233 // On Darwin, make this use the default behavior for the toolchain.
3234 if (getToolChain().getTriple().isOSDarwin()) {
3235 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3236
3237 // Otherwise, build for a generic macosx port.
3238 } else {
3239 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3240 }
3241
3242 // -fgnu-runtime
3243 } else {
3244 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003245 // Legacy behaviour is to target the gnustep runtime if we are i
3246 // non-fragile mode or the GCC runtime in fragile mode.
3247 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003248 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003249 else
3250 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003251 }
3252
3253 cmdArgs.push_back(args.MakeArgString(
3254 "-fobjc-runtime=" + runtime.getAsString()));
3255 return runtime;
3256}
3257
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003258void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003259 const InputInfo &Output,
3260 const InputInfoList &Inputs,
3261 const ArgList &Args,
3262 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003263 ArgStringList CmdArgs;
3264
3265 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3266 const InputInfo &Input = Inputs[0];
3267
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003268 // Don't warn about "clang -w -c foo.s"
3269 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003270 // and "clang -emit-llvm -c foo.s"
3271 Args.ClaimAllArgs(options::OPT_emit_llvm);
3272 // and "clang -use-gold-plugin -c foo.s"
3273 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003274
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003275 // Invoke ourselves in -cc1as mode.
3276 //
3277 // FIXME: Implement custom jobs for internal actions.
3278 CmdArgs.push_back("-cc1as");
3279
3280 // Add the "effective" target triple.
3281 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003282 std::string TripleStr =
3283 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003284 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3285
3286 // Set the output mode, we currently only expect to be used as a real
3287 // assembler.
3288 CmdArgs.push_back("-filetype");
3289 CmdArgs.push_back("obj");
3290
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003291 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003292 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003293
Jim Grosbach576452b2012-02-10 20:37:10 +00003294 // Add target specific cpu and features flags.
3295 switch(getToolChain().getTriple().getArch()) {
3296 default:
3297 break;
3298
3299 case llvm::Triple::arm:
3300 case llvm::Triple::thumb:
3301 AddARMTargetArgs(Args, CmdArgs);
3302 break;
3303 }
3304
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003305 // Ignore explicit -force_cpusubtype_ALL option.
3306 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003307
Eric Christopherfc3ee562012-01-10 00:38:01 +00003308 // Determine the original source input.
3309 const Action *SourceAction = &JA;
3310 while (SourceAction->getKind() != Action::InputClass) {
3311 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3312 SourceAction = SourceAction->getInputs()[0];
3313 }
3314
3315 // Forward -g, assuming we are dealing with an actual assembly file.
3316 if (SourceAction->getType() == types::TY_Asm ||
3317 SourceAction->getType() == types::TY_PP_Asm) {
3318 Args.ClaimAllArgs(options::OPT_g_Group);
3319 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3320 if (!A->getOption().matches(options::OPT_g0))
3321 CmdArgs.push_back("-g");
3322 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003323
3324 // Optionally embed the -cc1as level arguments into the debug info, for build
3325 // analysis.
3326 if (getToolChain().UseDwarfDebugFlags()) {
3327 ArgStringList OriginalArgs;
3328 for (ArgList::const_iterator it = Args.begin(),
3329 ie = Args.end(); it != ie; ++it)
3330 (*it)->render(Args, OriginalArgs);
3331
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003332 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003333 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3334 Flags += Exec;
3335 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3336 Flags += " ";
3337 Flags += OriginalArgs[i];
3338 }
3339 CmdArgs.push_back("-dwarf-debug-flags");
3340 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3341 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003342
3343 // FIXME: Add -static support, once we have it.
3344
3345 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3346 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003347 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003348
3349 assert(Output.isFilename() && "Unexpected lipo output.");
3350 CmdArgs.push_back("-o");
3351 CmdArgs.push_back(Output.getFilename());
3352
Daniel Dunbarb440f562010-08-02 02:38:21 +00003353 assert(Input.isFilename() && "Invalid input.");
3354 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003355
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003356 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003357 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003358}
3359
Daniel Dunbara3246a02009-03-18 08:07:30 +00003360void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003361 const InputInfo &Output,
3362 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003363 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003364 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003365 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003366 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003367
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003368 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003369 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003370 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003371 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003372 // Don't forward any -g arguments to assembly steps.
3373 if (isa<AssembleJobAction>(JA) &&
3374 A->getOption().matches(options::OPT_g_Group))
3375 continue;
3376
Daniel Dunbar2da02722009-03-19 07:55:12 +00003377 // It is unfortunate that we have to claim here, as this means
3378 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003379 // platforms using a generic gcc, even if we are just using gcc
3380 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003381 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003382 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003383 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003384 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003385
Daniel Dunbar4e295052010-01-25 22:35:08 +00003386 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003387
3388 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003389 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003390 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003391 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003392
3393 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003394 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003395 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003396 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003397 CmdArgs.push_back("ppc64");
3398 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003399 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003400 }
3401
Daniel Dunbar5716d872009-05-02 21:41:52 +00003402 // Try to force gcc to match the tool chain we want, if we recognize
3403 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003404 //
3405 // FIXME: The triple class should directly provide the information we want
3406 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003407 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003408 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003409 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003410 CmdArgs.push_back("-m64");
3411
Daniel Dunbarb440f562010-08-02 02:38:21 +00003412 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003413 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003414 CmdArgs.push_back(Output.getFilename());
3415 } else {
3416 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003417 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003418 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003419
Tony Linthicum76329bf2011-12-12 21:14:55 +00003420 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3421 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003422
3423 // Only pass -x if gcc will understand it; otherwise hope gcc
3424 // understands the suffix correctly. The main use case this would go
3425 // wrong in is for linker inputs if they happened to have an odd
3426 // suffix; really the only way to get this to happen is a command
3427 // like '-x foobar a.c' which will treat a.c like a linker input.
3428 //
3429 // FIXME: For the linker case specifically, can we safely convert
3430 // inputs into '-Wl,' options?
3431 for (InputInfoList::const_iterator
3432 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3433 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003434
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003435 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003436 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3437 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003438 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003439 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003440 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003441 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003442 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003443
Daniel Dunbara3246a02009-03-18 08:07:30 +00003444 if (types::canTypeBeUserSpecified(II.getType())) {
3445 CmdArgs.push_back("-x");
3446 CmdArgs.push_back(types::getTypeName(II.getType()));
3447 }
3448
Daniel Dunbarb440f562010-08-02 02:38:21 +00003449 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003450 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003451 else {
3452 const Arg &A = II.getInputArg();
3453
3454 // Reverse translate some rewritten options.
3455 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3456 CmdArgs.push_back("-lstdc++");
3457 continue;
3458 }
3459
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003460 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003461 A.render(Args, CmdArgs);
3462 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003463 }
3464
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003465 const std::string customGCCName = D.getCCCGenericGCCName();
3466 const char *GCCName;
3467 if (!customGCCName.empty())
3468 GCCName = customGCCName.c_str();
3469 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003470 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003471 } else
3472 GCCName = "gcc";
3473
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003474 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003475 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003476 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003477}
3478
Daniel Dunbar4e295052010-01-25 22:35:08 +00003479void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3480 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003481 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003482}
3483
Daniel Dunbar4e295052010-01-25 22:35:08 +00003484void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3485 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003486 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003487}
3488
Daniel Dunbar4e295052010-01-25 22:35:08 +00003489void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3490 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003491 const Driver &D = getToolChain().getDriver();
3492
Daniel Dunbar4e295052010-01-25 22:35:08 +00003493 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003494 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3495 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003496 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003497 else {
3498 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003499 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003500 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003501
Daniel Dunbar4e295052010-01-25 22:35:08 +00003502 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003503 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003504}
3505
Daniel Dunbar4e295052010-01-25 22:35:08 +00003506void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3507 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003508 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003509}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003510
Daniel Dunbar4e295052010-01-25 22:35:08 +00003511void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3512 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003513 // The types are (hopefully) good enough.
3514}
3515
Tony Linthicum76329bf2011-12-12 21:14:55 +00003516// Hexagon tools start.
3517void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3518 ArgStringList &CmdArgs) const {
3519
3520}
3521void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3522 const InputInfo &Output,
3523 const InputInfoList &Inputs,
3524 const ArgList &Args,
3525 const char *LinkingOutput) const {
3526
3527 const Driver &D = getToolChain().getDriver();
3528 ArgStringList CmdArgs;
3529
3530 std::string MarchString = "-march=";
3531 MarchString += getHexagonTargetCPU(Args);
3532 CmdArgs.push_back(Args.MakeArgString(MarchString));
3533
3534 RenderExtraToolArgs(JA, CmdArgs);
3535
3536 if (Output.isFilename()) {
3537 CmdArgs.push_back("-o");
3538 CmdArgs.push_back(Output.getFilename());
3539 } else {
3540 assert(Output.isNothing() && "Unexpected output");
3541 CmdArgs.push_back("-fsyntax-only");
3542 }
3543
3544
3545 // Only pass -x if gcc will understand it; otherwise hope gcc
3546 // understands the suffix correctly. The main use case this would go
3547 // wrong in is for linker inputs if they happened to have an odd
3548 // suffix; really the only way to get this to happen is a command
3549 // like '-x foobar a.c' which will treat a.c like a linker input.
3550 //
3551 // FIXME: For the linker case specifically, can we safely convert
3552 // inputs into '-Wl,' options?
3553 for (InputInfoList::const_iterator
3554 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3555 const InputInfo &II = *it;
3556
3557 // Don't try to pass LLVM or AST inputs to a generic gcc.
3558 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3559 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3560 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3561 << getToolChain().getTripleString();
3562 else if (II.getType() == types::TY_AST)
3563 D.Diag(clang::diag::err_drv_no_ast_support)
3564 << getToolChain().getTripleString();
3565
3566 if (II.isFilename())
3567 CmdArgs.push_back(II.getFilename());
3568 else
3569 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3570 II.getInputArg().render(Args, CmdArgs);
3571 }
3572
3573 const char *GCCName = "hexagon-as";
3574 const char *Exec =
3575 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3576 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3577
3578}
3579void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3580 ArgStringList &CmdArgs) const {
3581 // The types are (hopefully) good enough.
3582}
3583
3584void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3585 const InputInfo &Output,
3586 const InputInfoList &Inputs,
3587 const ArgList &Args,
3588 const char *LinkingOutput) const {
3589
3590 const Driver &D = getToolChain().getDriver();
3591 ArgStringList CmdArgs;
3592
3593 for (ArgList::const_iterator
3594 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3595 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003596 if (forwardToGCC(A->getOption())) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00003597 // Don't forward any -g arguments to assembly steps.
3598 if (isa<AssembleJobAction>(JA) &&
3599 A->getOption().matches(options::OPT_g_Group))
3600 continue;
3601
3602 // It is unfortunate that we have to claim here, as this means
3603 // we will basically never report anything interesting for
3604 // platforms using a generic gcc, even if we are just using gcc
3605 // to get to the assembler.
3606 A->claim();
3607 A->render(Args, CmdArgs);
3608 }
3609 }
3610
3611 RenderExtraToolArgs(JA, CmdArgs);
3612
3613 // Add Arch Information
3614 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003615 if ((A = getLastHexagonArchArg(Args))) {
3616 if (A->getOption().matches(options::OPT_m_Joined))
3617 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003618 else
Sebastian Pop86500282012-01-13 20:37:10 +00003619 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003620 }
Sebastian Pop86500282012-01-13 20:37:10 +00003621 else {
3622 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3623 }
3624
Tony Linthicum76329bf2011-12-12 21:14:55 +00003625 CmdArgs.push_back("-mqdsp6-compat");
3626
3627 const char *GCCName;
3628 if (C.getDriver().CCCIsCXX)
3629 GCCName = "hexagon-g++";
3630 else
3631 GCCName = "hexagon-gcc";
3632 const char *Exec =
3633 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3634
3635 if (Output.isFilename()) {
3636 CmdArgs.push_back("-o");
3637 CmdArgs.push_back(Output.getFilename());
3638 }
3639
3640 for (InputInfoList::const_iterator
3641 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3642 const InputInfo &II = *it;
3643
3644 // Don't try to pass LLVM or AST inputs to a generic gcc.
3645 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3646 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3647 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3648 << getToolChain().getTripleString();
3649 else if (II.getType() == types::TY_AST)
3650 D.Diag(clang::diag::err_drv_no_ast_support)
3651 << getToolChain().getTripleString();
3652
3653 if (II.isFilename())
3654 CmdArgs.push_back(II.getFilename());
3655 else
3656 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3657 II.getInputArg().render(Args, CmdArgs);
3658 }
3659 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3660
3661}
3662// Hexagon tools end.
3663
Rafael Espindoladcbf6982012-10-31 18:51:07 +00003664llvm::Triple::ArchType darwin::getArchTypeForDarwinArchName(StringRef Str) {
3665 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
3666 // archs which Darwin doesn't use.
3667
3668 // The matching this routine does is fairly pointless, since it is neither the
3669 // complete architecture list, nor a reasonable subset. The problem is that
3670 // historically the driver driver accepts this and also ties its -march=
3671 // handling to the architecture name, so we need to be careful before removing
3672 // support for it.
3673
3674 // This code must be kept in sync with Clang's Darwin specific argument
3675 // translation.
3676
3677 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
3678 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
3679 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
3680 .Case("ppc64", llvm::Triple::ppc64)
3681 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
3682 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
3683 llvm::Triple::x86)
3684 .Case("x86_64", llvm::Triple::x86_64)
3685 // This is derived from the driver driver.
3686 .Cases("arm", "armv4t", "armv5", "armv6", llvm::Triple::arm)
3687 .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", llvm::Triple::arm)
3688 .Case("r600", llvm::Triple::r600)
3689 .Case("nvptx", llvm::Triple::nvptx)
3690 .Case("nvptx64", llvm::Triple::nvptx64)
3691 .Case("amdil", llvm::Triple::amdil)
3692 .Case("spir", llvm::Triple::spir)
3693 .Default(llvm::Triple::UnknownArch);
3694}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003695
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003696const char *darwin::CC1::getCC1Name(types::ID Type) const {
3697 switch (Type) {
3698 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003699 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003700 case types::TY_Asm:
3701 case types::TY_C: case types::TY_CHeader:
3702 case types::TY_PP_C: case types::TY_PP_CHeader:
3703 return "cc1";
3704 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003705 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3706 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003707 return "cc1obj";
3708 case types::TY_CXX: case types::TY_CXXHeader:
3709 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3710 return "cc1plus";
3711 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003712 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3713 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003714 return "cc1objplus";
3715 }
3716}
3717
David Blaikie68e081d2011-12-20 02:48:34 +00003718void darwin::CC1::anchor() {}
3719
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003720const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003721 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003722 return Args.MakeArgString(
3723 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003724}
3725
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003726const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003727 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003728 const char *Str = getBaseInputName(Args, Inputs);
3729
Chris Lattner906bb902011-01-16 08:14:11 +00003730 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003731 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003732
3733 return Str;
3734}
3735
3736const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003737darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003738 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003739 // FIXME: Think about this more.
3740 std::string Res;
3741
3742 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003743 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003744 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003745 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003746 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003747 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003748 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003749}
3750
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003751void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003752 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003753 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003754
3755 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003756 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003757
Bob Wilson7ecbd322012-02-07 01:17:55 +00003758 // Erase both -fmodule-cache-path and its argument.
3759 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3760 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003761 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003762 continue;
3763 }
3764
Bob Wilson7ecbd322012-02-07 01:17:55 +00003765 // Remove unsupported -f options.
3766 if (Option.startswith("-f")) {
3767 // Remove -f/-fno- to reduce the number of cases.
3768 if (Option.startswith("-fno-"))
3769 Option = Option.substr(5);
3770 else
3771 Option = Option.substr(2);
3772 RemoveOption = llvm::StringSwitch<bool>(Option)
3773 .Case("altivec", true)
3774 .Case("modules", true)
3775 .Case("diagnostics-show-note-include-stack", true)
3776 .Default(false);
3777 }
3778
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003779 // Handle machine specific options.
3780 if (Option.startswith("-m")) {
3781 RemoveOption = llvm::StringSwitch<bool>(Option)
3782 .Case("-mthumb", true)
3783 .Case("-mno-thumb", true)
3784 .Case("-mno-fused-madd", true)
3785 .Case("-mlong-branch", true)
3786 .Case("-mlongcall", true)
3787 .Case("-mcpu=G4", true)
3788 .Case("-mcpu=G5", true)
3789 .Default(false);
3790 }
3791
3792 // Handle warning options.
3793 if (Option.startswith("-W")) {
3794 // Remove -W/-Wno- to reduce the number of cases.
3795 if (Option.startswith("-Wno-"))
3796 Option = Option.substr(5);
3797 else
3798 Option = Option.substr(2);
3799
3800 RemoveOption = llvm::StringSwitch<bool>(Option)
3801 .Case("address-of-temporary", true)
3802 .Case("ambiguous-member-template", true)
3803 .Case("analyzer-incompatible-plugin", true)
3804 .Case("array-bounds", true)
3805 .Case("array-bounds-pointer-arithmetic", true)
3806 .Case("bind-to-temporary-copy", true)
3807 .Case("bitwise-op-parentheses", true)
3808 .Case("bool-conversions", true)
3809 .Case("builtin-macro-redefined", true)
3810 .Case("c++-hex-floats", true)
3811 .Case("c++0x-compat", true)
3812 .Case("c++0x-extensions", true)
3813 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003814 .Case("c++11-compat", true)
3815 .Case("c++11-extensions", true)
3816 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003817 .Case("conditional-uninitialized", true)
3818 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003819 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003820 .Case("CFString-literal", true)
3821 .Case("constant-logical-operand", true)
3822 .Case("custom-atomic-properties", true)
3823 .Case("default-arg-special-member", true)
3824 .Case("delegating-ctor-cycles", true)
3825 .Case("delete-non-virtual-dtor", true)
3826 .Case("deprecated-implementations", true)
3827 .Case("deprecated-writable-strings", true)
3828 .Case("distributed-object-modifiers", true)
3829 .Case("duplicate-method-arg", true)
3830 .Case("dynamic-class-memaccess", true)
3831 .Case("enum-compare", true)
Ted Kremeneka88397d2012-10-09 19:29:48 +00003832 .Case("enum-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003833 .Case("exit-time-destructors", true)
3834 .Case("gnu", true)
3835 .Case("gnu-designator", true)
3836 .Case("header-hygiene", true)
3837 .Case("idiomatic-parentheses", true)
3838 .Case("ignored-qualifiers", true)
3839 .Case("implicit-atomic-properties", true)
3840 .Case("incompatible-pointer-types", true)
3841 .Case("incomplete-implementation", true)
Ted Kremenekb4762412012-10-09 19:29:46 +00003842 .Case("int-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003843 .Case("initializer-overrides", true)
3844 .Case("invalid-noreturn", true)
3845 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003846 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003847 .Case("literal-conversion", true)
3848 .Case("literal-range", true)
3849 .Case("local-type-template-args", true)
3850 .Case("logical-op-parentheses", true)
3851 .Case("method-signatures", true)
3852 .Case("microsoft", true)
3853 .Case("mismatched-tags", true)
3854 .Case("missing-method-return-type", true)
3855 .Case("non-pod-varargs", true)
3856 .Case("nonfragile-abi2", true)
3857 .Case("null-arithmetic", true)
3858 .Case("null-dereference", true)
3859 .Case("out-of-line-declaration", true)
3860 .Case("overriding-method-mismatch", true)
3861 .Case("readonly-setter-attrs", true)
3862 .Case("return-stack-address", true)
3863 .Case("self-assign", true)
3864 .Case("semicolon-before-method-body", true)
3865 .Case("sentinel", true)
3866 .Case("shift-overflow", true)
3867 .Case("shift-sign-overflow", true)
3868 .Case("sign-conversion", true)
3869 .Case("sizeof-array-argument", true)
3870 .Case("sizeof-pointer-memaccess", true)
3871 .Case("string-compare", true)
3872 .Case("super-class-method-mismatch", true)
3873 .Case("tautological-compare", true)
3874 .Case("typedef-redefinition", true)
3875 .Case("typename-missing", true)
3876 .Case("undefined-reinterpret-cast", true)
3877 .Case("unknown-warning-option", true)
3878 .Case("unnamed-type-template-args", true)
3879 .Case("unneeded-internal-declaration", true)
3880 .Case("unneeded-member-function", true)
3881 .Case("unused-comparison", true)
3882 .Case("unused-exception-parameter", true)
3883 .Case("unused-member-function", true)
3884 .Case("unused-result", true)
3885 .Case("vector-conversions", true)
3886 .Case("vla", true)
3887 .Case("used-but-marked-unused", true)
3888 .Case("weak-vtables", true)
3889 .Default(false);
3890 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003891 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003892 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003893 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003894 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003895 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003896 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003897 }
3898}
3899
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003900void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003901 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003902 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003903
3904 CheckCodeGenerationOptions(D, Args);
3905
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003906 // Derived from cc1 spec.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003907 if ((!Args.hasArg(options::OPT_mkernel) ||
3908 (getDarwinToolChain().isTargetIPhoneOS() &&
3909 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3910 !Args.hasArg(options::OPT_static) &&
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003911 !Args.hasArg(options::OPT_mdynamic_no_pic))
3912 CmdArgs.push_back("-fPIC");
3913
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003914 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3915 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3916 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3917 CmdArgs.push_back("-fno-builtin-strcat");
3918 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3919 CmdArgs.push_back("-fno-builtin-strcpy");
3920 }
3921
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003922 if (Args.hasArg(options::OPT_g_Flag) &&
3923 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3924 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3925}
3926
3927void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3928 const InputInfoList &Inputs,
3929 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003930 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003931
3932 // Derived from cc1_options spec.
3933 if (Args.hasArg(options::OPT_fast) ||
3934 Args.hasArg(options::OPT_fastf) ||
3935 Args.hasArg(options::OPT_fastcp))
3936 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003937
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003938 if (Arg *A = Args.getLastArg(options::OPT_pg))
3939 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003940 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003941 << A->getAsString(Args) << "-fomit-frame-pointer";
3942
3943 AddCC1Args(Args, CmdArgs);
3944
3945 if (!Args.hasArg(options::OPT_Q))
3946 CmdArgs.push_back("-quiet");
3947
3948 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003949 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003950
3951 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3952
3953 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3954 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3955
3956 // FIXME: The goal is to use the user provided -o if that is our
3957 // final output, otherwise to drive from the original input
3958 // name. Find a clean way to go about this.
3959 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3960 Args.hasArg(options::OPT_o)) {
3961 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3962 CmdArgs.push_back("-auxbase-strip");
Richard Smithbd55daf2012-11-01 04:30:05 +00003963 CmdArgs.push_back(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003964 } else {
3965 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003966 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003967 }
3968
3969 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3970
3971 Args.AddAllArgs(CmdArgs, options::OPT_O);
3972 // FIXME: -Wall is getting some special treatment. Investigate.
3973 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3974 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003975 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003976 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003977 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3978 // Honor -std-default.
3979 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3980 "-std=", /*Joined=*/true);
3981 }
3982
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003983 if (Args.hasArg(options::OPT_v))
3984 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003985 if (Args.hasArg(options::OPT_pg) &&
3986 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003987 CmdArgs.push_back("-p");
3988 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003989
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003990 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003991 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3992 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3993 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3994 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3995 //
3996 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003997 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3998 options::OPT_fsyntax_only),
3999 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004000 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
4001 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
4002 (*it)->claim();
4003 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004004 }
4005 }
4006 } else
4007 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004008
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00004009 // Claim Clang only -f options, they aren't worth warning about.
4010 Args.ClaimAllArgs(options::OPT_f_clang_Group);
4011
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004012 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4013 if (Args.hasArg(options::OPT_Qn))
4014 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004015
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004016 // FIXME: This isn't correct.
4017 //Args.AddLastArg(CmdArgs, options::OPT__help)
4018 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
4019
4020 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4021
4022 // FIXME: Still don't get what is happening here. Investigate.
4023 Args.AddAllArgs(CmdArgs, options::OPT__param);
4024
4025 if (Args.hasArg(options::OPT_fmudflap) ||
4026 Args.hasArg(options::OPT_fmudflapth)) {
4027 CmdArgs.push_back("-fno-builtin");
4028 CmdArgs.push_back("-fno-merge-constants");
4029 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004030
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004031 if (Args.hasArg(options::OPT_coverage)) {
4032 CmdArgs.push_back("-fprofile-arcs");
4033 CmdArgs.push_back("-ftest-coverage");
4034 }
4035
4036 if (types::isCXX(Inputs[0].getType()))
4037 CmdArgs.push_back("-D__private_extern__=extern");
4038}
4039
4040void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
4041 const InputInfoList &Inputs,
4042 const ArgStringList &OutputArgs) const {
4043 // Derived from cpp_options
4044 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004045
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004046 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4047
4048 AddCC1Args(Args, CmdArgs);
4049
4050 // NOTE: The code below has some commonality with cpp_options, but
4051 // in classic gcc style ends up sending things in different
4052 // orders. This may be a good merge candidate once we drop pedantic
4053 // compatibility.
4054
4055 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004056 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004057 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004058 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4059 // Honor -std-default.
4060 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
4061 "-std=", /*Joined=*/true);
4062 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004063 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
4064 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004065
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004066 // The driver treats -fsyntax-only specially.
4067 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
4068
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00004069 // Claim Clang only -f options, they aren't worth warning about.
4070 Args.ClaimAllArgs(options::OPT_f_clang_Group);
4071
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004072 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
4073 !Args.hasArg(options::OPT_fno_working_directory))
4074 CmdArgs.push_back("-fworking-directory");
4075
4076 Args.AddAllArgs(CmdArgs, options::OPT_O);
4077 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4078 if (Args.hasArg(options::OPT_save_temps))
4079 CmdArgs.push_back("-fpch-preprocess");
4080}
4081
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004082void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004083 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00004084 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004085 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004086
Daniel Dunbar64198ef2009-09-10 01:21:05 +00004087 CheckPreprocessingOptions(D, Args);
4088
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004089 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00004090 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
4091 Args.AddLastArg(CmdArgs, options::OPT_C);
4092 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004093 if (!Args.hasArg(options::OPT_Q))
4094 CmdArgs.push_back("-quiet");
4095 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00004096 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004097 Args.AddLastArg(CmdArgs, options::OPT_v);
4098 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
4099 Args.AddLastArg(CmdArgs, options::OPT_P);
4100
4101 // FIXME: Handle %I properly.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004102 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004103 CmdArgs.push_back("-imultilib");
4104 CmdArgs.push_back("x86_64");
4105 }
4106
4107 if (Args.hasArg(options::OPT_MD)) {
4108 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00004109 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004110 }
4111
4112 if (Args.hasArg(options::OPT_MMD)) {
4113 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00004114 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004115 }
4116
4117 Args.AddLastArg(CmdArgs, options::OPT_M);
4118 Args.AddLastArg(CmdArgs, options::OPT_MM);
4119 Args.AddAllArgs(CmdArgs, options::OPT_MF);
4120 Args.AddLastArg(CmdArgs, options::OPT_MG);
4121 Args.AddLastArg(CmdArgs, options::OPT_MP);
4122 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
4123 Args.AddAllArgs(CmdArgs, options::OPT_MT);
4124 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
4125 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
4126 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
4127 CmdArgs.push_back("-MQ");
Richard Smithbd55daf2012-11-01 04:30:05 +00004128 CmdArgs.push_back(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004129 }
4130 }
4131
4132 Args.AddLastArg(CmdArgs, options::OPT_remap);
4133 if (Args.hasArg(options::OPT_g3))
4134 CmdArgs.push_back("-dD");
4135 Args.AddLastArg(CmdArgs, options::OPT_H);
4136
4137 AddCPPArgs(Args, CmdArgs);
4138
4139 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
4140 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
4141
4142 for (InputInfoList::const_iterator
4143 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4144 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004145
Daniel Dunbarb440f562010-08-02 02:38:21 +00004146 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004147 }
4148
4149 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
4150 options::OPT_Xpreprocessor);
4151
4152 if (Args.hasArg(options::OPT_fmudflap)) {
4153 CmdArgs.push_back("-D_MUDFLAP");
4154 CmdArgs.push_back("-include");
4155 CmdArgs.push_back("mf-runtime.h");
4156 }
4157
4158 if (Args.hasArg(options::OPT_fmudflapth)) {
4159 CmdArgs.push_back("-D_MUDFLAP");
4160 CmdArgs.push_back("-D_MUDFLAPTH");
4161 CmdArgs.push_back("-include");
4162 CmdArgs.push_back("mf-runtime.h");
4163 }
4164}
4165
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004166void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004167 ArgStringList &CmdArgs) const {
4168 // Derived from cpp spec.
4169
4170 if (Args.hasArg(options::OPT_static)) {
4171 // The gcc spec is broken here, it refers to dynamic but
4172 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004173
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004174 // if (!Args.hasArg(arglist.parser.dynamicOption))
4175 CmdArgs.push_back("-D__STATIC__");
4176 } else
4177 CmdArgs.push_back("-D__DYNAMIC__");
4178
4179 if (Args.hasArg(options::OPT_pthread))
4180 CmdArgs.push_back("-D_REENTRANT");
4181}
4182
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004183void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004184 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004185 const InputInfoList &Inputs,
4186 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004187 const char *LinkingOutput) const {
4188 ArgStringList CmdArgs;
4189
4190 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4191
4192 CmdArgs.push_back("-E");
4193
4194 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004195 Args.hasArg(options::OPT_traditional_cpp))
4196 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004197
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004198 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004199 assert(Output.isFilename() && "Unexpected CC1 output.");
4200 OutputArgs.push_back("-o");
4201 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004202
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00004203 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00004204 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4205 } else {
4206 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4207 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4208 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004209
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00004210 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
4211
Chad Rosierc31e48d2011-09-08 00:38:00 +00004212 RemoveCC1UnsupportedArgs(CmdArgs);
4213
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004214 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004215 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004216 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004217 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004218}
4219
4220void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004221 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004222 const InputInfoList &Inputs,
4223 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004224 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004225 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004226 ArgStringList CmdArgs;
4227
4228 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4229
Bob Wilson0090df22012-04-01 23:03:29 +00004230 // Silence warning about unused --serialize-diagnostics
4231 Args.ClaimAllArgs(options::OPT__serialize_diags);
4232
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004233 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00004234 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004235 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004236 << A->getAsString(Args) << "-E";
4237
Daniel Dunbar24e52992010-06-07 23:28:45 +00004238 if (JA.getType() == types::TY_LLVM_IR ||
4239 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004240 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00004241 else if (JA.getType() == types::TY_LLVM_BC ||
4242 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004243 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004244 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004245 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004246 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004247 else if (JA.getType() != types::TY_PP_Asm &&
4248 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004249 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004250 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004251
4252 ArgStringList OutputArgs;
4253 if (Output.getType() != types::TY_PCH) {
4254 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004255 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004256 OutputArgs.push_back("/dev/null");
4257 else
4258 OutputArgs.push_back(Output.getFilename());
4259 }
4260
4261 // There is no need for this level of compatibility, but it makes
4262 // diffing easier.
4263 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4264 Args.hasArg(options::OPT_S));
4265
4266 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004267 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004268 if (OutputArgsEarly) {
4269 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4270 } else {
4271 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4272 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4273 }
4274 } else {
4275 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004276
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004277 for (InputInfoList::const_iterator
4278 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4279 const InputInfo &II = *it;
4280
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004281 // Reject AST inputs.
4282 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004283 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004284 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004285 return;
4286 }
4287
Daniel Dunbarb440f562010-08-02 02:38:21 +00004288 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004289 }
4290
4291 if (OutputArgsEarly) {
4292 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4293 } else {
4294 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4295 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4296 }
4297 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004298
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004299 if (Output.getType() == types::TY_PCH) {
4300 assert(Output.isFilename() && "Invalid PCH output.");
4301
4302 CmdArgs.push_back("-o");
4303 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4304 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004305 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004306 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004307 C.addTempFile(TmpPath);
4308 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004309
Eric Christopher84fbdb42011-08-19 00:30:14 +00004310 // If we're emitting a pch file with the last 4 characters of ".pth"
4311 // and falling back to llvm-gcc we want to use ".gch" instead.
4312 std::string OutputFile(Output.getFilename());
4313 size_t loc = OutputFile.rfind(".pth");
4314 if (loc != std::string::npos)
4315 OutputFile.replace(loc, 4, ".gch");
4316 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4317 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004318 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004319
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004320 RemoveCC1UnsupportedArgs(CmdArgs);
4321
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004322 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004323 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004324 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004325 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004326}
4327
Daniel Dunbarbe220842009-03-20 16:06:39 +00004328void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004329 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004330 const InputInfoList &Inputs,
4331 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004332 const char *LinkingOutput) const {
4333 ArgStringList CmdArgs;
4334
4335 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4336 const InputInfo &Input = Inputs[0];
4337
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004338 // Determine the original source input.
4339 const Action *SourceAction = &JA;
4340 while (SourceAction->getKind() != Action::InputClass) {
4341 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4342 SourceAction = SourceAction->getInputs()[0];
4343 }
4344
4345 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004346 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004347 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004348 if (Args.hasArg(options::OPT_gstabs))
4349 CmdArgs.push_back("--gstabs");
4350 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004351 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004352 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004353
Daniel Dunbarbe220842009-03-20 16:06:39 +00004354 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004355 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004356
Daniel Dunbar6d484762010-07-22 01:47:22 +00004357 // Use -force_cpusubtype_ALL on x86 by default.
4358 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4359 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004360 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4361 CmdArgs.push_back("-force_cpusubtype_ALL");
4362
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004363 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004364 (((Args.hasArg(options::OPT_mkernel) ||
4365 Args.hasArg(options::OPT_fapple_kext)) &&
4366 (!getDarwinToolChain().isTargetIPhoneOS() ||
4367 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4368 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004369 CmdArgs.push_back("-static");
4370
Daniel Dunbarbe220842009-03-20 16:06:39 +00004371 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4372 options::OPT_Xassembler);
4373
4374 assert(Output.isFilename() && "Unexpected lipo output.");
4375 CmdArgs.push_back("-o");
4376 CmdArgs.push_back(Output.getFilename());
4377
Daniel Dunbarb440f562010-08-02 02:38:21 +00004378 assert(Input.isFilename() && "Invalid input.");
4379 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004380
4381 // asm_final spec is empty.
4382
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004383 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004384 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004385 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004386}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004387
David Blaikie68e081d2011-12-20 02:48:34 +00004388void darwin::DarwinTool::anchor() {}
4389
Daniel Dunbare9ded432009-09-09 18:36:20 +00004390void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4391 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004392 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004393
Daniel Dunbarc1964212009-03-26 16:23:12 +00004394 // Derived from darwin_arch spec.
4395 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004396 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004397
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004398 // FIXME: Is this needed anymore?
4399 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004400 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004401}
4402
Bill Wendling3b2000f2012-10-02 18:02:50 +00004403bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4404 // We only need to generate a temp path for LTO if we aren't compiling object
4405 // files. When compiling source files, we run 'dsymutil' after linking. We
4406 // don't run 'dsymutil' when compiling object files.
4407 for (InputInfoList::const_iterator
4408 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4409 if (it->getType() != types::TY_Object)
4410 return true;
4411
4412 return false;
4413}
4414
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004415void darwin::Link::AddLinkArgs(Compilation &C,
4416 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004417 ArgStringList &CmdArgs,
4418 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004419 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004420 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004421
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004422 unsigned Version[3] = { 0, 0, 0 };
4423 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4424 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00004425 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004426 Version[1], Version[2], HadExtra) ||
4427 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004428 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004429 << A->getAsString(Args);
4430 }
4431
4432 // Newer linkers support -demangle, pass it if supported and not disabled by
4433 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004434 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004435 // Don't pass -demangle to ld_classic.
4436 //
4437 // FIXME: This is a temporary workaround, ld should be handling this.
4438 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4439 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004440 if (getToolChain().getArch() == llvm::Triple::x86) {
4441 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4442 options::OPT_Wl_COMMA),
4443 ie = Args.filtered_end(); it != ie; ++it) {
4444 const Arg *A = *it;
4445 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Richard Smithbd55daf2012-11-01 04:30:05 +00004446 if (StringRef(A->getValue(i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004447 UsesLdClassic = true;
4448 }
4449 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004450 if (!UsesLdClassic)
4451 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004452 }
4453
Daniel Dunbaref889c72011-06-21 20:55:11 +00004454 // If we are using LTO, then automatically create a temporary file path for
4455 // the linker to use, so that it's lifetime will extend past a possible
4456 // dsymutil step.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004457 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004458 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004459 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004460 C.addTempFile(TmpPath);
4461 CmdArgs.push_back("-object_path_lto");
4462 CmdArgs.push_back(TmpPath);
4463 }
4464
Daniel Dunbarc1964212009-03-26 16:23:12 +00004465 // Derived from the "link" spec.
4466 Args.AddAllArgs(CmdArgs, options::OPT_static);
4467 if (!Args.hasArg(options::OPT_static))
4468 CmdArgs.push_back("-dynamic");
4469 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4470 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4471 // here. How do we wish to handle such things?
4472 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004473
Daniel Dunbarc1964212009-03-26 16:23:12 +00004474 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004475 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004476 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004477 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004478
4479 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4480 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4481 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4482
4483 Arg *A;
4484 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4485 (A = Args.getLastArg(options::OPT_current__version)) ||
4486 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004487 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004488 << A->getAsString(Args) << "-dynamiclib";
4489
4490 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4491 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4492 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4493 } else {
4494 CmdArgs.push_back("-dylib");
4495
4496 Arg *A;
4497 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4498 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4499 (A = Args.getLastArg(options::OPT_client__name)) ||
4500 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4501 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4502 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004503 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004504 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004505
Daniel Dunbarc1964212009-03-26 16:23:12 +00004506 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4507 "-dylib_compatibility_version");
4508 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4509 "-dylib_current_version");
4510
Daniel Dunbara48823f2010-01-22 02:04:52 +00004511 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004512
4513 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4514 "-dylib_install_name");
4515 }
4516
4517 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4518 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4519 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004520 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004521 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004522 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4523 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4524 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4525 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4526 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4527 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004528 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004529 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4530 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4531 Args.AddAllArgs(CmdArgs, options::OPT_init);
4532
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004533 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004534 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004535
4536 // If we had an explicit -mios-simulator-version-min argument, honor that,
4537 // otherwise use the traditional deployment targets. We can't just check the
4538 // is-sim attribute because existing code follows this path, and the linker
4539 // may not handle the argument.
4540 //
4541 // FIXME: We may be able to remove this, once we can verify no one depends on
4542 // it.
4543 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4544 CmdArgs.push_back("-ios_simulator_version_min");
4545 else if (DarwinTC.isTargetIPhoneOS())
4546 CmdArgs.push_back("-iphoneos_version_min");
4547 else
4548 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004549 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004550
Daniel Dunbarc1964212009-03-26 16:23:12 +00004551 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4552 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4553 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4554 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4555 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004556
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004557 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4558 options::OPT_fno_pie,
4559 options::OPT_fno_PIE)) {
4560 if (A->getOption().matches(options::OPT_fpie) ||
4561 A->getOption().matches(options::OPT_fPIE))
4562 CmdArgs.push_back("-pie");
4563 else
4564 CmdArgs.push_back("-no_pie");
4565 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004566
4567 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4568 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4569 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4570 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4571 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4572 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4573 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4574 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4575 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4576 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4577 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4578 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4579 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4580 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4581 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4582 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004583
Daniel Dunbar84384642011-05-02 21:03:47 +00004584 // Give --sysroot= preference, over the Apple specific behavior to also use
4585 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004586 StringRef sysroot = C.getSysRoot();
4587 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004588 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004589 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004590 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4591 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00004592 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004593 }
4594
Daniel Dunbarc1964212009-03-26 16:23:12 +00004595 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4596 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4597 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4598 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4599 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004600 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004601 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4602 Args.AddAllArgs(CmdArgs, options::OPT_y);
4603 Args.AddLastArg(CmdArgs, options::OPT_w);
4604 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4605 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4606 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4607 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4608 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4609 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4610 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4611 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4612 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4613 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4614 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4615 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4616}
4617
4618void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004619 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004620 const InputInfoList &Inputs,
4621 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004622 const char *LinkingOutput) const {
4623 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004624
Daniel Dunbarc1964212009-03-26 16:23:12 +00004625 // The logic here is derived from gcc's behavior; most of which
4626 // comes from specs (starting with link_command). Consult gcc for
4627 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004628 ArgStringList CmdArgs;
4629
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004630 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4631 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4632 options::OPT_ccc_arcmt_migrate)) {
4633 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4634 (*I)->claim();
4635 const char *Exec =
4636 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4637 CmdArgs.push_back(Output.getFilename());
4638 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4639 return;
4640 }
4641
Daniel Dunbarc1964212009-03-26 16:23:12 +00004642 // I'm not sure why this particular decomposition exists in gcc, but
4643 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004644 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004645
Daniel Dunbarc1964212009-03-26 16:23:12 +00004646 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4647 Args.AddAllArgs(CmdArgs, options::OPT_s);
4648 Args.AddAllArgs(CmdArgs, options::OPT_t);
4649 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4650 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004651 Args.AddLastArg(CmdArgs, options::OPT_e);
4652 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4653 Args.AddAllArgs(CmdArgs, options::OPT_r);
4654
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004655 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4656 // members of static archive libraries which implement Objective-C classes or
4657 // categories.
4658 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4659 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004660
Daniel Dunbarc1964212009-03-26 16:23:12 +00004661 CmdArgs.push_back("-o");
4662 CmdArgs.push_back(Output.getFilename());
4663
Chad Rosier06fd3c62012-05-16 23:45:12 +00004664 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004665 !Args.hasArg(options::OPT_nostartfiles)) {
4666 // Derived from startfile spec.
4667 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004668 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004669 if (getDarwinToolChain().isTargetIOSSimulator()) {
4670 // The simulator doesn't have a versioned crt1 file.
4671 CmdArgs.push_back("-ldylib1.o");
4672 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004673 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4674 CmdArgs.push_back("-ldylib1.o");
4675 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004676 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004677 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004678 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004679 CmdArgs.push_back("-ldylib1.10.5.o");
4680 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004681 } else {
4682 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004683 if (!Args.hasArg(options::OPT_static)) {
4684 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004685 if (getDarwinToolChain().isTargetIOSSimulator()) {
4686 // The simulator doesn't have a versioned crt1 file.
4687 CmdArgs.push_back("-lbundle1.o");
4688 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004689 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4690 CmdArgs.push_back("-lbundle1.o");
4691 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004692 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004693 CmdArgs.push_back("-lbundle1.o");
4694 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004695 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004696 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004697 if (Args.hasArg(options::OPT_pg) &&
4698 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004699 if (Args.hasArg(options::OPT_static) ||
4700 Args.hasArg(options::OPT_object) ||
4701 Args.hasArg(options::OPT_preload)) {
4702 CmdArgs.push_back("-lgcrt0.o");
4703 } else {
4704 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004705
Daniel Dunbarc1964212009-03-26 16:23:12 +00004706 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004707 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004708 // By default on OS X 10.8 and later, we don't link with a crt1.o
4709 // file and the linker knows to use _main as the entry point. But,
4710 // when compiling with -pg, we need to link with the gcrt1.o file,
4711 // so pass the -no_new_main option to tell the linker to use the
4712 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004713 if (getDarwinToolChain().isTargetMacOS() &&
4714 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4715 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004716 } else {
4717 if (Args.hasArg(options::OPT_static) ||
4718 Args.hasArg(options::OPT_object) ||
4719 Args.hasArg(options::OPT_preload)) {
4720 CmdArgs.push_back("-lcrt0.o");
4721 } else {
4722 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004723 if (getDarwinToolChain().isTargetIOSSimulator()) {
4724 // The simulator doesn't have a versioned crt1 file.
4725 CmdArgs.push_back("-lcrt1.o");
4726 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004727 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4728 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004729 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004730 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004731 } else {
4732 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4733 CmdArgs.push_back("-lcrt1.o");
4734 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4735 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004736 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004737 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004738
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004739 // darwin_crt2 spec is empty.
4740 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004741 }
4742 }
4743 }
4744 }
4745
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004746 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4747 Args.hasArg(options::OPT_shared_libgcc) &&
4748 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004749 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004750 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004751 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004752 }
4753 }
4754
4755 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004756
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004757 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4758 // symbols may appear. Mark all of them as dynamic_lookup.
4759 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4760 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4761 options::OPT_fno_address_sanitizer, false)) {
4762 if (Args.hasArg(options::OPT_dynamiclib) ||
4763 Args.hasArg(options::OPT_bundle)) {
4764 CmdArgs.push_back("-undefined");
4765 CmdArgs.push_back("dynamic_lookup");
4766 }
4767 }
4768
Daniel Dunbarc1964212009-03-26 16:23:12 +00004769 if (Args.hasArg(options::OPT_fopenmp))
4770 // This is more complicated in gcc...
4771 CmdArgs.push_back("-lgomp");
4772
Douglas Gregor9295df02012-05-15 21:00:27 +00004773 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4774
Bob Wilson16d93952012-05-15 18:57:39 +00004775 if (isObjCRuntimeLinked(Args) &&
4776 !Args.hasArg(options::OPT_nostdlib) &&
4777 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004778 // Avoid linking compatibility stubs on i386 mac.
4779 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004780 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004781 // If we don't have ARC or subscripting runtime support, link in the
4782 // runtime stubs. We have to do this *before* adding any of the normal
4783 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004784 ObjCRuntime runtime =
4785 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004786 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004787 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004788 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004789 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004790 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004791 CmdArgs.push_back("-framework");
4792 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004793 // Link libobj.
4794 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004795 }
John McCall31168b02011-06-15 23:02:42 +00004796
Daniel Dunbarc1964212009-03-26 16:23:12 +00004797 if (LinkingOutput) {
4798 CmdArgs.push_back("-arch_multiple");
4799 CmdArgs.push_back("-final_output");
4800 CmdArgs.push_back(LinkingOutput);
4801 }
4802
Daniel Dunbarc1964212009-03-26 16:23:12 +00004803 if (Args.hasArg(options::OPT_fnested_functions))
4804 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004805
Daniel Dunbarc1964212009-03-26 16:23:12 +00004806 if (!Args.hasArg(options::OPT_nostdlib) &&
4807 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004808 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004809 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004810
Daniel Dunbarc1964212009-03-26 16:23:12 +00004811 // link_ssp spec is empty.
4812
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004813 // Let the tool chain choose which runtime library to link.
4814 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004815 }
4816
Chad Rosier06fd3c62012-05-16 23:45:12 +00004817 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004818 !Args.hasArg(options::OPT_nostartfiles)) {
4819 // endfile_spec is empty.
4820 }
4821
4822 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4823 Args.AddAllArgs(CmdArgs, options::OPT_F);
4824
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004825 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004826 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004827 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004828}
4829
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004830void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004831 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004832 const InputInfoList &Inputs,
4833 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004834 const char *LinkingOutput) const {
4835 ArgStringList CmdArgs;
4836
4837 CmdArgs.push_back("-create");
4838 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004839
4840 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004841 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004842
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004843 for (InputInfoList::const_iterator
4844 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4845 const InputInfo &II = *it;
4846 assert(II.isFilename() && "Unexpected lipo input.");
4847 CmdArgs.push_back(II.getFilename());
4848 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004849 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004850 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004851 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004852}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004853
Daniel Dunbar88299622010-06-04 18:28:36 +00004854void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004855 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004856 const InputInfoList &Inputs,
4857 const ArgList &Args,
4858 const char *LinkingOutput) const {
4859 ArgStringList CmdArgs;
4860
Daniel Dunbareb86b042011-05-09 17:23:16 +00004861 CmdArgs.push_back("-o");
4862 CmdArgs.push_back(Output.getFilename());
4863
Daniel Dunbar88299622010-06-04 18:28:36 +00004864 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4865 const InputInfo &Input = Inputs[0];
4866 assert(Input.isFilename() && "Unexpected dsymutil input.");
4867 CmdArgs.push_back(Input.getFilename());
4868
Daniel Dunbar88299622010-06-04 18:28:36 +00004869 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004870 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004871 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004872}
4873
Eric Christopher551ef452011-08-23 17:56:55 +00004874void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4875 const InputInfo &Output,
4876 const InputInfoList &Inputs,
4877 const ArgList &Args,
4878 const char *LinkingOutput) const {
4879 ArgStringList CmdArgs;
4880 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004881 CmdArgs.push_back("--debug-info");
4882 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004883 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004884
4885 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4886 const InputInfo &Input = Inputs[0];
4887 assert(Input.isFilename() && "Unexpected verify input");
4888
4889 // Grabbing the output of the earlier dsymutil run.
4890 CmdArgs.push_back(Input.getFilename());
4891
4892 const char *Exec =
4893 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4894 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4895}
4896
David Chisnallf571cde2012-02-15 13:39:01 +00004897void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4898 const InputInfo &Output,
4899 const InputInfoList &Inputs,
4900 const ArgList &Args,
4901 const char *LinkingOutput) const {
4902 ArgStringList CmdArgs;
4903
4904 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4905 options::OPT_Xassembler);
4906
4907 CmdArgs.push_back("-o");
4908 CmdArgs.push_back(Output.getFilename());
4909
4910 for (InputInfoList::const_iterator
4911 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4912 const InputInfo &II = *it;
4913 CmdArgs.push_back(II.getFilename());
4914 }
4915
4916 const char *Exec =
4917 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4918 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4919}
4920
4921
4922void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4923 const InputInfo &Output,
4924 const InputInfoList &Inputs,
4925 const ArgList &Args,
4926 const char *LinkingOutput) const {
4927 // FIXME: Find a real GCC, don't hard-code versions here
4928 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4929 const llvm::Triple &T = getToolChain().getTriple();
4930 std::string LibPath = "/usr/lib/";
4931 llvm::Triple::ArchType Arch = T.getArch();
4932 switch (Arch) {
4933 case llvm::Triple::x86:
4934 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4935 T.getOSName()).str() + "/4.5.2/";
4936 break;
4937 case llvm::Triple::x86_64:
4938 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4939 T.getOSName()).str();
4940 GCCLibPath += "/4.5.2/amd64/";
4941 LibPath += "amd64/";
4942 break;
4943 default:
4944 assert(0 && "Unsupported architecture");
4945 }
4946
4947 ArgStringList CmdArgs;
4948
David Chisnall272a0712012-02-29 15:06:12 +00004949 // Demangle C++ names in errors
4950 CmdArgs.push_back("-C");
4951
David Chisnallf571cde2012-02-15 13:39:01 +00004952 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4953 (!Args.hasArg(options::OPT_shared))) {
4954 CmdArgs.push_back("-e");
4955 CmdArgs.push_back("_start");
4956 }
4957
4958 if (Args.hasArg(options::OPT_static)) {
4959 CmdArgs.push_back("-Bstatic");
4960 CmdArgs.push_back("-dn");
4961 } else {
4962 CmdArgs.push_back("-Bdynamic");
4963 if (Args.hasArg(options::OPT_shared)) {
4964 CmdArgs.push_back("-shared");
4965 } else {
4966 CmdArgs.push_back("--dynamic-linker");
4967 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4968 }
4969 }
4970
4971 if (Output.isFilename()) {
4972 CmdArgs.push_back("-o");
4973 CmdArgs.push_back(Output.getFilename());
4974 } else {
4975 assert(Output.isNothing() && "Invalid output.");
4976 }
4977
4978 if (!Args.hasArg(options::OPT_nostdlib) &&
4979 !Args.hasArg(options::OPT_nostartfiles)) {
4980 if (!Args.hasArg(options::OPT_shared)) {
4981 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4982 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004983 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004984 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4985 } else {
4986 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004987 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4988 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004989 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004990 if (getToolChain().getDriver().CCCIsCXX)
4991 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004992 }
4993
4994 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4995
4996 Args.AddAllArgs(CmdArgs, options::OPT_L);
4997 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4998 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004999 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005000
5001 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5002
5003 if (!Args.hasArg(options::OPT_nostdlib) &&
5004 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00005005 if (getToolChain().getDriver().CCCIsCXX)
5006 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005007 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005008 if (!Args.hasArg(options::OPT_shared)) {
5009 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005010 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005011 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005012 }
David Chisnallf571cde2012-02-15 13:39:01 +00005013 }
5014
5015 if (!Args.hasArg(options::OPT_nostdlib) &&
5016 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005017 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005018 }
David Chisnall96de9932012-02-16 16:00:47 +00005019 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005020
5021 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5022
5023 const char *Exec =
5024 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5025 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5026}
5027
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005028void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005029 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005030 const InputInfoList &Inputs,
5031 const ArgList &Args,
5032 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005033 ArgStringList CmdArgs;
5034
5035 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5036 options::OPT_Xassembler);
5037
5038 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005039 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005040
5041 for (InputInfoList::const_iterator
5042 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5043 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005044 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005045 }
5046
5047 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005048 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005049 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005050}
5051
5052void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005053 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005054 const InputInfoList &Inputs,
5055 const ArgList &Args,
5056 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005057 ArgStringList CmdArgs;
5058
5059 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005060 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005061 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005062 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005063 }
5064
5065 if (Args.hasArg(options::OPT_static)) {
5066 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005067 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005068 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005069// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005070 CmdArgs.push_back("-Bdynamic");
5071 if (Args.hasArg(options::OPT_shared)) {
5072 CmdArgs.push_back("-shared");
5073 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005074 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005075 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5076 }
5077 }
5078
Daniel Dunbarb440f562010-08-02 02:38:21 +00005079 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005080 CmdArgs.push_back("-o");
5081 CmdArgs.push_back(Output.getFilename());
5082 } else {
5083 assert(Output.isNothing() && "Invalid output.");
5084 }
5085
5086 if (!Args.hasArg(options::OPT_nostdlib) &&
5087 !Args.hasArg(options::OPT_nostartfiles)) {
5088 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005089 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005090 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005091 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005092 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005093 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005094 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005095 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005096 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005097 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005098 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005099 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005100 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005101 }
5102
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005103 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5104 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005105 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005106
5107 Args.AddAllArgs(CmdArgs, options::OPT_L);
5108 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5109 Args.AddAllArgs(CmdArgs, options::OPT_e);
5110
Daniel Dunbar54423b22010-09-17 00:24:54 +00005111 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005112
5113 if (!Args.hasArg(options::OPT_nostdlib) &&
5114 !Args.hasArg(options::OPT_nodefaultlibs)) {
5115 // FIXME: For some reason GCC passes -lgcc before adding
5116 // the default system libraries. Just mimic this for now.
5117 CmdArgs.push_back("-lgcc");
5118
5119 if (Args.hasArg(options::OPT_pthread))
5120 CmdArgs.push_back("-pthread");
5121 if (!Args.hasArg(options::OPT_shared))
5122 CmdArgs.push_back("-lc");
5123 CmdArgs.push_back("-lgcc");
5124 }
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")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005131 }
5132
Bill Wendling08760582011-06-27 19:15:03 +00005133 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005134
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005135 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005136 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005137 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005138}
5139
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005140void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005141 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005142 const InputInfoList &Inputs,
5143 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005144 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005145 ArgStringList CmdArgs;
5146
5147 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5148 options::OPT_Xassembler);
5149
5150 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005151 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005152
5153 for (InputInfoList::const_iterator
5154 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5155 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005156 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005157 }
5158
5159 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005160 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005161 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005162}
5163
5164void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005165 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005166 const InputInfoList &Inputs,
5167 const ArgList &Args,
5168 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005169 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005170 ArgStringList CmdArgs;
5171
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005172 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005173 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005174 CmdArgs.push_back("-e");
5175 CmdArgs.push_back("__start");
5176 }
5177
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005178 if (Args.hasArg(options::OPT_static)) {
5179 CmdArgs.push_back("-Bstatic");
5180 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005181 if (Args.hasArg(options::OPT_rdynamic))
5182 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005183 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005184 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005185 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005186 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005187 } else {
5188 CmdArgs.push_back("-dynamic-linker");
5189 CmdArgs.push_back("/usr/libexec/ld.so");
5190 }
5191 }
5192
Daniel Dunbarb440f562010-08-02 02:38:21 +00005193 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005194 CmdArgs.push_back("-o");
5195 CmdArgs.push_back(Output.getFilename());
5196 } else {
5197 assert(Output.isNothing() && "Invalid output.");
5198 }
5199
5200 if (!Args.hasArg(options::OPT_nostdlib) &&
5201 !Args.hasArg(options::OPT_nostartfiles)) {
5202 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005203 if (Args.hasArg(options::OPT_pg))
5204 CmdArgs.push_back(Args.MakeArgString(
5205 getToolChain().GetFilePath("gcrt0.o")));
5206 else
5207 CmdArgs.push_back(Args.MakeArgString(
5208 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005209 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005210 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005211 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005212 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005213 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005214 }
5215 }
5216
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005217 std::string Triple = getToolChain().getTripleString();
5218 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005219 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005220 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005221 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005222
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005223 Args.AddAllArgs(CmdArgs, options::OPT_L);
5224 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5225 Args.AddAllArgs(CmdArgs, options::OPT_e);
5226
Daniel Dunbar54423b22010-09-17 00:24:54 +00005227 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005228
5229 if (!Args.hasArg(options::OPT_nostdlib) &&
5230 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005231 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005232 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005233 if (Args.hasArg(options::OPT_pg))
5234 CmdArgs.push_back("-lm_p");
5235 else
5236 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005237 }
5238
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005239 // FIXME: For some reason GCC passes -lgcc before adding
5240 // the default system libraries. Just mimic this for now.
5241 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005242
Eric Christopher17674ec2012-09-13 06:32:34 +00005243 if (Args.hasArg(options::OPT_pthread)) {
5244 if (!Args.hasArg(options::OPT_shared) &&
5245 Args.hasArg(options::OPT_pg))
5246 CmdArgs.push_back("-lpthread_p");
5247 else
5248 CmdArgs.push_back("-lpthread");
5249 }
5250
Chandler Carruth45661652011-12-17 22:32:42 +00005251 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005252 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005253 CmdArgs.push_back("-lc_p");
5254 else
5255 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005256 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005257
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005258 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005259 }
5260
5261 if (!Args.hasArg(options::OPT_nostdlib) &&
5262 !Args.hasArg(options::OPT_nostartfiles)) {
5263 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005264 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005265 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005266 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005267 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005268 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005269 }
5270
5271 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005272 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005273 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005274}
Ed Schoutene33194b2009-04-02 19:13:12 +00005275
Eli Friedman9fa28852012-08-08 23:57:20 +00005276void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5277 const InputInfo &Output,
5278 const InputInfoList &Inputs,
5279 const ArgList &Args,
5280 const char *LinkingOutput) const {
5281 ArgStringList CmdArgs;
5282
5283 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5284 options::OPT_Xassembler);
5285
5286 CmdArgs.push_back("-o");
5287 CmdArgs.push_back(Output.getFilename());
5288
5289 for (InputInfoList::const_iterator
5290 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5291 const InputInfo &II = *it;
5292 CmdArgs.push_back(II.getFilename());
5293 }
5294
5295 const char *Exec =
5296 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5297 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5298}
5299
5300void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5301 const InputInfo &Output,
5302 const InputInfoList &Inputs,
5303 const ArgList &Args,
5304 const char *LinkingOutput) const {
5305 const Driver &D = getToolChain().getDriver();
5306 ArgStringList CmdArgs;
5307
5308 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5309 (!Args.hasArg(options::OPT_shared))) {
5310 CmdArgs.push_back("-e");
5311 CmdArgs.push_back("__start");
5312 }
5313
5314 if (Args.hasArg(options::OPT_static)) {
5315 CmdArgs.push_back("-Bstatic");
5316 } else {
5317 if (Args.hasArg(options::OPT_rdynamic))
5318 CmdArgs.push_back("-export-dynamic");
5319 CmdArgs.push_back("--eh-frame-hdr");
5320 CmdArgs.push_back("-Bdynamic");
5321 if (Args.hasArg(options::OPT_shared)) {
5322 CmdArgs.push_back("-shared");
5323 } else {
5324 CmdArgs.push_back("-dynamic-linker");
5325 CmdArgs.push_back("/usr/libexec/ld.so");
5326 }
5327 }
5328
5329 if (Output.isFilename()) {
5330 CmdArgs.push_back("-o");
5331 CmdArgs.push_back(Output.getFilename());
5332 } else {
5333 assert(Output.isNothing() && "Invalid output.");
5334 }
5335
5336 if (!Args.hasArg(options::OPT_nostdlib) &&
5337 !Args.hasArg(options::OPT_nostartfiles)) {
5338 if (!Args.hasArg(options::OPT_shared)) {
5339 if (Args.hasArg(options::OPT_pg))
5340 CmdArgs.push_back(Args.MakeArgString(
5341 getToolChain().GetFilePath("gcrt0.o")));
5342 else
5343 CmdArgs.push_back(Args.MakeArgString(
5344 getToolChain().GetFilePath("crt0.o")));
5345 CmdArgs.push_back(Args.MakeArgString(
5346 getToolChain().GetFilePath("crtbegin.o")));
5347 } else {
5348 CmdArgs.push_back(Args.MakeArgString(
5349 getToolChain().GetFilePath("crtbeginS.o")));
5350 }
5351 }
5352
5353 Args.AddAllArgs(CmdArgs, options::OPT_L);
5354 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5355 Args.AddAllArgs(CmdArgs, options::OPT_e);
5356
5357 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5358
5359 if (!Args.hasArg(options::OPT_nostdlib) &&
5360 !Args.hasArg(options::OPT_nodefaultlibs)) {
5361 if (D.CCCIsCXX) {
5362 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5363 if (Args.hasArg(options::OPT_pg))
5364 CmdArgs.push_back("-lm_p");
5365 else
5366 CmdArgs.push_back("-lm");
5367 }
5368
Rafael Espindola1ad26f02012-10-23 17:07:31 +00005369 if (Args.hasArg(options::OPT_pthread)) {
5370 if (!Args.hasArg(options::OPT_shared) &&
5371 Args.hasArg(options::OPT_pg))
5372 CmdArgs.push_back("-lpthread_p");
5373 else
5374 CmdArgs.push_back("-lpthread");
5375 }
5376
Eli Friedman9fa28852012-08-08 23:57:20 +00005377 if (!Args.hasArg(options::OPT_shared)) {
5378 if (Args.hasArg(options::OPT_pg))
5379 CmdArgs.push_back("-lc_p");
5380 else
5381 CmdArgs.push_back("-lc");
5382 }
5383
5384 std::string myarch = "-lclang_rt.";
5385 const llvm::Triple &T = getToolChain().getTriple();
5386 llvm::Triple::ArchType Arch = T.getArch();
5387 switch (Arch) {
5388 case llvm::Triple::arm:
5389 myarch += ("arm");
5390 break;
5391 case llvm::Triple::x86:
5392 myarch += ("i386");
5393 break;
5394 case llvm::Triple::x86_64:
5395 myarch += ("amd64");
5396 break;
5397 default:
5398 assert(0 && "Unsupported architecture");
5399 }
5400 CmdArgs.push_back(Args.MakeArgString(myarch));
5401 }
5402
5403 if (!Args.hasArg(options::OPT_nostdlib) &&
5404 !Args.hasArg(options::OPT_nostartfiles)) {
5405 if (!Args.hasArg(options::OPT_shared))
5406 CmdArgs.push_back(Args.MakeArgString(
5407 getToolChain().GetFilePath("crtend.o")));
5408 else
5409 CmdArgs.push_back(Args.MakeArgString(
5410 getToolChain().GetFilePath("crtendS.o")));
5411 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005412
5413 const char *Exec =
5414 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5415 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005416}
5417
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005418void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005419 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005420 const InputInfoList &Inputs,
5421 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005422 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005423 ArgStringList CmdArgs;
5424
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005425 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5426 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005427 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005428 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005429 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005430 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005431 else if (getToolChain().getArch() == llvm::Triple::mips ||
5432 getToolChain().getArch() == llvm::Triple::mipsel ||
5433 getToolChain().getArch() == llvm::Triple::mips64 ||
5434 getToolChain().getArch() == llvm::Triple::mips64el) {
5435 StringRef CPUName;
5436 StringRef ABIName;
5437 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005438
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005439 CmdArgs.push_back("-march");
5440 CmdArgs.push_back(CPUName.data());
5441
5442 // Convert ABI name to the GNU tools acceptable variant.
5443 if (ABIName == "o32")
5444 ABIName = "32";
5445 else if (ABIName == "n64")
5446 ABIName = "64";
5447
5448 CmdArgs.push_back("-mabi");
5449 CmdArgs.push_back(ABIName.data());
5450
5451 if (getToolChain().getArch() == llvm::Triple::mips ||
5452 getToolChain().getArch() == llvm::Triple::mips64)
5453 CmdArgs.push_back("-EB");
5454 else
5455 CmdArgs.push_back("-EL");
5456
5457 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5458 options::OPT_fpic, options::OPT_fno_pic,
5459 options::OPT_fPIE, options::OPT_fno_PIE,
5460 options::OPT_fpie, options::OPT_fno_pie);
5461 if (LastPICArg &&
5462 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5463 LastPICArg->getOption().matches(options::OPT_fpic) ||
5464 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5465 LastPICArg->getOption().matches(options::OPT_fpie))) {
5466 CmdArgs.push_back("-KPIC");
5467 }
5468 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005469
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005470 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5471 options::OPT_Xassembler);
5472
5473 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005474 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005475
5476 for (InputInfoList::const_iterator
5477 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5478 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005479 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005480 }
5481
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005482 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005483 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005484 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005485}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005486
5487void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005488 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005489 const InputInfoList &Inputs,
5490 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005491 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005492 const toolchains::FreeBSD& ToolChain =
5493 static_cast<const toolchains::FreeBSD&>(getToolChain());
5494 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005495 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005496
5497 // Silence warning for "clang -g foo.o -o foo"
5498 Args.ClaimAllArgs(options::OPT_g_Group);
5499 // and "clang -emit-llvm foo.o -o foo"
5500 Args.ClaimAllArgs(options::OPT_emit_llvm);
5501 // and for "clang -w foo.o -o foo". Other warning options are already
5502 // handled somewhere else.
5503 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005504
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005505 if (!D.SysRoot.empty())
5506 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5507
Roman Divackyafe2f232012-08-28 15:09:03 +00005508 if (Args.hasArg(options::OPT_pie))
5509 CmdArgs.push_back("-pie");
5510
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005511 if (Args.hasArg(options::OPT_static)) {
5512 CmdArgs.push_back("-Bstatic");
5513 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005514 if (Args.hasArg(options::OPT_rdynamic))
5515 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005516 CmdArgs.push_back("--eh-frame-hdr");
5517 if (Args.hasArg(options::OPT_shared)) {
5518 CmdArgs.push_back("-Bshareable");
5519 } else {
5520 CmdArgs.push_back("-dynamic-linker");
5521 CmdArgs.push_back("/libexec/ld-elf.so.1");
5522 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005523 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5524 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005525 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5526 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5527 CmdArgs.push_back("--hash-style=both");
5528 }
5529 }
5530 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005531 }
5532
5533 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5534 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005535 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005536 CmdArgs.push_back("-m");
5537 CmdArgs.push_back("elf_i386_fbsd");
5538 }
5539
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005540 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005541 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005542 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005543 }
5544
Daniel Dunbarb440f562010-08-02 02:38:21 +00005545 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005546 CmdArgs.push_back("-o");
5547 CmdArgs.push_back(Output.getFilename());
5548 } else {
5549 assert(Output.isNothing() && "Invalid output.");
5550 }
5551
5552 if (!Args.hasArg(options::OPT_nostdlib) &&
5553 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005554 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005555 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005556 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005557 crt1 = "gcrt1.o";
5558 else if (Args.hasArg(options::OPT_pie))
5559 crt1 = "Scrt1.o";
5560 else
5561 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005562 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005563 if (crt1)
5564 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5565
5566 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5567
5568 const char *crtbegin = NULL;
5569 if (Args.hasArg(options::OPT_static))
5570 crtbegin = "crtbeginT.o";
5571 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5572 crtbegin = "crtbeginS.o";
5573 else
5574 crtbegin = "crtbegin.o";
5575
5576 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005577 }
5578
5579 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005580 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005581 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5582 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005583 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005584 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5585 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005586 Args.AddAllArgs(CmdArgs, options::OPT_s);
5587 Args.AddAllArgs(CmdArgs, options::OPT_t);
5588 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5589 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005590
Roman Divackyafe2f232012-08-28 15:09:03 +00005591 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005592
5593 if (!Args.hasArg(options::OPT_nostdlib) &&
5594 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005595 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005596 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005597 if (Args.hasArg(options::OPT_pg))
5598 CmdArgs.push_back("-lm_p");
5599 else
5600 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005601 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005602 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5603 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005604 if (Args.hasArg(options::OPT_pg))
5605 CmdArgs.push_back("-lgcc_p");
5606 else
5607 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005608 if (Args.hasArg(options::OPT_static)) {
5609 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005610 } else if (Args.hasArg(options::OPT_pg)) {
5611 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005612 } else {
5613 CmdArgs.push_back("--as-needed");
5614 CmdArgs.push_back("-lgcc_s");
5615 CmdArgs.push_back("--no-as-needed");
5616 }
5617
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005618 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005619 if (Args.hasArg(options::OPT_pg))
5620 CmdArgs.push_back("-lpthread_p");
5621 else
5622 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005623 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005624
Roman Divacky66f22762011-02-10 16:59:40 +00005625 if (Args.hasArg(options::OPT_pg)) {
5626 if (Args.hasArg(options::OPT_shared))
5627 CmdArgs.push_back("-lc");
5628 else
5629 CmdArgs.push_back("-lc_p");
5630 CmdArgs.push_back("-lgcc_p");
5631 } else {
5632 CmdArgs.push_back("-lc");
5633 CmdArgs.push_back("-lgcc");
5634 }
5635
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005636 if (Args.hasArg(options::OPT_static)) {
5637 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005638 } else if (Args.hasArg(options::OPT_pg)) {
5639 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005640 } else {
5641 CmdArgs.push_back("--as-needed");
5642 CmdArgs.push_back("-lgcc_s");
5643 CmdArgs.push_back("--no-as-needed");
5644 }
5645 }
5646
5647 if (!Args.hasArg(options::OPT_nostdlib) &&
5648 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005649 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005650 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005651 else
5652 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005653 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005654 }
5655
Roman Divackyafe2f232012-08-28 15:09:03 +00005656 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005657
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005658 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005659 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005660 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005661}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005662
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005663void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5664 const InputInfo &Output,
5665 const InputInfoList &Inputs,
5666 const ArgList &Args,
5667 const char *LinkingOutput) const {
5668 ArgStringList CmdArgs;
5669
5670 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5671 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005672 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005673 CmdArgs.push_back("--32");
5674
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005675 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005676 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005677 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005678 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005679 CmdArgs.push_back("-EL");
5680
5681 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5682 options::OPT_Xassembler);
5683
5684 CmdArgs.push_back("-o");
5685 CmdArgs.push_back(Output.getFilename());
5686
5687 for (InputInfoList::const_iterator
5688 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5689 const InputInfo &II = *it;
5690 CmdArgs.push_back(II.getFilename());
5691 }
5692
David Chisnallddbd68f2011-09-27 22:03:18 +00005693 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005694 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5695}
5696
5697void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5698 const InputInfo &Output,
5699 const InputInfoList &Inputs,
5700 const ArgList &Args,
5701 const char *LinkingOutput) const {
5702 const Driver &D = getToolChain().getDriver();
5703 ArgStringList CmdArgs;
5704
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005705 if (!D.SysRoot.empty())
5706 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5707
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005708 if (Args.hasArg(options::OPT_static)) {
5709 CmdArgs.push_back("-Bstatic");
5710 } else {
5711 if (Args.hasArg(options::OPT_rdynamic))
5712 CmdArgs.push_back("-export-dynamic");
5713 CmdArgs.push_back("--eh-frame-hdr");
5714 if (Args.hasArg(options::OPT_shared)) {
5715 CmdArgs.push_back("-Bshareable");
5716 } else {
5717 CmdArgs.push_back("-dynamic-linker");
5718 CmdArgs.push_back("/libexec/ld.elf_so");
5719 }
5720 }
5721
5722 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5723 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005724 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005725 CmdArgs.push_back("-m");
5726 CmdArgs.push_back("elf_i386");
5727 }
5728
5729 if (Output.isFilename()) {
5730 CmdArgs.push_back("-o");
5731 CmdArgs.push_back(Output.getFilename());
5732 } else {
5733 assert(Output.isNothing() && "Invalid output.");
5734 }
5735
5736 if (!Args.hasArg(options::OPT_nostdlib) &&
5737 !Args.hasArg(options::OPT_nostartfiles)) {
5738 if (!Args.hasArg(options::OPT_shared)) {
5739 CmdArgs.push_back(Args.MakeArgString(
5740 getToolChain().GetFilePath("crt0.o")));
5741 CmdArgs.push_back(Args.MakeArgString(
5742 getToolChain().GetFilePath("crti.o")));
5743 CmdArgs.push_back(Args.MakeArgString(
5744 getToolChain().GetFilePath("crtbegin.o")));
5745 } else {
5746 CmdArgs.push_back(Args.MakeArgString(
5747 getToolChain().GetFilePath("crti.o")));
5748 CmdArgs.push_back(Args.MakeArgString(
5749 getToolChain().GetFilePath("crtbeginS.o")));
5750 }
5751 }
5752
5753 Args.AddAllArgs(CmdArgs, options::OPT_L);
5754 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5755 Args.AddAllArgs(CmdArgs, options::OPT_e);
5756 Args.AddAllArgs(CmdArgs, options::OPT_s);
5757 Args.AddAllArgs(CmdArgs, options::OPT_t);
5758 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5759 Args.AddAllArgs(CmdArgs, options::OPT_r);
5760
5761 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5762
5763 if (!Args.hasArg(options::OPT_nostdlib) &&
5764 !Args.hasArg(options::OPT_nodefaultlibs)) {
5765 if (D.CCCIsCXX) {
5766 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5767 CmdArgs.push_back("-lm");
5768 }
5769 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5770 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005771 if (Args.hasArg(options::OPT_static)) {
5772 CmdArgs.push_back("-lgcc_eh");
5773 } else {
5774 CmdArgs.push_back("--as-needed");
5775 CmdArgs.push_back("-lgcc_s");
5776 CmdArgs.push_back("--no-as-needed");
5777 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005778 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005779
5780 if (Args.hasArg(options::OPT_pthread))
5781 CmdArgs.push_back("-lpthread");
5782 CmdArgs.push_back("-lc");
5783
5784 CmdArgs.push_back("-lgcc");
5785 if (Args.hasArg(options::OPT_static)) {
5786 CmdArgs.push_back("-lgcc_eh");
5787 } else {
5788 CmdArgs.push_back("--as-needed");
5789 CmdArgs.push_back("-lgcc_s");
5790 CmdArgs.push_back("--no-as-needed");
5791 }
5792 }
5793
5794 if (!Args.hasArg(options::OPT_nostdlib) &&
5795 !Args.hasArg(options::OPT_nostartfiles)) {
5796 if (!Args.hasArg(options::OPT_shared))
5797 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5798 "crtend.o")));
5799 else
5800 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5801 "crtendS.o")));
5802 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5803 "crtn.o")));
5804 }
5805
Bill Wendling08760582011-06-27 19:15:03 +00005806 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005807
David Chisnallddbd68f2011-09-27 22:03:18 +00005808 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005809 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5810}
5811
Rafael Espindola92b00932010-08-10 00:25:48 +00005812void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5813 const InputInfo &Output,
5814 const InputInfoList &Inputs,
5815 const ArgList &Args,
5816 const char *LinkingOutput) const {
5817 ArgStringList CmdArgs;
5818
5819 // Add --32/--64 to make sure we get the format we want.
5820 // This is incomplete
5821 if (getToolChain().getArch() == llvm::Triple::x86) {
5822 CmdArgs.push_back("--32");
5823 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5824 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005825 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5826 CmdArgs.push_back("-a32");
5827 CmdArgs.push_back("-mppc");
5828 CmdArgs.push_back("-many");
5829 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5830 CmdArgs.push_back("-a64");
5831 CmdArgs.push_back("-mppc64");
5832 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005833 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005834 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005835 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5836 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005837
5838 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5839 getToolChain().getTriple());
5840 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005841
5842 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5843 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5844 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005845 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5846 getToolChain().getArch() == llvm::Triple::mipsel ||
5847 getToolChain().getArch() == llvm::Triple::mips64 ||
5848 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005849 StringRef CPUName;
5850 StringRef ABIName;
5851 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005852
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005853 CmdArgs.push_back("-march");
5854 CmdArgs.push_back(CPUName.data());
5855
5856 // Convert ABI name to the GNU tools acceptable variant.
5857 if (ABIName == "o32")
5858 ABIName = "32";
5859 else if (ABIName == "n64")
5860 ABIName = "64";
5861
5862 CmdArgs.push_back("-mabi");
5863 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005864
5865 if (getToolChain().getArch() == llvm::Triple::mips ||
5866 getToolChain().getArch() == llvm::Triple::mips64)
5867 CmdArgs.push_back("-EB");
5868 else
5869 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005870
5871 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5872 options::OPT_fpic, options::OPT_fno_pic,
5873 options::OPT_fPIE, options::OPT_fno_PIE,
5874 options::OPT_fpie, options::OPT_fno_pie);
5875 if (LastPICArg &&
5876 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5877 LastPICArg->getOption().matches(options::OPT_fpic) ||
5878 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5879 LastPICArg->getOption().matches(options::OPT_fpie))) {
5880 CmdArgs.push_back("-KPIC");
5881 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005882 }
5883
5884 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5885 options::OPT_Xassembler);
5886
5887 CmdArgs.push_back("-o");
5888 CmdArgs.push_back(Output.getFilename());
5889
5890 for (InputInfoList::const_iterator
5891 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5892 const InputInfo &II = *it;
5893 CmdArgs.push_back(II.getFilename());
5894 }
5895
5896 const char *Exec =
5897 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5898 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5899}
5900
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005901static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5902 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005903 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005904 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005905 Args.hasArg(options::OPT_static_libgcc);
5906 if (!D.CCCIsCXX)
5907 CmdArgs.push_back("-lgcc");
5908
5909 if (StaticLibgcc) {
5910 if (D.CCCIsCXX)
5911 CmdArgs.push_back("-lgcc");
5912 } else {
5913 if (!D.CCCIsCXX)
5914 CmdArgs.push_back("--as-needed");
5915 CmdArgs.push_back("-lgcc_s");
5916 if (!D.CCCIsCXX)
5917 CmdArgs.push_back("--no-as-needed");
5918 }
5919
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005920 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005921 CmdArgs.push_back("-lgcc_eh");
5922 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5923 CmdArgs.push_back("-lgcc");
5924}
5925
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005926static bool hasMipsN32ABIArg(const ArgList &Args) {
5927 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
Richard Smithbd55daf2012-11-01 04:30:05 +00005928 return A && (A->getValue() == StringRef("n32"));
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005929}
5930
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005931void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5932 const InputInfo &Output,
5933 const InputInfoList &Inputs,
5934 const ArgList &Args,
5935 const char *LinkingOutput) const {
5936 const toolchains::Linux& ToolChain =
5937 static_cast<const toolchains::Linux&>(getToolChain());
5938 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00005939 const bool isAndroid =
5940 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005941
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005942 ArgStringList CmdArgs;
5943
Rafael Espindolad1002f62010-11-15 18:28:16 +00005944 // Silence warning for "clang -g foo.o -o foo"
5945 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005946 // and "clang -emit-llvm foo.o -o foo"
5947 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005948 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005949 // handled somewhere else.
5950 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005951
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005952 if (!D.SysRoot.empty())
5953 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005954
Rafael Espindolad47ac232010-11-17 22:26:15 +00005955 if (Args.hasArg(options::OPT_pie))
5956 CmdArgs.push_back("-pie");
5957
Rafael Espindola1c76c592010-11-07 22:57:16 +00005958 if (Args.hasArg(options::OPT_rdynamic))
5959 CmdArgs.push_back("-export-dynamic");
5960
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005961 if (Args.hasArg(options::OPT_s))
5962 CmdArgs.push_back("-s");
5963
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005964 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5965 e = ToolChain.ExtraOpts.end();
5966 i != e; ++i)
5967 CmdArgs.push_back(i->c_str());
5968
5969 if (!Args.hasArg(options::OPT_static)) {
5970 CmdArgs.push_back("--eh-frame-hdr");
5971 }
5972
5973 CmdArgs.push_back("-m");
5974 if (ToolChain.getArch() == llvm::Triple::x86)
5975 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005976 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005977 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005978 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005979 else if (ToolChain.getArch() == llvm::Triple::ppc)
5980 CmdArgs.push_back("elf32ppclinux");
5981 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5982 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005983 else if (ToolChain.getArch() == llvm::Triple::mips)
5984 CmdArgs.push_back("elf32btsmip");
5985 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5986 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005987 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5988 if (hasMipsN32ABIArg(Args))
5989 CmdArgs.push_back("elf32btsmipn32");
5990 else
5991 CmdArgs.push_back("elf64btsmip");
5992 }
5993 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5994 if (hasMipsN32ABIArg(Args))
5995 CmdArgs.push_back("elf32ltsmipn32");
5996 else
5997 CmdArgs.push_back("elf64ltsmip");
5998 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005999 else
6000 CmdArgs.push_back("elf_x86_64");
6001
6002 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00006003 if (ToolChain.getArch() == llvm::Triple::arm
6004 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006005 CmdArgs.push_back("-Bstatic");
6006 else
6007 CmdArgs.push_back("-static");
6008 } else if (Args.hasArg(options::OPT_shared)) {
6009 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00006010 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006011 CmdArgs.push_back("-Bsymbolic");
6012 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006013 }
6014
6015 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00006016 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006017 (!Args.hasArg(options::OPT_static) &&
6018 !Args.hasArg(options::OPT_shared))) {
6019 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006020 if (isAndroid)
6021 CmdArgs.push_back("/system/bin/linker");
6022 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006023 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00006024 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00006025 ToolChain.getArch() == llvm::Triple::thumb) {
6026 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6027 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
6028 else
6029 CmdArgs.push_back("/lib/ld-linux.so.3");
6030 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00006031 else if (ToolChain.getArch() == llvm::Triple::mips ||
6032 ToolChain.getArch() == llvm::Triple::mipsel)
6033 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00006034 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00006035 ToolChain.getArch() == llvm::Triple::mips64el) {
6036 if (hasMipsN32ABIArg(Args))
6037 CmdArgs.push_back("/lib32/ld.so.1");
6038 else
6039 CmdArgs.push_back("/lib64/ld.so.1");
6040 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006041 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00006042 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00006043 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00006044 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006045 else
6046 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
6047 }
6048
6049 CmdArgs.push_back("-o");
6050 CmdArgs.push_back(Output.getFilename());
6051
Rafael Espindola81937ec2010-12-01 01:52:43 +00006052 if (!Args.hasArg(options::OPT_nostdlib) &&
6053 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006054 if (!isAndroid) {
6055 const char *crt1 = NULL;
6056 if (!Args.hasArg(options::OPT_shared)){
6057 if (Args.hasArg(options::OPT_pie))
6058 crt1 = "Scrt1.o";
6059 else
6060 crt1 = "crt1.o";
6061 }
6062 if (crt1)
6063 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006064
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006065 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6066 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006067
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006068 const char *crtbegin;
6069 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006070 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006071 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006072 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006073 else if (Args.hasArg(options::OPT_pie))
6074 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006075 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006076 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006077 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00006078
6079 // Add crtfastmath.o if available and fast math is enabled.
6080 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006081 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006082
6083 Args.AddAllArgs(CmdArgs, options::OPT_L);
6084
6085 const ToolChain::path_list Paths = ToolChain.getFilePaths();
6086
Roman Divackyee8188a2011-03-01 17:53:14 +00006087 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
6088 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006089 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006090
Rafael Espindola9446d762012-04-09 23:53:34 +00006091 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
6092 // as gold requires -plugin to come before any -plugin-opt that -Wl might
6093 // forward.
6094 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
6095 CmdArgs.push_back("-plugin");
6096 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
6097 CmdArgs.push_back(Args.MakeArgString(Plugin));
6098 }
6099
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00006100 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6101 CmdArgs.push_back("--no-demangle");
6102
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006103 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6104
Richard Smith52be6192012-11-05 22:04:41 +00006105 SanitizerArgs Sanitize = getSanitizerArgs(D, Args);
6106
Richard Smith4d3110a2012-10-25 02:14:12 +00006107 // Call this before we add the C++ ABI library.
Richard Smith52be6192012-11-05 22:04:41 +00006108 if (Sanitize.needsUbsanRt())
6109 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Richard Smith4d3110a2012-10-25 02:14:12 +00006110
Chandler Carruth94a32012012-05-14 18:31:18 +00006111 if (D.CCCIsCXX &&
6112 !Args.hasArg(options::OPT_nostdlib) &&
6113 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00006114 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
6115 !Args.hasArg(options::OPT_static);
6116 if (OnlyLibstdcxxStatic)
6117 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006118 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00006119 if (OnlyLibstdcxxStatic)
6120 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006121 CmdArgs.push_back("-lm");
6122 }
6123
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00006124 // Call this before we add the C run-time.
Richard Smith52be6192012-11-05 22:04:41 +00006125 if (Sanitize.needsAsanRt())
6126 addAsanRTLinux(getToolChain(), Args, CmdArgs);
6127 if (Sanitize.needsTsanRt())
6128 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00006129
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006130 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00006131 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
6132 if (Args.hasArg(options::OPT_static))
6133 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00006134
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006135 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006136
Chandler Carruth94a32012012-05-14 18:31:18 +00006137 if (Args.hasArg(options::OPT_pthread) ||
6138 Args.hasArg(options::OPT_pthreads))
6139 CmdArgs.push_back("-lpthread");
6140
6141 CmdArgs.push_back("-lc");
6142
6143 if (Args.hasArg(options::OPT_static))
6144 CmdArgs.push_back("--end-group");
6145 else
6146 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
6147 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00006148
Rafael Espindola81937ec2010-12-01 01:52:43 +00006149 if (!Args.hasArg(options::OPT_nostartfiles)) {
6150 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006151 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006152 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00006153 else if (Args.hasArg(options::OPT_pie))
6154 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00006155 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006156 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00006157
Rafael Espindola81937ec2010-12-01 01:52:43 +00006158 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006159 if (!isAndroid)
6160 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00006161 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006162 }
6163
Bill Wendling08760582011-06-27 19:15:03 +00006164 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006165
Rafael Espindolac8f008f2010-11-07 20:14:31 +00006166 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
6167}
Rafael Espindola92b00932010-08-10 00:25:48 +00006168
Chris Lattner3e2ee142010-07-07 16:01:42 +00006169void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006170 const InputInfo &Output,
6171 const InputInfoList &Inputs,
6172 const ArgList &Args,
6173 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006174 ArgStringList CmdArgs;
6175
6176 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6177 options::OPT_Xassembler);
6178
6179 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006180 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006181
6182 for (InputInfoList::const_iterator
6183 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6184 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006185 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00006186 }
6187
6188 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00006189 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006190 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006191}
6192
6193void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006194 const InputInfo &Output,
6195 const InputInfoList &Inputs,
6196 const ArgList &Args,
6197 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006198 const Driver &D = getToolChain().getDriver();
6199 ArgStringList CmdArgs;
6200
Daniel Dunbarb440f562010-08-02 02:38:21 +00006201 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006202 CmdArgs.push_back("-o");
6203 CmdArgs.push_back(Output.getFilename());
6204 } else {
6205 assert(Output.isNothing() && "Invalid output.");
6206 }
6207
6208 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006209 !Args.hasArg(options::OPT_nostartfiles)) {
6210 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6211 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6212 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6213 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6214 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006215
6216 Args.AddAllArgs(CmdArgs, options::OPT_L);
6217 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6218 Args.AddAllArgs(CmdArgs, options::OPT_e);
6219
Daniel Dunbar54423b22010-09-17 00:24:54 +00006220 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006221
Eli Friedman83de5132011-12-08 23:54:21 +00006222 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6223
Chris Lattner3e2ee142010-07-07 16:01:42 +00006224 if (!Args.hasArg(options::OPT_nostdlib) &&
6225 !Args.hasArg(options::OPT_nodefaultlibs)) {
6226 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006227 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006228 CmdArgs.push_back("-lm");
6229 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006230 }
6231
6232 if (!Args.hasArg(options::OPT_nostdlib) &&
6233 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006234 if (Args.hasArg(options::OPT_pthread))
6235 CmdArgs.push_back("-lpthread");
6236 CmdArgs.push_back("-lc");
6237 CmdArgs.push_back("-lCompilerRT-Generic");
6238 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6239 CmdArgs.push_back(
6240 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006241 }
6242
Eli Friedman83de5132011-12-08 23:54:21 +00006243 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006244 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006245}
6246
Daniel Dunbarcc912342009-05-02 18:28:39 +00006247/// DragonFly Tools
6248
6249// For now, DragonFly Assemble does just about the same as for
6250// FreeBSD, but this may change soon.
6251void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006252 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006253 const InputInfoList &Inputs,
6254 const ArgList &Args,
6255 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006256 ArgStringList CmdArgs;
6257
6258 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6259 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006260 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006261 CmdArgs.push_back("--32");
6262
6263 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6264 options::OPT_Xassembler);
6265
6266 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006267 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006268
6269 for (InputInfoList::const_iterator
6270 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6271 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006272 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006273 }
6274
6275 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006276 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006277 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006278}
6279
6280void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006281 const InputInfo &Output,
6282 const InputInfoList &Inputs,
6283 const ArgList &Args,
6284 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006285 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006286 ArgStringList CmdArgs;
6287
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006288 if (!D.SysRoot.empty())
6289 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6290
Daniel Dunbarcc912342009-05-02 18:28:39 +00006291 if (Args.hasArg(options::OPT_static)) {
6292 CmdArgs.push_back("-Bstatic");
6293 } else {
6294 if (Args.hasArg(options::OPT_shared))
6295 CmdArgs.push_back("-Bshareable");
6296 else {
6297 CmdArgs.push_back("-dynamic-linker");
6298 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6299 }
6300 }
6301
6302 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6303 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006304 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006305 CmdArgs.push_back("-m");
6306 CmdArgs.push_back("elf_i386");
6307 }
6308
Daniel Dunbarb440f562010-08-02 02:38:21 +00006309 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006310 CmdArgs.push_back("-o");
6311 CmdArgs.push_back(Output.getFilename());
6312 } else {
6313 assert(Output.isNothing() && "Invalid output.");
6314 }
6315
6316 if (!Args.hasArg(options::OPT_nostdlib) &&
6317 !Args.hasArg(options::OPT_nostartfiles)) {
6318 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006319 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006320 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006321 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006322 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006323 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006324 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006325 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006326 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006327 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006328 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006329 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006330 }
6331 }
6332
6333 Args.AddAllArgs(CmdArgs, options::OPT_L);
6334 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6335 Args.AddAllArgs(CmdArgs, options::OPT_e);
6336
Daniel Dunbar54423b22010-09-17 00:24:54 +00006337 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006338
6339 if (!Args.hasArg(options::OPT_nostdlib) &&
6340 !Args.hasArg(options::OPT_nodefaultlibs)) {
6341 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6342 // rpaths
6343 CmdArgs.push_back("-L/usr/lib/gcc41");
6344
6345 if (!Args.hasArg(options::OPT_static)) {
6346 CmdArgs.push_back("-rpath");
6347 CmdArgs.push_back("/usr/lib/gcc41");
6348
6349 CmdArgs.push_back("-rpath-link");
6350 CmdArgs.push_back("/usr/lib/gcc41");
6351
6352 CmdArgs.push_back("-rpath");
6353 CmdArgs.push_back("/usr/lib");
6354
6355 CmdArgs.push_back("-rpath-link");
6356 CmdArgs.push_back("/usr/lib");
6357 }
6358
Rafael Espindola38360b32010-07-20 12:59:03 +00006359 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006360 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006361 CmdArgs.push_back("-lm");
6362 }
6363
Daniel Dunbarcc912342009-05-02 18:28:39 +00006364 if (Args.hasArg(options::OPT_shared)) {
6365 CmdArgs.push_back("-lgcc_pic");
6366 } else {
6367 CmdArgs.push_back("-lgcc");
6368 }
6369
6370
6371 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006372 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006373
6374 if (!Args.hasArg(options::OPT_nolibc)) {
6375 CmdArgs.push_back("-lc");
6376 }
6377
6378 if (Args.hasArg(options::OPT_shared)) {
6379 CmdArgs.push_back("-lgcc_pic");
6380 } else {
6381 CmdArgs.push_back("-lgcc");
6382 }
6383 }
6384
6385 if (!Args.hasArg(options::OPT_nostdlib) &&
6386 !Args.hasArg(options::OPT_nostartfiles)) {
6387 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006388 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006389 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006390 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006391 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006392 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006393 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006394 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006395 }
6396
Bill Wendling08760582011-06-27 19:15:03 +00006397 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006398
Daniel Dunbarcc912342009-05-02 18:28:39 +00006399 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006400 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006401 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006402}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006403
6404void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6405 const InputInfo &Output,
6406 const InputInfoList &Inputs,
6407 const ArgList &Args,
6408 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006409 ArgStringList CmdArgs;
6410
6411 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006412 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6413 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006414 } else {
6415 assert(Output.isNothing() && "Invalid output.");
6416 }
6417
6418 if (!Args.hasArg(options::OPT_nostdlib) &&
6419 !Args.hasArg(options::OPT_nostartfiles)) {
6420 CmdArgs.push_back("-defaultlib:libcmt");
6421 }
6422
6423 CmdArgs.push_back("-nologo");
6424
Michael J. Spencere2f49362012-06-18 16:56:04 +00006425 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6426
6427 // Add filenames immediately.
6428 for (InputInfoList::const_iterator
6429 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6430 if (it->isFilename())
6431 CmdArgs.push_back(it->getFilename());
6432 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006433
6434 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006435 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006436 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6437}