blob: a4153515de5573eb08a1893cb566b321683ce7b8 [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);
Bill Wendling281ca292012-03-12 21:22:35 +000096 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
Nico Weber89355782012-03-19 15:00:03 +0000110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
Bill Wendling281ca292012-03-12 21:22:35 +0000111 }
Nico Weber89355782012-03-19 15:00:03 +0000112 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122}
123
Daniel Dunbar54423b22010-09-17 00:24:54 +0000124static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
Daniel Dunbar54423b22010-09-17 00:24:54 +0000133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000144 << TC.getTripleString();
145 }
146
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000147 // Add filenames immediately.
148 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000149 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000161 } else
162 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164
165 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167}
168
John McCall31168b02011-06-15 23:02:42 +0000169/// \brief Determine whether Objective-C automated reference counting is
170/// enabled.
171static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173}
174
Ted Kremeneke65b0862012-03-06 20:05:56 +0000175/// \brief Determine whether we are linking the ObjC runtime.
176static bool isObjCRuntimeLinked(const ArgList &Args) {
177 if (isObjCAutoRefCount(Args))
178 return true;
179 return Args.hasArg(options::OPT_fobjc_link_runtime);
180}
181
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000182static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000183 ArgStringList &CmdArgs,
184 llvm::Triple Triple) {
185 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
186 Args.hasArg(options::OPT_fprofile_generate) ||
187 Args.hasArg(options::OPT_fcreate_profile) ||
188 Args.hasArg(options::OPT_coverage)))
189 return;
190
191 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
192 // the link line. We cannot do the same thing because unlike gcov there is a
193 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
194 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000195 std::string ProfileRT =
196 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000197
Bill Wendling08760582011-06-27 19:15:03 +0000198 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000199}
200
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000201void Clang::AddPreprocessingOptions(Compilation &C,
202 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000203 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000204 ArgStringList &CmdArgs,
205 const InputInfo &Output,
206 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000207 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000208
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000209 CheckPreprocessingOptions(D, Args);
210
211 Args.AddLastArg(CmdArgs, options::OPT_C);
212 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000213
214 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000215 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000216 (A = Args.getLastArg(options::OPT_MD)) ||
217 (A = Args.getLastArg(options::OPT_MMD))) {
218 // Determine the output location.
219 const char *DepFile;
220 if (Output.getType() == types::TY_Dependencies) {
Daniel Dunbarb440f562010-08-02 02:38:21 +0000221 DepFile = Output.getFilename();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000222 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
223 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000224 C.addFailureResultFile(DepFile);
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000225 } else if (A->getOption().matches(options::OPT_M) ||
226 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000227 DepFile = "-";
228 } else {
229 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000230 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000231 }
232 CmdArgs.push_back("-dependency-file");
233 CmdArgs.push_back(DepFile);
234
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000235 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000236 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
237 const char *DepTarget;
238
239 // If user provided -o, that is the dependency target, except
240 // when we are only generating a dependency file.
241 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
242 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
243 DepTarget = OutputOpt->getValue(Args);
244 } else {
245 // Otherwise derive from the base input.
246 //
247 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000248 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000249 llvm::sys::path::replace_extension(P, "o");
250 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000251 }
252
253 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000254 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000255 QuoteTarget(DepTarget, Quoted);
256 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000257 }
258
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000259 if (A->getOption().matches(options::OPT_M) ||
260 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000261 CmdArgs.push_back("-sys-header-deps");
262 }
263
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000264 if (Args.hasArg(options::OPT_MG)) {
265 if (!A || A->getOption().matches(options::OPT_MD) ||
266 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000267 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000268 CmdArgs.push_back("-MG");
269 }
270
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000271 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000272
273 // Convert all -MQ <target> args to -MT <quoted target>
274 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
275 options::OPT_MQ),
276 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000277 const Arg *A = *it;
278 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000279
Daniel Dunbara442fd52010-06-11 22:00:13 +0000280 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000281 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000282 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000283 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000284 CmdArgs.push_back(Args.MakeArgString(Quoted));
285
286 // -MT flag - no change
287 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000288 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000289 }
290 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000291
Douglas Gregor111af7d2009-04-18 00:34:01 +0000292 // Add -i* options, and automatically translate to
293 // -include-pch/-include-pth for transparent PCH support. It's
294 // wonky, but we include looking for .gch so we can support seamless
295 // replacement into a build system already set up to be generating
296 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000297 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000298 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
299 ie = Args.filtered_end(); it != ie; ++it) {
300 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000301
302 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000303 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
304 RenderedImplicitInclude = true;
305
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000306 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000307 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000308
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000310 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000312 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000313 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000314 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000315 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000316 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000317 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000319 }
320
Douglas Gregor111af7d2009-04-18 00:34:01 +0000321 if (!FoundPCH) {
322 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000323 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000324 FoundPTH = true;
325 else
326 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000327 }
328
Douglas Gregor111af7d2009-04-18 00:34:01 +0000329 if (!FoundPCH && !FoundPTH) {
330 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000331 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000332 FoundPCH = UsePCH;
333 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000334 }
Mike Stump11289f42009-09-09 15:08:12 +0000335 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000336 P.eraseSuffix();
337 }
338
339 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000340 if (IsFirstImplicitInclude) {
341 A->claim();
342 if (UsePCH)
343 CmdArgs.push_back("-include-pch");
344 else
345 CmdArgs.push_back("-include-pth");
346 CmdArgs.push_back(Args.MakeArgString(P.str()));
347 continue;
348 } else {
349 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000350 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000351 << P.str() << A->getAsString(Args);
352 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000353 }
354 }
355
356 // Not translated, render as usual.
357 A->claim();
358 A->render(Args, CmdArgs);
359 }
360
361 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000362 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
363 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000364
365 // Add -Wp, and -Xassembler if using the preprocessor.
366
367 // FIXME: There is a very unfortunate problem here, some troubled
368 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
369 // really support that we would have to parse and then translate
370 // those options. :(
371 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
372 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000373
374 // -I- is a deprecated GCC feature, reject it.
375 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000376 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000377
378 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
379 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000380 StringRef sysroot = C.getSysRoot();
381 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000382 if (!Args.hasArg(options::OPT_isysroot)) {
383 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000384 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000385 }
386 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000387
388 // If a module path was provided, pass it along. Otherwise, use a temporary
389 // directory.
390 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000391 A->claim();
392 A->render(Args, CmdArgs);
393 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000394 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000395 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
396 DefaultModuleCache);
397 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
398 CmdArgs.push_back("-fmodule-cache-path");
399 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
400 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000401
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000402 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000403 // FIXME: We should probably sink the logic for handling these from the
404 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000405 // CPATH - included following the user specified includes (but prior to
406 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000407 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000408 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000412 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000414 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000416
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000417 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000418 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000419 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000420
421 // Add system include arguments.
422 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000423}
424
Daniel Dunbarf492c922009-09-10 22:59:51 +0000425/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000426/// CPU.
427//
428// FIXME: This is redundant with -mcpu, why does LLVM use this.
429// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000430static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000431 return llvm::StringSwitch<const char *>(CPU)
432 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
433 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
434 .Cases("arm920", "arm920t", "arm922t", "v4t")
435 .Cases("arm940t", "ep9312","v4t")
436 .Cases("arm10tdmi", "arm1020t", "v5")
437 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
438 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
439 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
440 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
441 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
442 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
443 .Cases("cortex-a8", "cortex-a9", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000444 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000445 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000446 .Case("cortex-m0", "v6m")
Chad Rosier9ac84512011-10-07 17:48:56 +0000447 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000448}
449
Benjamin Kramer09811c72012-06-26 22:20:06 +0000450/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
451//
452// FIXME: tblgen this.
453static std::string getARMTargetCPU(const ArgList &Args,
454 const llvm::Triple &Triple) {
455 // FIXME: Warn on inconsistent use of -mcpu and -march.
456
457 // If we have -mcpu=, use that.
458 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
459 StringRef MCPU = A->getValue(Args);
460 // Handle -mcpu=native.
461 if (MCPU == "native")
462 return llvm::sys::getHostCPUName();
463 else
464 return MCPU;
465 }
466
467 StringRef MArch;
468 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
469 // Otherwise, if we have -march= choose the base CPU for that arch.
470 MArch = A->getValue(Args);
471 } else {
472 // Otherwise, use the Arch from the triple.
473 MArch = Triple.getArchName();
474 }
475
476 // Handle -march=native.
477 std::string NativeMArch;
478 if (MArch == "native") {
479 std::string CPU = llvm::sys::getHostCPUName();
480 if (CPU != "generic") {
481 // Translate the native cpu into the architecture. The switch below will
482 // then chose the minimum cpu for that arch.
483 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
484 MArch = NativeMArch;
485 }
486 }
487
488 return llvm::StringSwitch<const char *>(MArch)
489 .Cases("armv2", "armv2a","arm2")
490 .Case("armv3", "arm6")
491 .Case("armv3m", "arm7m")
492 .Cases("armv4", "armv4t", "arm7tdmi")
493 .Cases("armv5", "armv5t", "arm10tdmi")
494 .Cases("armv5e", "armv5te", "arm1022e")
495 .Case("armv5tej", "arm926ej-s")
496 .Cases("armv6", "armv6k", "arm1136jf-s")
497 .Case("armv6j", "arm1136j-s")
498 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
499 .Case("armv6t2", "arm1156t2-s")
500 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
501 .Cases("armv7r", "armv7-r", "cortex-r4")
502 .Cases("armv7m", "armv7-m", "cortex-m3")
503 .Case("ep9312", "ep9312")
504 .Case("iwmmxt", "iwmmxt")
505 .Case("xscale", "xscale")
506 .Cases("armv6m", "armv6-m", "cortex-m0")
507 // If all else failed, return the most base CPU LLVM supports.
508 .Default("arm7tdmi");
509}
510
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000511// FIXME: Move to target hook.
512static bool isSignedCharDefault(const llvm::Triple &Triple) {
513 switch (Triple.getArch()) {
514 default:
515 return true;
516
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000517 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000518 case llvm::Triple::ppc:
519 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000520 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000521 return true;
522 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 }
524}
525
Chad Rosiercfbfc582012-04-04 20:51:35 +0000526// Handle -mfpu=.
527//
528// FIXME: Centralize feature selection, defaulting shouldn't be also in the
529// frontend target.
530static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
531 ArgStringList &CmdArgs) {
532 StringRef FPU = A->getValue(Args);
533
534 // Set the target features based on the FPU.
535 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
536 // Disable any default FPU support.
537 CmdArgs.push_back("-target-feature");
538 CmdArgs.push_back("-vfp2");
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp3");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-neon");
543 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
544 CmdArgs.push_back("-target-feature");
545 CmdArgs.push_back("+vfp3");
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+d16");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("-neon");
550 } else if (FPU == "vfp") {
551 CmdArgs.push_back("-target-feature");
552 CmdArgs.push_back("+vfp2");
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("-neon");
555 } else if (FPU == "vfp3" || FPU == "vfpv3") {
556 CmdArgs.push_back("-target-feature");
557 CmdArgs.push_back("+vfp3");
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("-neon");
560 } else if (FPU == "neon") {
561 CmdArgs.push_back("-target-feature");
562 CmdArgs.push_back("+neon");
563 } else
564 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
565}
566
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000567// Handle -mfpmath=.
568static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000569 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000570 StringRef FPMath = A->getValue(Args);
571
572 // Set the target features based on the FPMath.
573 if (FPMath == "neon") {
574 CmdArgs.push_back("-target-feature");
575 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000576
577 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
578 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
579
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000580 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
581 FPMath == "vfp4") {
582 CmdArgs.push_back("-target-feature");
583 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000584
585 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000586 } else
587 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
588}
589
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000590// Select the float ABI as determined by -msoft-float, -mhard-float, and
591// -mfloat-abi=.
592static StringRef getARMFloatABI(const Driver &D,
593 const ArgList &Args,
594 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000595 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000596 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
597 options::OPT_mhard_float,
598 options::OPT_mfloat_abi_EQ)) {
599 if (A->getOption().matches(options::OPT_msoft_float))
600 FloatABI = "soft";
601 else if (A->getOption().matches(options::OPT_mhard_float))
602 FloatABI = "hard";
603 else {
604 FloatABI = A->getValue(Args);
605 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000606 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 << A->getAsString(Args);
608 FloatABI = "soft";
609 }
610 }
611 }
612
613 // If unspecified, choose the default based on the platform.
614 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000615 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000616 case llvm::Triple::Darwin:
617 case llvm::Triple::MacOSX:
618 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000619 // Darwin defaults to "softfp" for v6 and v7.
620 //
621 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000622 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000623 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000624 if (StringRef(ArchName).startswith("v6") ||
625 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000626 FloatABI = "softfp";
627 else
628 FloatABI = "soft";
629 break;
630 }
631
Rafael Espindolab1ef8ff2010-06-27 18:29:21 +0000632 case llvm::Triple::Linux: {
Bob Wilson8c9052b2011-12-08 01:10:19 +0000633 if (Triple.getEnvironment() == llvm::Triple::GNUEABI) {
Rafael Espindolab1ef8ff2010-06-27 18:29:21 +0000634 FloatABI = "softfp";
635 break;
636 }
637 }
638 // fall through
639
Daniel Dunbar78485922009-09-10 23:00:09 +0000640 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000641 switch(Triple.getEnvironment()) {
642 case llvm::Triple::GNUEABI:
643 FloatABI = "softfp";
644 break;
645 case llvm::Triple::EABI:
646 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
647 FloatABI = "softfp";
648 break;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000649 case llvm::Triple::ANDROIDEABI: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000652 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000653 FloatABI = "softfp";
654 else
655 FloatABI = "soft";
656 break;
657 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000658 default:
659 // Assume "soft", but warn the user we are guessing.
660 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000661 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000662 break;
663 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000664 }
665 }
666
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000667 return FloatABI;
668}
669
670
671void Clang::AddARMTargetArgs(const ArgList &Args,
672 ArgStringList &CmdArgs,
673 bool KernelOrKext) const {
674 const Driver &D = getToolChain().getDriver();
675 llvm::Triple Triple = getToolChain().getTriple();
676
677 // Select the ABI to use.
678 //
679 // FIXME: Support -meabi.
680 const char *ABIName = 0;
681 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
682 ABIName = A->getValue(Args);
683 } else {
684 // Select the default based on the platform.
685 switch(Triple.getEnvironment()) {
686 case llvm::Triple::ANDROIDEABI:
687 case llvm::Triple::GNUEABI:
688 ABIName = "aapcs-linux";
689 break;
690 case llvm::Triple::EABI:
691 ABIName = "aapcs";
692 break;
693 default:
694 ABIName = "apcs-gnu";
695 }
696 }
697 CmdArgs.push_back("-target-abi");
698 CmdArgs.push_back(ABIName);
699
700 // Set the CPU based on -march= and -mcpu=.
701 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000702 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000703
704 // Determine floating point ABI from the options & target defaults.
705 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000706 if (FloatABI == "soft") {
707 // Floating point operations and argument passing are soft.
708 //
709 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000710 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000711 CmdArgs.push_back("-mfloat-abi");
712 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000713 } else if (FloatABI == "softfp") {
714 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000715 CmdArgs.push_back("-mfloat-abi");
716 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000717 } else {
718 // Floating point operations and argument passing are hard.
719 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000720 CmdArgs.push_back("-mfloat-abi");
721 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000722 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000723
724 // Set appropriate target features for floating point mode.
725 //
726 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
727 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
728 // stripped out by the ARM target.
729
730 // Use software floating point operations?
731 if (FloatABI == "soft") {
732 CmdArgs.push_back("-target-feature");
733 CmdArgs.push_back("+soft-float");
734 }
735
736 // Use software floating point argument passing?
737 if (FloatABI != "hard") {
738 CmdArgs.push_back("-target-feature");
739 CmdArgs.push_back("+soft-float-abi");
740 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000741
742 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000743 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000744 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000745
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000746 // Honor -mfpmath=.
747 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000748 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000749
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000750 // Setting -msoft-float effectively disables NEON because of the GCC
751 // implementation, although the same isn't true of VFP or VFP3.
752 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000753 CmdArgs.push_back("-target-feature");
754 CmdArgs.push_back("-neon");
755 }
756
757 // Kernel code has more strict alignment requirements.
758 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000759 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000760 CmdArgs.push_back("-arm-long-calls");
761
Daniel Dunbar12100e22011-03-22 16:48:17 +0000762 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000763 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000764
765 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000766 CmdArgs.push_back("-backend-option");
767 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000768 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000769
770 // Setting -mno-global-merge disables the codegen global merge pass. Setting
771 // -mglobal-merge has no effect as the pass is enabled by default.
772 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
773 options::OPT_mno_global_merge)) {
774 if (A->getOption().matches(options::OPT_mno_global_merge))
775 CmdArgs.push_back("-mno-global-merge");
776 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000777
Chad Rosierc14ded72012-05-16 21:19:55 +0000778 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000779 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000780}
781
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000782// Get default architecture.
783static const char* getMipsArchFromCPU(StringRef CPUName) {
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000784 if (CPUName == "mips32" || CPUName == "mips32r2")
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000785 return "mips";
786
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000787 assert((CPUName == "mips64" || CPUName == "mips64r2") &&
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000788 "Unexpected cpu name.");
789
790 return "mips64";
791}
792
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000793// Check that ArchName is a known Mips architecture name.
794static bool checkMipsArchName(StringRef ArchName) {
795 return ArchName == "mips" ||
796 ArchName == "mipsel" ||
797 ArchName == "mips64" ||
798 ArchName == "mips64el";
799}
800
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000801// Get default target cpu.
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000802static const char* getMipsCPUFromArch(StringRef ArchName) {
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000803 if (ArchName == "mips" || ArchName == "mipsel")
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000804 return "mips32";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000805
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000806 assert((ArchName == "mips64" || ArchName == "mips64el") &&
807 "Unexpected arch name.");
808
809 return "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000810}
811
812// Get default ABI.
813static const char* getMipsABIFromArch(StringRef ArchName) {
814 if (ArchName == "mips" || ArchName == "mipsel")
815 return "o32";
816
817 assert((ArchName == "mips64" || ArchName == "mips64el") &&
818 "Unexpected arch name.");
819 return "n64";
820}
821
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000822// Get CPU and ABI names. They are not independent
823// so we have to calculate them together.
824static void getMipsCPUAndABI(const ArgList &Args,
825 const ToolChain &TC,
826 StringRef &CPUName,
827 StringRef &ABIName) {
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000828 StringRef ArchName;
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000829
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000830 // Select target cpu and architecture.
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000831 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
832 CPUName = A->getValue(Args);
833 ArchName = getMipsArchFromCPU(CPUName);
834 }
835 else {
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000836 ArchName = Args.MakeArgString(TC.getArchName());
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000837 if (!checkMipsArchName(ArchName))
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000838 TC.getDriver().Diag(diag::err_drv_invalid_arch_name) << ArchName;
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000839 else
840 CPUName = getMipsCPUFromArch(ArchName);
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000841 }
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000842
Eric Christopher0b26a612010-03-02 02:41:08 +0000843 // Select the ABI to use.
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000844 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000845 ABIName = A->getValue(Args);
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000846 else
847 ABIName = getMipsABIFromArch(ArchName);
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000848}
849
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000850// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
851// and -mfloat-abi=.
852static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000853 // Select the float ABI as determined by -msoft-float, -mhard-float,
854 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000855 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000856 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000857 options::OPT_mhard_float,
858 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000859 if (A->getOption().matches(options::OPT_msoft_float))
860 FloatABI = "soft";
861 else if (A->getOption().matches(options::OPT_mhard_float))
862 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000863 else {
864 FloatABI = A->getValue(Args);
865 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000866 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000867 FloatABI = "hard";
868 }
869 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000870 }
871
872 // If unspecified, choose the default based on the platform.
873 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000874 // Assume "hard", because it's a default value used by gcc.
875 // When we start to recognize specific target MIPS processors,
876 // we will be able to select the default more correctly.
877 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000878 }
879
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000880 return FloatABI;
881}
882
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000883static void AddTargetFeature(const ArgList &Args,
884 ArgStringList &CmdArgs,
885 OptSpecifier OnOpt,
886 OptSpecifier OffOpt,
887 StringRef FeatureName) {
888 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
889 CmdArgs.push_back("-target-feature");
890 if (A->getOption().matches(OnOpt))
891 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
892 else
893 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
894 }
895}
896
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000897void Clang::AddMIPSTargetArgs(const ArgList &Args,
898 ArgStringList &CmdArgs) const {
899 const Driver &D = getToolChain().getDriver();
900 StringRef CPUName;
901 StringRef ABIName;
902 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
903
904 CmdArgs.push_back("-target-cpu");
905 CmdArgs.push_back(CPUName.data());
906
907 CmdArgs.push_back("-target-abi");
908 CmdArgs.push_back(ABIName.data());
909
910 StringRef FloatABI = getMipsFloatABI(D, Args);
911
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 if (FloatABI == "soft") {
913 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000914 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
917
918 // FIXME: Note, this is a hack. We need to pass the selected float
919 // mode to the MipsTargetInfoBase to define appropriate macros there.
920 // Now it is the only method.
921 CmdArgs.push_back("-target-feature");
922 CmdArgs.push_back("+soft-float");
923 }
924 else if (FloatABI == "single") {
925 // Restrict the use of hardware floating-point
926 // instructions to 32-bit operations.
927 CmdArgs.push_back("-target-feature");
928 CmdArgs.push_back("+single-float");
929 }
930 else {
931 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000932 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000933 CmdArgs.push_back("-mfloat-abi");
934 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000935 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000936
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000937 AddTargetFeature(Args, CmdArgs,
938 options::OPT_mips16, options::OPT_mno_mips16,
939 "mips16");
Eric Christopher0b26a612010-03-02 02:41:08 +0000940}
941
Hal Finkel8eb59282012-06-11 22:35:19 +0000942/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
943static std::string getPPCTargetCPU(const ArgList &Args) {
944 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
945 StringRef CPUName = A->getValue(Args);
946
947 if (CPUName == "native") {
948 std::string CPU = llvm::sys::getHostCPUName();
949 if (!CPU.empty() && CPU != "generic")
950 return CPU;
951 else
952 return "";
953 }
954
955 return llvm::StringSwitch<const char *>(CPUName)
956 .Case("common", "generic")
957 .Case("440", "440")
958 .Case("440fp", "440")
959 .Case("450", "450")
960 .Case("601", "601")
961 .Case("602", "602")
962 .Case("603", "603")
963 .Case("603e", "603e")
964 .Case("603ev", "603ev")
965 .Case("604", "604")
966 .Case("604e", "604e")
967 .Case("620", "620")
968 .Case("G3", "g3")
969 .Case("7400", "7400")
970 .Case("G4", "g4")
971 .Case("7450", "7450")
972 .Case("G4+", "g4+")
973 .Case("750", "750")
974 .Case("970", "970")
975 .Case("G5", "g5")
976 .Case("a2", "a2")
977 .Case("power6", "pwr6")
978 .Case("power7", "pwr7")
979 .Case("powerpc", "ppc")
980 .Case("powerpc64", "ppc64")
981 .Default("");
982 }
983
984 return "";
985}
986
987void Clang::AddPPCTargetArgs(const ArgList &Args,
988 ArgStringList &CmdArgs) const {
989 std::string TargetCPUName = getPPCTargetCPU(Args);
990
991 // LLVM may default to generating code for the native CPU,
992 // but, like gcc, we default to a more generic option for
993 // each architecture. (except on Darwin)
994 llvm::Triple Triple = getToolChain().getTriple();
995 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
996 if (Triple.getArch() == llvm::Triple::ppc64)
997 TargetCPUName = "ppc64";
998 else
999 TargetCPUName = "ppc";
1000 }
1001
1002 if (!TargetCPUName.empty()) {
1003 CmdArgs.push_back("-target-cpu");
1004 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1005 }
1006}
1007
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001008void Clang::AddSparcTargetArgs(const ArgList &Args,
1009 ArgStringList &CmdArgs) const {
1010 const Driver &D = getToolChain().getDriver();
1011
1012 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001013 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001014 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001015 }
1016
1017 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001018 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001019 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1020 options::OPT_mhard_float)) {
1021 if (A->getOption().matches(options::OPT_msoft_float))
1022 FloatABI = "soft";
1023 else if (A->getOption().matches(options::OPT_mhard_float))
1024 FloatABI = "hard";
1025 }
1026
1027 // If unspecified, choose the default based on the platform.
1028 if (FloatABI.empty()) {
1029 switch (getToolChain().getTriple().getOS()) {
1030 default:
1031 // Assume "soft", but warn the user we are guessing.
1032 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001033 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001034 break;
1035 }
1036 }
1037
1038 if (FloatABI == "soft") {
1039 // Floating point operations and argument passing are soft.
1040 //
1041 // FIXME: This changes CPP defines, we need -target-soft-float.
1042 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001043 CmdArgs.push_back("-target-feature");
1044 CmdArgs.push_back("+soft-float");
1045 } else {
1046 assert(FloatABI == "hard" && "Invalid float abi!");
1047 CmdArgs.push_back("-mhard-float");
1048 }
1049}
1050
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001051void Clang::AddX86TargetArgs(const ArgList &Args,
1052 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001053 if (!Args.hasFlag(options::OPT_mred_zone,
1054 options::OPT_mno_red_zone,
1055 true) ||
1056 Args.hasArg(options::OPT_mkernel) ||
1057 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001058 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001059
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001060 if (Args.hasFlag(options::OPT_msoft_float,
1061 options::OPT_mno_soft_float,
1062 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001063 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001064
Daniel Dunbare13ada62009-11-14 22:04:54 +00001065 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001066 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001067 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001068 // FIXME: Reject attempts to use -march=native unless the target matches
1069 // the host.
1070 //
1071 // FIXME: We should also incorporate the detected target features for use
1072 // with -native.
1073 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001074 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001075 CPUName = Args.MakeArgString(CPU);
1076 } else
1077 CPUName = A->getValue(Args);
1078 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001079
Daniel Dunbare13ada62009-11-14 22:04:54 +00001080 // Select the default CPU if none was given (or detection failed).
1081 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001082 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001083 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001084 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001085 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001086 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001087 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001088 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001089 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001090 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001091 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001092 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001093 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001094 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001095 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001096 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001097 CPUName = "i486";
Roman Divacky432f10d2011-03-01 18:11:37 +00001098 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001099 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001100 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001101 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001102 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001103 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001104 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001105 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001106 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001107 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001108 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001110 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001111 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001112 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001113 }
1114 }
1115
Daniel Dunbare13ada62009-11-14 22:04:54 +00001116 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001117 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001118 CmdArgs.push_back(CPUName);
1119 }
1120
Eli Friedmanad811f02011-07-02 00:34:19 +00001121 // The required algorithm here is slightly strange: the options are applied
1122 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1123 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1124 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1125 // former correctly, but not the latter; handle directly-overridden
1126 // attributes here.
1127 llvm::StringMap<unsigned> PrevFeature;
1128 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001129 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1130 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001131 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001132 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001133
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001134 // Skip over "-m".
1135 assert(Name.startswith("-m") && "Invalid feature name.");
1136 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001137
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001138 bool IsNegative = Name.startswith("no-");
1139 if (IsNegative)
1140 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001141
Eli Friedmanad811f02011-07-02 00:34:19 +00001142 unsigned& Prev = PrevFeature[Name];
1143 if (Prev)
1144 Features[Prev - 1] = 0;
1145 Prev = Features.size() + 1;
1146 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1147 }
1148 for (unsigned i = 0; i < Features.size(); i++) {
1149 if (Features[i]) {
1150 CmdArgs.push_back("-target-feature");
1151 CmdArgs.push_back(Features[i]);
1152 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001153 }
1154}
1155
Tony Linthicum76329bf2011-12-12 21:14:55 +00001156static Arg* getLastHexagonArchArg (const ArgList &Args)
1157{
1158 Arg * A = NULL;
1159
Sebastian Pop86500282012-01-13 20:37:10 +00001160 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1161 it != ie; ++it) {
1162 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001163 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1164 A = *it;
1165 A->claim();
1166 }
Sebastian Pop86500282012-01-13 20:37:10 +00001167 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1168 StringRef Value = (*it)->getValue(Args,0);
1169 if (Value.startswith("v")) {
1170 A = *it;
1171 A->claim();
1172 }
1173 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001174 }
1175 return A;
1176}
1177
Sebastian Pop86500282012-01-13 20:37:10 +00001178static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001179{
1180 Arg *A;
1181 llvm::StringRef WhichHexagon;
1182
Sebastian Pop86500282012-01-13 20:37:10 +00001183 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001184 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001185 WhichHexagon = A->getValue(Args);
1186 if (WhichHexagon == "")
1187 return "v4";
1188 else
1189 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001190 }
Sebastian Pop86500282012-01-13 20:37:10 +00001191 else
1192 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001193}
1194
1195void Clang::AddHexagonTargetArgs(const ArgList &Args,
1196 ArgStringList &CmdArgs) const {
1197 llvm::Triple Triple = getToolChain().getTriple();
1198
1199 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001200 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001201 CmdArgs.push_back("-fno-signed-char");
1202 CmdArgs.push_back("-nobuiltininc");
1203
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001204 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001205 CmdArgs.push_back("-mqdsp6-compat");
1206
1207 if (Arg *A = Args.getLastArg(options::OPT_G,
1208 options::OPT_msmall_data_threshold_EQ)) {
1209 std::string SmallDataThreshold="-small-data-threshold=";
1210 SmallDataThreshold += A->getValue(Args);
1211 CmdArgs.push_back ("-mllvm");
1212 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1213 A->claim();
1214 }
1215
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001216 if (!Args.hasArg(options::OPT_fno_short_enums))
1217 CmdArgs.push_back("-fshort-enums");
1218 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1219 CmdArgs.push_back ("-mllvm");
1220 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1221 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001222 CmdArgs.push_back ("-mllvm");
1223 CmdArgs.push_back ("-machine-sink-split=0");
1224}
1225
Eric Christopher84fbdb42011-08-19 00:30:14 +00001226static bool
John McCall5fb5df92012-06-20 06:18:46 +00001227shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001228 const llvm::Triple &Triple) {
1229 // We use the zero-cost exception tables for Objective-C if the non-fragile
1230 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1231 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001232 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001233 return true;
1234
Bob Wilson6524dd32011-10-14 05:03:44 +00001235 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001236 return false;
1237
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001238 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001239 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001240 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001241}
1242
Anders Carlssone96ab552011-02-28 02:27:16 +00001243/// addExceptionArgs - Adds exception related arguments to the driver command
1244/// arguments. There's a master flag, -fexceptions and also language specific
1245/// flags to enable/disable C++ and Objective-C exceptions.
1246/// This makes it possible to for example disable C++ exceptions but enable
1247/// Objective-C exceptions.
1248static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1249 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001250 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001251 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001252 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001253 if (KernelOrKext) {
1254 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1255 // arguments now to avoid warnings about unused arguments.
1256 Args.ClaimAllArgs(options::OPT_fexceptions);
1257 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1258 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1259 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1260 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1261 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001262 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001263 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001264
1265 // Exceptions are enabled by default.
1266 bool ExceptionsEnabled = true;
1267
1268 // This keeps track of whether exceptions were explicitly turned on or off.
1269 bool DidHaveExplicitExceptionFlag = false;
1270
Rafael Espindola00a66572009-10-01 13:33:33 +00001271 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1272 options::OPT_fno_exceptions)) {
1273 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001274 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001275 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001276 ExceptionsEnabled = false;
1277
1278 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001279 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001280
Anders Carlssone96ab552011-02-28 02:27:16 +00001281 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001282
Anders Carlssone96ab552011-02-28 02:27:16 +00001283 // Exception tables and cleanups can be enabled with -fexceptions even if the
1284 // language itself doesn't support exceptions.
1285 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1286 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001287
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001288 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1289 // is not necessarily sensible, but follows GCC.
1290 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001291 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001292 options::OPT_fno_objc_exceptions,
1293 true)) {
1294 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001295
Eric Christopher84fbdb42011-08-19 00:30:14 +00001296 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001297 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001298 }
1299
1300 if (types::isCXX(InputType)) {
1301 bool CXXExceptionsEnabled = ExceptionsEnabled;
1302
Eric Christopher84fbdb42011-08-19 00:30:14 +00001303 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1304 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001305 options::OPT_fexceptions,
1306 options::OPT_fno_exceptions)) {
1307 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1308 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001309 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001310 CXXExceptionsEnabled = false;
1311 }
1312
1313 if (CXXExceptionsEnabled) {
1314 CmdArgs.push_back("-fcxx-exceptions");
1315
1316 ShouldUseExceptionTables = true;
1317 }
1318 }
1319
1320 if (ShouldUseExceptionTables)
1321 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001322}
1323
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001324static bool ShouldDisableCFI(const ArgList &Args,
1325 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001326 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001327 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001328 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001329 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001330 Default = Args.hasFlag(options::OPT_integrated_as,
1331 options::OPT_no_integrated_as,
1332 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001333 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001334 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1335 options::OPT_fno_dwarf2_cfi_asm,
1336 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001337}
1338
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001339static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1340 const ToolChain &TC) {
1341 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1342 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1343 options::OPT_no_integrated_as,
1344 IsIADefault);
1345 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1346 options::OPT_fno_dwarf_directory_asm,
1347 UseIntegratedAs);
1348 return !UseDwarfDirectory;
1349}
1350
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001351/// \brief Check whether the given input tree contains any compilation actions.
1352static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001353 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001354 return true;
1355
1356 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1357 if (ContainsCompileAction(*it))
1358 return true;
1359
1360 return false;
1361}
1362
1363/// \brief Check if -relax-all should be passed to the internal assembler.
1364/// This is done by default when compiling non-assembler source with -O0.
1365static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1366 bool RelaxDefault = true;
1367
1368 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1369 RelaxDefault = A->getOption().matches(options::OPT_O0);
1370
1371 if (RelaxDefault) {
1372 RelaxDefault = false;
1373 for (ActionList::const_iterator it = C.getActions().begin(),
1374 ie = C.getActions().end(); it != ie; ++it) {
1375 if (ContainsCompileAction(*it)) {
1376 RelaxDefault = true;
1377 break;
1378 }
1379 }
1380 }
1381
1382 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1383 RelaxDefault);
1384}
1385
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001386/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1387/// This needs to be called before we add the C run-time (malloc, etc).
1388static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001389 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001390 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001391 options::OPT_fno_address_sanitizer, false))
1392 return;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001393 if(TC.getTriple().getEnvironment() == llvm::Triple::ANDROIDEABI) {
1394 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001395 if (!Args.hasArg(options::OPT_pie))
1396 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001397 // For an executable, we add a .preinit_array stub.
1398 CmdArgs.push_back("-u");
1399 CmdArgs.push_back("__asan_preinit");
1400 CmdArgs.push_back("-lasan");
1401 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001402
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001403 CmdArgs.push_back("-lasan_preload");
1404 CmdArgs.push_back("-ldl");
1405 } else {
1406 if (!Args.hasArg(options::OPT_shared)) {
1407 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1408 // resource directory.
1409 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1410 llvm::sys::path::append(LibAsan, "lib", "linux",
1411 (Twine("libclang_rt.asan-") +
1412 TC.getArchName() + ".a"));
1413 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1414 CmdArgs.push_back("-lpthread");
1415 CmdArgs.push_back("-ldl");
1416 CmdArgs.push_back("-export-dynamic");
1417 }
1418 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001419}
1420
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001421/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1422/// This needs to be called before we add the C run-time (malloc, etc).
1423static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1424 ArgStringList &CmdArgs) {
1425 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1426 options::OPT_fno_thread_sanitizer, false))
1427 return;
1428 if (!Args.hasArg(options::OPT_shared)) {
1429 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1430 // resource directory.
1431 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1432 llvm::sys::path::append(LibTsan, "lib", "linux",
1433 (Twine("libclang_rt.tsan-") +
1434 TC.getArchName() + ".a"));
1435 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1436 CmdArgs.push_back("-lpthread");
1437 CmdArgs.push_back("-ldl");
1438 CmdArgs.push_back("-export-dynamic");
1439 }
1440}
1441
Rafael Espindola224dd632011-12-14 21:02:23 +00001442static bool shouldUseFramePointer(const ArgList &Args,
1443 const llvm::Triple &Triple) {
1444 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1445 options::OPT_fomit_frame_pointer))
1446 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1447
Rafael Espindola00b29182011-12-14 21:50:24 +00001448 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001449 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1450 Triple.getArch() == llvm::Triple::x86) &&
1451 Triple.getOS() == llvm::Triple::Linux) {
1452 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1453 if (!A->getOption().matches(options::OPT_O0))
1454 return false;
1455 }
1456
1457 return true;
1458}
1459
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001460void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001461 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001462 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001463 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001464 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001465 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1466 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001467 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001468 ArgStringList CmdArgs;
1469
Daniel Dunbare521a892009-03-31 20:53:55 +00001470 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1471
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001472 // Invoke ourselves in -cc1 mode.
1473 //
1474 // FIXME: Implement custom jobs for internal actions.
1475 CmdArgs.push_back("-cc1");
1476
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001477 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001478 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001479 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001480 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001481
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001482 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001483 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001484
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001485 if (isa<AnalyzeJobAction>(JA)) {
1486 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1487 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001488 } else if (isa<MigrateJobAction>(JA)) {
1489 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001490 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001491 if (Output.getType() == types::TY_Dependencies)
1492 CmdArgs.push_back("-Eonly");
1493 else
1494 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001495 } else if (isa<AssembleJobAction>(JA)) {
1496 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001497
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001498 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001499 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001500
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001501 // When using an integrated assembler, translate -Wa, and -Xassembler
1502 // options.
1503 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1504 options::OPT_Xassembler),
1505 ie = Args.filtered_end(); it != ie; ++it) {
1506 const Arg *A = *it;
1507 A->claim();
1508
1509 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001510 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001511
1512 if (Value == "-force_cpusubtype_ALL") {
1513 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001514 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001515 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001516 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001517 CmdArgs.push_back("-mllvm");
1518 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001519 } else if (Value == "--noexecstack") {
1520 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001521 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001522 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001523 << A->getOption().getName() << Value;
1524 }
1525 }
1526 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001527
1528 // Also ignore explicit -force_cpusubtype_ALL option.
1529 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001530 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001531 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001532 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001533
1534 if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001535 CmdArgs.push_back("-emit-pch");
1536 else
1537 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001538 } else {
1539 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001540
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001541 if (JA.getType() == types::TY_Nothing) {
1542 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001543 } else if (JA.getType() == types::TY_LLVM_IR ||
1544 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001545 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001546 } else if (JA.getType() == types::TY_LLVM_BC ||
1547 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001548 CmdArgs.push_back("-emit-llvm-bc");
1549 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001550 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001551 } else if (JA.getType() == types::TY_AST) {
1552 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001553 } else if (JA.getType() == types::TY_RewrittenObjC) {
1554 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001555 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001556 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1557 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001558 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001559 } else {
1560 assert(JA.getType() == types::TY_PP_Asm &&
1561 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001562 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001563 }
1564
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001565 // The make clang go fast button.
1566 CmdArgs.push_back("-disable-free");
1567
John McCallbb79b5f2010-02-13 03:50:24 +00001568 // Disable the verification pass in -asserts builds.
1569#ifdef NDEBUG
1570 CmdArgs.push_back("-disable-llvm-verifier");
1571#endif
1572
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001573 // Set the main file name, so that debug info works even with
1574 // -save-temps.
1575 CmdArgs.push_back("-main-file-name");
1576 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1577
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001578 // Some flags which affect the language (via preprocessor
1579 // defines). See darwin::CC1::AddCPPArgs.
1580 if (Args.hasArg(options::OPT_static))
1581 CmdArgs.push_back("-static-define");
1582
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001584 // Enable region store model by default.
1585 CmdArgs.push_back("-analyzer-store=region");
1586
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001587 // Treat blocks as analysis entry points.
1588 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1589
Ted Kremenek49c79792011-03-24 00:28:47 +00001590 CmdArgs.push_back("-analyzer-eagerly-assume");
1591
Anna Zaks0af3e062012-03-08 23:16:35 +00001592 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001594 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001595 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001596 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001597
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001598 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1599 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001600
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001601 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001602 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001603
1604 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001605
1606 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001613 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001614
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001615 // Set the output format. The default is plist, for (lame) historical
1616 // reasons.
1617 CmdArgs.push_back("-analyzer-output");
1618 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1619 CmdArgs.push_back(A->getValue(Args));
1620 else
1621 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001622
Ted Kremenekfe449a22010-03-22 22:32:05 +00001623 // Disable the presentation of standard compiler warnings when
1624 // using --analyze. We only want to show static analyzer diagnostics
1625 // or frontend errors.
1626 CmdArgs.push_back("-w");
1627
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001628 // Add -Xanalyzer arguments when running as analyzer.
1629 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001630 }
1631
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001632 CheckCodeGenerationOptions(D, Args);
1633
Daniel Dunbar44e71222009-04-29 18:32:25 +00001634 // Perform argument translation for LLVM backend. This
1635 // takes some care in reconciling with llvm-gcc. The
1636 // issue is that llvm-gcc translates these options based on
1637 // the values in cc1, whereas we are processing based on
1638 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001639
Daniel Dunbar44e71222009-04-29 18:32:25 +00001640 // This comes from the default translation the driver + cc1
1641 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001642
1643 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1644 options::OPT_fpic, options::OPT_fno_pic,
1645 options::OPT_fPIE, options::OPT_fno_PIE,
1646 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001647 bool PICDisabled = false;
1648 bool PICEnabled = false;
1649 bool PICForPIE = false;
1650 if (LastPICArg) {
1651 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1652 LastPICArg->getOption().matches(options::OPT_fpie));
1653 PICEnabled = (PICForPIE ||
1654 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1655 LastPICArg->getOption().matches(options::OPT_fpic));
1656 PICDisabled = !PICEnabled;
1657 }
1658 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1659 // PIC or PIE options above, if these show up, PIC is disabled.
1660 if (Args.hasArg(options::OPT_mkernel))
1661 PICDisabled = true;
1662 if (Args.hasArg(options::OPT_static))
1663 PICDisabled = true;
1664 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1665
1666 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001667 const char *Model = getToolChain().GetForcedPicModel();
1668 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001669 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001670 Model = "dynamic-no-pic";
1671 else if (PICDisabled)
1672 Model = "static";
1673 else if (PICEnabled)
1674 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001675 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001676 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001677 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001678 StringRef ModelStr = Model ? Model : "";
1679 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001680 CmdArgs.push_back("-mrelocation-model");
1681 CmdArgs.push_back(Model);
1682 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001683
Chandler Carruthc0c04552012-04-08 16:40:35 +00001684 // Infer the __PIC__ and __PIE__ values.
1685 if (ModelStr == "pic" && PICForPIE) {
1686 CmdArgs.push_back("-pie-level");
1687 CmdArgs.push_back((LastPICArg &&
1688 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1689 "2" : "1");
1690 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001691 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001692 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1693 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1694 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001695 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001696
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001697 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1698 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001699 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001700
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001701 // LLVM Code Generator Options.
1702
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001703 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1704 CmdArgs.push_back("-mregparm");
1705 CmdArgs.push_back(A->getValue(Args));
1706 }
1707
Roman Divacky65b88cd2011-03-01 17:40:53 +00001708 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1709 CmdArgs.push_back("-mrtd");
1710
Rafael Espindola224dd632011-12-14 21:02:23 +00001711 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001712 CmdArgs.push_back("-mdisable-fp-elim");
1713 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1714 options::OPT_fno_zero_initialized_in_bss))
1715 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001716 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1717 options::OPT_fno_strict_aliasing,
1718 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001719 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001720 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1721 false))
1722 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001723 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1724 options::OPT_fno_optimize_sibling_calls))
1725 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001726
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001727 // Handle various floating point optimization flags, mapping them to the
1728 // appropriate LLVM code generation flags. The pattern for all of these is to
1729 // default off the codegen optimizations, and if any flag enables them and no
1730 // flag disables them after the flag enabling them, enable the codegen
1731 // optimization. This is complicated by several "umbrella" flags.
1732 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1733 options::OPT_ffinite_math_only,
1734 options::OPT_fno_finite_math_only,
1735 options::OPT_fhonor_infinities,
1736 options::OPT_fno_honor_infinities))
1737 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1738 A->getOption().getID() != options::OPT_fhonor_infinities)
1739 CmdArgs.push_back("-menable-no-infs");
1740 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1741 options::OPT_ffinite_math_only,
1742 options::OPT_fno_finite_math_only,
1743 options::OPT_fhonor_nans,
1744 options::OPT_fno_honor_nans))
1745 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1746 A->getOption().getID() != options::OPT_fhonor_nans)
1747 CmdArgs.push_back("-menable-no-nans");
1748
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001749 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1750 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1752 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001753 options::OPT_fno_math_errno))
1754 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1755 if (MathErrno)
1756 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001757
1758 // There are several flags which require disabling very specific
1759 // optimizations. Any of these being disabled forces us to turn off the
1760 // entire set of LLVM optimizations, so collect them through all the flag
1761 // madness.
1762 bool AssociativeMath = false;
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1764 options::OPT_funsafe_math_optimizations,
1765 options::OPT_fno_unsafe_math_optimizations,
1766 options::OPT_fassociative_math,
1767 options::OPT_fno_associative_math))
1768 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1769 A->getOption().getID() != options::OPT_fno_associative_math)
1770 AssociativeMath = true;
1771 bool ReciprocalMath = false;
1772 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1773 options::OPT_funsafe_math_optimizations,
1774 options::OPT_fno_unsafe_math_optimizations,
1775 options::OPT_freciprocal_math,
1776 options::OPT_fno_reciprocal_math))
1777 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1778 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1779 ReciprocalMath = true;
1780 bool SignedZeros = true;
1781 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1782 options::OPT_funsafe_math_optimizations,
1783 options::OPT_fno_unsafe_math_optimizations,
1784 options::OPT_fsigned_zeros,
1785 options::OPT_fno_signed_zeros))
1786 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1787 A->getOption().getID() != options::OPT_fsigned_zeros)
1788 SignedZeros = false;
1789 bool TrappingMath = true;
1790 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1791 options::OPT_funsafe_math_optimizations,
1792 options::OPT_fno_unsafe_math_optimizations,
1793 options::OPT_ftrapping_math,
1794 options::OPT_fno_trapping_math))
1795 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1796 A->getOption().getID() != options::OPT_ftrapping_math)
1797 TrappingMath = false;
1798 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1799 !TrappingMath)
1800 CmdArgs.push_back("-menable-unsafe-fp-math");
1801
1802 // We separately look for the '-ffast-math' flag, and if we find it, tell the
1803 // frontend to provide the appropriate preprocessor macros. This is distinct
1804 // from enabling any optimizations as it induces a language change which must
1805 // survive serialization and deserialization, etc.
1806 if (Args.hasArg(options::OPT_ffast_math))
1807 CmdArgs.push_back("-ffast-math");
1808
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001809 // Decide whether to use verbose asm. Verbose assembly is the default on
1810 // toolchains which have the integrated assembler on by default.
1811 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1812 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001813 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001814 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001815 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001816
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001817 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1818 CmdArgs.push_back("-mdebug-pass");
1819 CmdArgs.push_back("Structure");
1820 }
1821 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1822 CmdArgs.push_back("-mdebug-pass");
1823 CmdArgs.push_back("Arguments");
1824 }
1825
John McCall8517abc2010-02-19 02:45:38 +00001826 // Enable -mconstructor-aliases except on darwin, where we have to
1827 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001828 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001829 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001830
John McCall7ef5cb32011-03-18 02:56:14 +00001831 // Darwin's kernel doesn't support guard variables; just die if we
1832 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001833 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001834 CmdArgs.push_back("-fforbid-guard-variables");
1835
Douglas Gregordbe39272011-02-01 15:15:22 +00001836 if (Args.hasArg(options::OPT_mms_bitfields)) {
1837 CmdArgs.push_back("-mms-bitfields");
1838 }
John McCall8517abc2010-02-19 02:45:38 +00001839
Daniel Dunbar306945d2009-09-16 06:17:29 +00001840 // This is a coarse approximation of what llvm-gcc actually does, both
1841 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1842 // complicated ways.
1843 bool AsynchronousUnwindTables =
1844 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1845 options::OPT_fno_asynchronous_unwind_tables,
1846 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001847 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001848 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1849 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001850 CmdArgs.push_back("-munwind-tables");
1851
Rafael Espindola66aa0452012-06-19 01:26:10 +00001852 getToolChain().addClangTargetOptions(CmdArgs);
1853
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001854 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1855 CmdArgs.push_back("-mlimit-float-precision");
1856 CmdArgs.push_back(A->getValue(Args));
1857 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001858
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001859 // FIXME: Handle -mtune=.
1860 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001861
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001862 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001863 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001864 CmdArgs.push_back(A->getValue(Args));
1865 }
1866
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001867 // Add target specific cpu and features flags.
1868 switch(getToolChain().getTriple().getArch()) {
1869 default:
1870 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001871
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001872 case llvm::Triple::arm:
1873 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001874 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001875 break;
1876
Eric Christopher0b26a612010-03-02 02:41:08 +00001877 case llvm::Triple::mips:
1878 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001879 case llvm::Triple::mips64:
1880 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001881 AddMIPSTargetArgs(Args, CmdArgs);
1882 break;
1883
Hal Finkel8eb59282012-06-11 22:35:19 +00001884 case llvm::Triple::ppc:
1885 case llvm::Triple::ppc64:
1886 AddPPCTargetArgs(Args, CmdArgs);
1887 break;
1888
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001889 case llvm::Triple::sparc:
1890 AddSparcTargetArgs(Args, CmdArgs);
1891 break;
1892
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001893 case llvm::Triple::x86:
1894 case llvm::Triple::x86_64:
1895 AddX86TargetArgs(Args, CmdArgs);
1896 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001897
1898 case llvm::Triple::hexagon:
1899 AddHexagonTargetArgs(Args, CmdArgs);
1900 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001901 }
1902
Tony Linthicum76329bf2011-12-12 21:14:55 +00001903
1904
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001905 // Pass the linker version in use.
1906 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1907 CmdArgs.push_back("-target-linker-version");
1908 CmdArgs.push_back(A->getValue(Args));
1909 }
1910
Nick Lewycky75033772011-02-02 06:43:03 +00001911 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001912 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001913 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001914 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001915 CmdArgs.push_back("-momit-leaf-frame-pointer");
1916
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001917 // Explicitly error on some things we know we don't support and can't just
1918 // ignore.
1919 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001920 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1921 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001922 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001923 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001924 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001925 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1926 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001927 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001928 << Unsupported->getOption().getName();
1929 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001930 }
1931
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001932 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001933 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001934 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001935 CmdArgs.push_back("-header-include-file");
1936 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1937 D.CCPrintHeadersFilename : "-");
1938 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001939 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001940 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001941
Chad Rosierbe10f982011-08-02 17:58:04 +00001942 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001943 CmdArgs.push_back("-diagnostic-log-file");
1944 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1945 D.CCLogDiagnosticsFilename : "-");
1946 }
1947
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001948 // Use the last option from "-g" group. "-gline-tables-only" is
1949 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001950 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001951 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1952 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1953 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001954 } else if (!A->getOption().matches(options::OPT_g0) &&
1955 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001956 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001957 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001958 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001959
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001960 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1961 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1962
Rafael Espindola66bfb2752010-05-06 21:06:04 +00001963 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1964 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1965
Chris Lattner3c77a352010-06-22 00:03:40 +00001966 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1967
Nick Lewycky207bce32011-04-21 23:44:07 +00001968 if (Args.hasArg(options::OPT_ftest_coverage) ||
1969 Args.hasArg(options::OPT_coverage))
1970 CmdArgs.push_back("-femit-coverage-notes");
1971 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1972 Args.hasArg(options::OPT_coverage))
1973 CmdArgs.push_back("-femit-coverage-data");
1974
Nick Lewycky480cb992011-05-04 20:46:58 +00001975 if (C.getArgs().hasArg(options::OPT_c) ||
1976 C.getArgs().hasArg(options::OPT_S)) {
1977 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00001978 CmdArgs.push_back("-coverage-file");
1979 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
Nick Lewycky480cb992011-05-04 20:46:58 +00001980 }
1981 }
1982
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00001983 // Pass options for controlling the default header search paths.
1984 if (Args.hasArg(options::OPT_nostdinc)) {
1985 CmdArgs.push_back("-nostdsysteminc");
1986 CmdArgs.push_back("-nobuiltininc");
1987 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00001988 if (Args.hasArg(options::OPT_nostdlibinc))
1989 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00001990 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
1991 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
1992 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001993
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00001994 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00001995 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00001996 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00001997
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00001998 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
1999
Ted Kremenekf7639e12012-03-06 20:06:33 +00002000 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002001 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002002 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002003 options::OPT_ccc_arcmt_modify,
2004 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002005 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002006 switch (A->getOption().getID()) {
2007 default:
2008 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002009 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002010 CmdArgs.push_back("-arcmt-check");
2011 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002012 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002013 CmdArgs.push_back("-arcmt-modify");
2014 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002015 case options::OPT_ccc_arcmt_migrate:
2016 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002017 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002018 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002019
2020 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2021 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002022 break;
John McCalld70fb982011-06-15 23:25:17 +00002023 }
2024 }
2025 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002026
Ted Kremenekf7639e12012-03-06 20:06:33 +00002027 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2028 if (ARCMTEnabled) {
2029 D.Diag(diag::err_drv_argument_not_allowed_with)
2030 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2031 }
2032 CmdArgs.push_back("-mt-migrate-directory");
2033 CmdArgs.push_back(A->getValue(Args));
2034
2035 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2036 options::OPT_objcmt_migrate_subscripting)) {
2037 // None specified, means enable them all.
2038 CmdArgs.push_back("-objcmt-migrate-literals");
2039 CmdArgs.push_back("-objcmt-migrate-subscripting");
2040 } else {
2041 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2042 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2043 }
2044 }
2045
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002046 // Add preprocessing options like -I, -D, etc. if we are using the
2047 // preprocessor.
2048 //
2049 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002050 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002051 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002052
Rafael Espindolaa7431922011-07-21 23:40:37 +00002053 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2054 // that "The compiler can only warn and ignore the option if not recognized".
2055 // When building with ccache, it will pass -D options to clang even on
2056 // preprocessed inputs and configure concludes that -fPIC is not supported.
2057 Args.ClaimAllArgs(options::OPT_D);
2058
Daniel Dunbar58f78332009-09-17 06:53:36 +00002059 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002060 // others.
2061 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002062 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002063 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002064 else if (A->getOption().matches(options::OPT_O) &&
2065 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002066 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002067 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002068 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002069 }
2070
Daniel Dunbar945577c2009-10-29 02:24:45 +00002071 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekc26328a2012-06-20 07:03:37 +00002072 Args.AddLastArg(CmdArgs, options::OPT_pedantic);
Daniel Dunbar945577c2009-10-29 02:24:45 +00002073 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002074 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002075
2076 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2077 // (-ansi is equivalent to -std=c89).
2078 //
2079 // If a std is supplied, only add -trigraphs if it follows the
2080 // option.
2081 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2082 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002083 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002084 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002085 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002086 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002087 else
2088 Std->render(Args, CmdArgs);
2089
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002090 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2091 options::OPT_trigraphs))
2092 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002093 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002094 } else {
2095 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002096 //
2097 // FIXME: Clang doesn't correctly handle -std= when the input language
2098 // doesn't match. For the time being just ignore this for C++ inputs;
2099 // eventually we want to do all the standard defaulting here instead of
2100 // splitting it between the driver and clang -cc1.
2101 if (!types::isCXX(InputType))
2102 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2103 "-std=", /*Joined=*/true);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002104 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002105 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002106
Chandler Carruthb009b142011-04-23 06:30:43 +00002107 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2108 // '-fconst-strings'; this better indicates its actual behavior.
2109 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2110 false)) {
2111 // For perfect compatibility with GCC, we do this even in the presence of
2112 // '-w'. This flag names something other than a warning for GCC.
2113 CmdArgs.push_back("-fconst-strings");
2114 }
2115
Chandler Carruth61fbf622011-04-23 09:27:53 +00002116 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002117 // during C++ compilation, which it is by default. GCC keeps this define even
2118 // in the presence of '-w', match this behavior bug-for-bug.
2119 if (types::isCXX(InputType) &&
2120 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2121 true)) {
2122 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002123 }
2124
Chandler Carruthe0391482010-05-22 02:21:53 +00002125 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2126 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2127 if (Asm->getOption().matches(options::OPT_fasm))
2128 CmdArgs.push_back("-fgnu-keywords");
2129 else
2130 CmdArgs.push_back("-fno-gnu-keywords");
2131 }
2132
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002133 if (ShouldDisableCFI(Args, getToolChain()))
2134 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002135
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002136 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2137 CmdArgs.push_back("-fno-dwarf-directory-asm");
2138
Nick Lewyckyba743b72011-10-21 02:32:14 +00002139 if (const char *pwd = ::getenv("PWD")) {
2140 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2141 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002142 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002143 std::string CompDir = pwd;
2144 CmdArgs.push_back("-fdebug-compilation-dir");
2145 CmdArgs.push_back(Args.MakeArgString(CompDir));
2146 }
2147 }
2148
Richard Smith9a568822011-11-21 19:36:32 +00002149 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2150 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002151 CmdArgs.push_back("-ftemplate-depth");
2152 CmdArgs.push_back(A->getValue(Args));
2153 }
2154
Richard Smith9a568822011-11-21 19:36:32 +00002155 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2156 CmdArgs.push_back("-fconstexpr-depth");
2157 CmdArgs.push_back(A->getValue(Args));
2158 }
2159
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002160 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2161 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002162 if (A->getNumValues()) {
2163 StringRef bytes = A->getValue(Args);
2164 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2165 } else
2166 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002167 }
2168
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002169 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2170 options::OPT_fbounds_checking_EQ)) {
2171 if (A->getNumValues()) {
2172 StringRef val = A->getValue(Args);
2173 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2174 } else
2175 CmdArgs.push_back("-fbounds-checking=1");
2176 }
2177
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002178 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002179 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002180
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002181 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2182 CmdArgs.push_back("-fconstant-string-class");
2183 CmdArgs.push_back(A->getValue(Args));
2184 }
David Chisnall5778fce2009-08-31 16:41:57 +00002185
Chris Lattnere23003d2010-01-09 21:54:33 +00002186 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2187 CmdArgs.push_back("-ftabstop");
2188 CmdArgs.push_back(A->getValue(Args));
2189 }
2190
Chris Lattnerb35583d2010-04-07 20:49:23 +00002191 CmdArgs.push_back("-ferror-limit");
2192 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2193 CmdArgs.push_back(A->getValue(Args));
2194 else
2195 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002196
Chandler Carrutha77a7272010-05-06 04:55:18 +00002197 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2198 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002199 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002200 }
2201
2202 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2203 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002204 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002205 }
2206
Richard Smithf6f003a2011-12-16 19:06:07 +00002207 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2208 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2209 CmdArgs.push_back(A->getValue(Args));
2210 }
2211
Daniel Dunbar2c978472009-11-04 06:24:47 +00002212 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002213 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002214 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002215 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002216 } else {
2217 // If -fmessage-length=N was not specified, determine whether this is a
2218 // terminal and, if so, implicitly define -fmessage-length appropriately.
2219 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002220 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002221 }
2222
Daniel Dunbare357d562009-12-03 18:42:11 +00002223 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2224 CmdArgs.push_back("-fvisibility");
2225 CmdArgs.push_back(A->getValue(Args));
2226 }
2227
Douglas Gregor08329632010-06-15 17:05:35 +00002228 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002229
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002230 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2231
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002232 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002233 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2234 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002235 CmdArgs.push_back("-ffreestanding");
2236
Daniel Dunbare357d562009-12-03 18:42:11 +00002237 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002238 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002239 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002240 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002241 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002242 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002243 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002244 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002245 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2246 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002247
2248 // Report and error for -faltivec on anything other then PowerPC.
2249 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2250 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2251 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2252 D.Diag(diag::err_drv_argument_only_allowed_with)
2253 << A->getAsString(Args) << "ppc/ppc64";
2254
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002255 if (getToolChain().SupportsProfiling())
2256 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002257
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002258 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2259 options::OPT_fno_address_sanitizer, false))
2260 CmdArgs.push_back("-faddress-sanitizer");
2261
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002262 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2263 options::OPT_fno_thread_sanitizer, false))
2264 CmdArgs.push_back("-fthread-sanitizer");
2265
Daniel Dunbar35621a92010-03-16 16:57:46 +00002266 // -flax-vector-conversions is default.
2267 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2268 options::OPT_fno_lax_vector_conversions))
2269 CmdArgs.push_back("-fno-lax-vector-conversions");
2270
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002271 if (Args.getLastArg(options::OPT_fapple_kext))
2272 CmdArgs.push_back("-fapple-kext");
2273
David Blaikie690f21e2012-06-14 18:55:27 +00002274 if (Args.hasFlag(options::OPT_frewrite_includes,
2275 options::OPT_fno_rewrite_includes, false))
2276 CmdArgs.push_back("-frewrite-includes");
2277
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002278 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002279 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002280 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002281 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2282 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002283
2284 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2285 CmdArgs.push_back("-ftrapv-handler");
2286 CmdArgs.push_back(A->getValue(Args));
2287 }
2288
Bob Wilson14adb362012-02-03 06:27:22 +00002289 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002290
Chandler Carruth6e501032011-03-27 00:04:55 +00002291 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2292 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2293 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2294 options::OPT_fno_wrapv)) {
2295 if (A->getOption().matches(options::OPT_fwrapv))
2296 CmdArgs.push_back("-fwrapv");
2297 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2298 options::OPT_fno_strict_overflow)) {
2299 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2300 CmdArgs.push_back("-fwrapv");
2301 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002303 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002304
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002305 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2306
Daniel Dunbar4930e332009-11-17 08:07:36 +00002307 // -stack-protector=0 is default.
2308 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002309 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2310 options::OPT_fstack_protector_all,
2311 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002312 if (A->getOption().matches(options::OPT_fstack_protector))
2313 StackProtectorLevel = 1;
2314 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2315 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002316 } else {
2317 StackProtectorLevel =
2318 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2319 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002320 if (StackProtectorLevel) {
2321 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002322 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002323 }
2324
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002325 // Translate -mstackrealign
2326 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2327 false)) {
2328 CmdArgs.push_back("-backend-option");
2329 CmdArgs.push_back("-force-align-stack");
2330 }
2331 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2332 false)) {
2333 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2334 }
2335
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002336 if (Args.hasArg(options::OPT_mstack_alignment)) {
2337 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2338 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002339 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002340
Daniel Dunbard18049a2009-04-07 21:16:11 +00002341 // Forward -f options with positive and negative forms; we translate
2342 // these by hand.
2343
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002344 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002345 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002346 CmdArgs.push_back("-fapple-kext");
2347 if (!Args.hasArg(options::OPT_fbuiltin))
2348 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002349 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002350 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002351 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002352 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002353 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002354
Nuno Lopes13c88c72009-12-16 16:59:22 +00002355 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2356 options::OPT_fno_assume_sane_operator_new))
2357 CmdArgs.push_back("-fno-assume-sane-operator-new");
2358
Daniel Dunbar4930e332009-11-17 08:07:36 +00002359 // -fblocks=0 is default.
2360 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002361 getToolChain().IsBlocksDefault()) ||
2362 (Args.hasArg(options::OPT_fgnu_runtime) &&
2363 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2364 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002365 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002366
2367 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2368 !getToolChain().hasBlocksRuntime())
2369 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002370 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002371
Douglas Gregor226173a2012-01-18 15:19:58 +00002372 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2373 // users must also pass -fcxx-modules. The latter flag will disappear once the
2374 // modules implementation is solid for C++/Objective-C++ programs as well.
2375 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2376 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2377 options::OPT_fno_cxx_modules,
2378 false);
2379 if (AllowedInCXX || !types::isCXX(InputType))
2380 CmdArgs.push_back("-fmodules");
2381 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002382
John McCalldfea9982010-04-09 19:12:06 +00002383 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002384 if (Args.hasFlag(options::OPT_fno_access_control,
2385 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002386 false))
John McCall3155f572010-04-09 19:03:51 +00002387 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002388
Anders Carlssond470fef2010-11-21 00:09:52 +00002389 // -felide-constructors is the default.
2390 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2391 options::OPT_felide_constructors,
2392 false))
2393 CmdArgs.push_back("-fno-elide-constructors");
2394
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002395 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002396 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2397 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002398 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002399
Tony Linthicum76329bf2011-12-12 21:14:55 +00002400 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002401 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002402 options::OPT_fno_short_enums,
2403 getToolChain().getTriple().getArch() ==
2404 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002405 CmdArgs.push_back("-fshort-enums");
2406
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002407 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002408 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002409 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002410 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002411
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002412 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002413 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002414 options::OPT_fno_threadsafe_statics))
2415 CmdArgs.push_back("-fno-threadsafe-statics");
2416
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002417 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002418 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2419 options::OPT_fno_use_cxa_atexit,
2420 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002421 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002422 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2423 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002424 CmdArgs.push_back("-fno-use-cxa-atexit");
2425
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002426 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002427 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002428 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2429 CmdArgs.push_back("-fms-extensions");
2430
Francois Pichet1b4f1632011-09-17 04:32:15 +00002431 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002432 if (Args.hasFlag(options::OPT_fms_compatibility,
2433 options::OPT_fno_ms_compatibility,
2434 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2435 Args.hasFlag(options::OPT_fms_extensions,
2436 options::OPT_fno_ms_extensions,
2437 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002438 CmdArgs.push_back("-fms-compatibility");
2439
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002440 // -fmsc-version=1300 is default.
2441 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2442 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2443 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002444 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002445 if (msc_ver.empty())
2446 CmdArgs.push_back("-fmsc-version=1300");
2447 else
2448 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2449 }
2450
2451
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002452 // -fborland-extensions=0 is default.
2453 if (Args.hasFlag(options::OPT_fborland_extensions,
2454 options::OPT_fno_borland_extensions, false))
2455 CmdArgs.push_back("-fborland-extensions");
2456
Francois Pichet02744872011-09-01 16:38:08 +00002457 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2458 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002459 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2460 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002461 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002462 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002463
Chandler Carruthe03aa552010-04-17 20:17:31 +00002464 // -fgnu-keywords default varies depending on language; only pass if
2465 // specified.
2466 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002467 options::OPT_fno_gnu_keywords))
2468 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002469
Rafael Espindola922a6242011-06-02 17:30:53 +00002470 if (Args.hasFlag(options::OPT_fgnu89_inline,
2471 options::OPT_fno_gnu89_inline,
2472 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002473 CmdArgs.push_back("-fgnu89-inline");
2474
Chad Rosier9c76d242012-03-15 22:31:42 +00002475 if (Args.hasArg(options::OPT_fno_inline))
2476 CmdArgs.push_back("-fno-inline");
2477
Chad Rosier64d6be92012-03-06 21:17:19 +00002478 if (Args.hasArg(options::OPT_fno_inline_functions))
2479 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002480
John McCall5fb5df92012-06-20 06:18:46 +00002481 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002482
John McCall5fb5df92012-06-20 06:18:46 +00002483 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2484 // legacy is the default.
2485 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002486 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2487 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002488 objcRuntime.isLegacyDispatchDefaultForArch(
2489 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002490 if (getToolChain().UseObjCMixedDispatch())
2491 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2492 else
2493 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2494 }
2495 }
2496
Nico Weber97bd94b2012-03-09 21:19:44 +00002497 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2498 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002499 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002500 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2501 }
2502
John McCall24fc0de2011-07-06 00:26:06 +00002503 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2504 // NOTE: This logic is duplicated in ToolChains.cpp.
2505 bool ARC = isObjCAutoRefCount(Args);
2506 if (ARC) {
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002507 if (!getToolChain().SupportsObjCARC())
2508 D.Diag(diag::err_arc_unsupported);
2509
John McCall24fc0de2011-07-06 00:26:06 +00002510 CmdArgs.push_back("-fobjc-arc");
2511
Chandler Carruth491db322011-11-04 07:34:47 +00002512 // FIXME: It seems like this entire block, and several around it should be
2513 // wrapped in isObjC, but for now we just use it here as this is where it
2514 // was being used previously.
2515 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2516 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2517 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2518 else
2519 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2520 }
2521
John McCall24fc0de2011-07-06 00:26:06 +00002522 // Allow the user to enable full exceptions code emission.
2523 // We define off for Objective-CC, on for Objective-C++.
2524 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2525 options::OPT_fno_objc_arc_exceptions,
2526 /*default*/ types::isCXX(InputType)))
2527 CmdArgs.push_back("-fobjc-arc-exceptions");
2528 }
2529
2530 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2531 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002532 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002533 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002534
John McCall24fc0de2011-07-06 00:26:06 +00002535 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2536 // takes precedence.
2537 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2538 if (!GCArg)
2539 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2540 if (GCArg) {
2541 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002542 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002543 << GCArg->getAsString(Args);
2544 } else if (getToolChain().SupportsObjCGC()) {
2545 GCArg->render(Args, CmdArgs);
2546 } else {
2547 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002548 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002549 << GCArg->getAsString(Args);
2550 }
2551 }
2552
John McCallb5f652e2011-06-22 00:53:57 +00002553 // Add exception args.
2554 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002555 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002556
2557 if (getToolChain().UseSjLjExceptions())
2558 CmdArgs.push_back("-fsjlj-exceptions");
2559
2560 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002561 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2562 options::OPT_fno_assume_sane_operator_new))
2563 CmdArgs.push_back("-fno-assume-sane-operator-new");
2564
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002565 // -fconstant-cfstrings is default, and may be subject to argument translation
2566 // on Darwin.
2567 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2568 options::OPT_fno_constant_cfstrings) ||
2569 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2570 options::OPT_mno_constant_cfstrings))
2571 CmdArgs.push_back("-fno-constant-cfstrings");
2572
John Thompsoned4e2952009-11-05 20:14:16 +00002573 // -fshort-wchar default varies depending on platform; only
2574 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002575 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2576 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002577
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002578 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2579 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002580 //
2581 // FIXME: This is gross; that translation should be pulled from the
2582 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002583 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002584 options::OPT_fno_pascal_strings,
2585 false) ||
2586 Args.hasFlag(options::OPT_mpascal_strings,
2587 options::OPT_mno_pascal_strings,
2588 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002589 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002590
Daniel Dunbar096ed292011-10-05 21:04:55 +00002591 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2592 // -fno-pack-struct doesn't apply to -fpack-struct=.
2593 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002594 std::string PackStructStr = "-fpack-struct=";
2595 PackStructStr += A->getValue(Args);
2596 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002597 } else if (Args.hasFlag(options::OPT_fpack_struct,
2598 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002599 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002600 }
2601
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002602 if (Args.hasArg(options::OPT_mkernel) ||
2603 Args.hasArg(options::OPT_fapple_kext)) {
2604 if (!Args.hasArg(options::OPT_fcommon))
2605 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002606 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002607 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002608
Daniel Dunbard18049a2009-04-07 21:16:11 +00002609 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002610 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002611 CmdArgs.push_back("-fno-common");
2612
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002613 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002614 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002615 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002616 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002617 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002618 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2619
Daniel Dunbar6358d682010-10-15 22:30:42 +00002620 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2621 if (!Args.hasFlag(options::OPT_ffor_scope,
2622 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002623 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002624 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2625
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002626 // -fcaret-diagnostics is default.
2627 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2628 options::OPT_fno_caret_diagnostics, true))
2629 CmdArgs.push_back("-fno-caret-diagnostics");
2630
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002631 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002632 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002633 options::OPT_fno_diagnostics_fixit_info))
2634 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002635
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002636 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002637 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002638 options::OPT_fno_diagnostics_show_option))
2639 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002640
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002641 if (const Arg *A =
2642 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2643 CmdArgs.push_back("-fdiagnostics-show-category");
2644 CmdArgs.push_back(A->getValue(Args));
2645 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002646
Douglas Gregor643c9222011-05-21 17:07:29 +00002647 if (const Arg *A =
2648 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2649 CmdArgs.push_back("-fdiagnostics-format");
2650 CmdArgs.push_back(A->getValue(Args));
2651 }
2652
Chandler Carruthb6766f02011-03-27 01:50:55 +00002653 if (Arg *A = Args.getLastArg(
2654 options::OPT_fdiagnostics_show_note_include_stack,
2655 options::OPT_fno_diagnostics_show_note_include_stack)) {
2656 if (A->getOption().matches(
2657 options::OPT_fdiagnostics_show_note_include_stack))
2658 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2659 else
2660 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2661 }
2662
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002663 // Color diagnostics are the default, unless the terminal doesn't support
2664 // them.
2665 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002666 options::OPT_fno_color_diagnostics,
2667 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002668 CmdArgs.push_back("-fcolor-diagnostics");
2669
Daniel Dunbardb097022009-06-08 21:13:54 +00002670 if (!Args.hasFlag(options::OPT_fshow_source_location,
2671 options::OPT_fno_show_source_location))
2672 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002673
Douglas Gregor643c9222011-05-21 17:07:29 +00002674 if (!Args.hasFlag(options::OPT_fshow_column,
2675 options::OPT_fno_show_column,
2676 true))
2677 CmdArgs.push_back("-fno-show-column");
2678
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002679 if (!Args.hasFlag(options::OPT_fspell_checking,
2680 options::OPT_fno_spell_checking))
2681 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002682
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002683
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002684 // Silently ignore -fasm-blocks for now.
2685 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2686 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002687
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002688 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2689 A->render(Args, CmdArgs);
2690
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002691 // -fdollars-in-identifiers default varies depending on platform and
2692 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002693 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002694 options::OPT_fno_dollars_in_identifiers)) {
2695 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002696 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002697 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002698 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002699 }
2700
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002701 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2702 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002703 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002704 options::OPT_fno_unit_at_a_time)) {
2705 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002706 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002707 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002708
Eli Friedman055c9702011-11-02 01:53:16 +00002709 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2710 options::OPT_fno_apple_pragma_pack, false))
2711 CmdArgs.push_back("-fapple-pragma-pack");
2712
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002713 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002714 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002715 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002716#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002717 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002718 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2719 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2720 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2721 CmdArgs.push_back("-fno-builtin-strcat");
2722 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2723 CmdArgs.push_back("-fno-builtin-strcpy");
2724 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002725#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002726
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002727 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002728 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002729 options::OPT_traditional_cpp)) {
2730 if (isa<PreprocessJobAction>(JA))
2731 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002732 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002733 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002734 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002735
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002736 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002737 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002738
2739 // Handle serialized diagnostics.
2740 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2741 CmdArgs.push_back("-serialize-diagnostic-file");
2742 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2743 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002744
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002745 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2746 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002747 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002748 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2749 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002750 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002751
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002752 // We translate this by hand to the -cc1 argument, since nightly test uses
2753 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002754 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002755 CmdArgs.push_back("-disable-llvm-optzns");
2756 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002757 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002758 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002759
Daniel Dunbard67a3222009-03-30 06:36:42 +00002760 if (Output.getType() == types::TY_Dependencies) {
2761 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002762 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002763 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002764 CmdArgs.push_back(Output.getFilename());
2765 } else {
2766 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002767 }
2768
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002769 for (InputInfoList::const_iterator
2770 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2771 const InputInfo &II = *it;
2772 CmdArgs.push_back("-x");
2773 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002774 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002775 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002776 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002777 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002778 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002779
Chris Lattnere9d7d782009-11-03 19:50:27 +00002780 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2781
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002782 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002783
2784 // Optionally embed the -cc1 level arguments into the debug info, for build
2785 // analysis.
2786 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002787 ArgStringList OriginalArgs;
2788 for (ArgList::const_iterator it = Args.begin(),
2789 ie = Args.end(); it != ie; ++it)
2790 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002791
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002792 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002793 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002794 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002795 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002796 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002797 }
2798 CmdArgs.push_back("-dwarf-debug-flags");
2799 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2800 }
2801
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002802 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002803
Roman Divacky178e01602011-02-10 16:52:03 +00002804 if (Arg *A = Args.getLastArg(options::OPT_pg))
2805 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002806 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002807 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002808
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002809 // Claim some arguments which clang supports automatically.
2810
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002811 // -fpch-preprocess is used with gcc to add a special marker in the output to
2812 // include the PCH file. Clang's PTH solution is completely transparent, so we
2813 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002814 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002815
Daniel Dunbar17731772009-03-23 19:03:36 +00002816 // Claim some arguments which clang doesn't support, but we don't
2817 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002818 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2819 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002820
Rafael Espindolad95a8122011-03-01 05:25:27 +00002821 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002822 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002823 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002824}
2825
Jim Grosbach576452b2012-02-10 20:37:10 +00002826void ClangAs::AddARMTargetArgs(const ArgList &Args,
2827 ArgStringList &CmdArgs) const {
2828 const Driver &D = getToolChain().getDriver();
2829 llvm::Triple Triple = getToolChain().getTriple();
2830
2831 // Set the CPU based on -march= and -mcpu=.
2832 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002833 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002834
2835 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002836 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002837 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002838
2839 // Honor -mfpmath=.
2840 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002841 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002842}
2843
John McCall5fb5df92012-06-20 06:18:46 +00002844/// Add options related to the Objective-C runtime/ABI.
2845///
2846/// Returns true if the runtime is non-fragile.
2847ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2848 ArgStringList &cmdArgs,
2849 RewriteKind rewriteKind) const {
2850 // Look for the controlling runtime option.
2851 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2852 options::OPT_fgnu_runtime,
2853 options::OPT_fobjc_runtime_EQ);
2854
2855 // Just forward -fobjc-runtime= to the frontend. This supercedes
2856 // options about fragility.
2857 if (runtimeArg &&
2858 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2859 ObjCRuntime runtime;
2860 StringRef value = runtimeArg->getValue(args);
2861 if (runtime.tryParse(value)) {
2862 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2863 << value;
2864 }
2865
2866 runtimeArg->render(args, cmdArgs);
2867 return runtime;
2868 }
2869
2870 // Otherwise, we'll need the ABI "version". Version numbers are
2871 // slightly confusing for historical reasons:
2872 // 1 - Traditional "fragile" ABI
2873 // 2 - Non-fragile ABI, version 1
2874 // 3 - Non-fragile ABI, version 2
2875 unsigned objcABIVersion = 1;
2876 // If -fobjc-abi-version= is present, use that to set the version.
2877 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2878 StringRef value = abiArg->getValue(args);
2879 if (value == "1")
2880 objcABIVersion = 1;
2881 else if (value == "2")
2882 objcABIVersion = 2;
2883 else if (value == "3")
2884 objcABIVersion = 3;
2885 else
2886 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2887 << value;
2888 } else {
2889 // Otherwise, determine if we are using the non-fragile ABI.
2890 bool nonFragileABIIsDefault =
2891 (rewriteKind == RK_NonFragile ||
2892 (rewriteKind == RK_None &&
2893 getToolChain().IsObjCNonFragileABIDefault()));
2894 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2895 options::OPT_fno_objc_nonfragile_abi,
2896 nonFragileABIIsDefault)) {
2897 // Determine the non-fragile ABI version to use.
2898#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2899 unsigned nonFragileABIVersion = 1;
2900#else
2901 unsigned nonFragileABIVersion = 2;
2902#endif
2903
2904 if (Arg *abiArg = args.getLastArg(
2905 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2906 StringRef value = abiArg->getValue(args);
2907 if (value == "1")
2908 nonFragileABIVersion = 1;
2909 else if (value == "2")
2910 nonFragileABIVersion = 2;
2911 else
2912 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2913 << value;
2914 }
2915
2916 objcABIVersion = 1 + nonFragileABIVersion;
2917 } else {
2918 objcABIVersion = 1;
2919 }
2920 }
2921
2922 // We don't actually care about the ABI version other than whether
2923 // it's non-fragile.
2924 bool isNonFragile = objcABIVersion != 1;
2925
2926 // If we have no runtime argument, ask the toolchain for its default runtime.
2927 // However, the rewriter only really supports the Mac runtime, so assume that.
2928 ObjCRuntime runtime;
2929 if (!runtimeArg) {
2930 switch (rewriteKind) {
2931 case RK_None:
2932 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2933 break;
2934 case RK_Fragile:
2935 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2936 break;
2937 case RK_NonFragile:
2938 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2939 break;
2940 }
2941
2942 // -fnext-runtime
2943 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2944 // On Darwin, make this use the default behavior for the toolchain.
2945 if (getToolChain().getTriple().isOSDarwin()) {
2946 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2947
2948 // Otherwise, build for a generic macosx port.
2949 } else {
2950 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2951 }
2952
2953 // -fgnu-runtime
2954 } else {
2955 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00002956 // Legacy behaviour is to target the gnustep runtime if we are i
2957 // non-fragile mode or the GCC runtime in fragile mode.
2958 if (isNonFragile)
2959 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
2960 else
2961 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00002962 }
2963
2964 cmdArgs.push_back(args.MakeArgString(
2965 "-fobjc-runtime=" + runtime.getAsString()));
2966 return runtime;
2967}
2968
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00002969void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00002970 const InputInfo &Output,
2971 const InputInfoList &Inputs,
2972 const ArgList &Args,
2973 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00002974 ArgStringList CmdArgs;
2975
2976 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
2977 const InputInfo &Input = Inputs[0];
2978
Rafael Espindolacfaadda2010-11-17 22:13:25 +00002979 // Don't warn about "clang -w -c foo.s"
2980 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002981 // and "clang -emit-llvm -c foo.s"
2982 Args.ClaimAllArgs(options::OPT_emit_llvm);
2983 // and "clang -use-gold-plugin -c foo.s"
2984 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00002985
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00002986 // Invoke ourselves in -cc1as mode.
2987 //
2988 // FIXME: Implement custom jobs for internal actions.
2989 CmdArgs.push_back("-cc1as");
2990
2991 // Add the "effective" target triple.
2992 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00002993 std::string TripleStr =
2994 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00002995 CmdArgs.push_back(Args.MakeArgString(TripleStr));
2996
2997 // Set the output mode, we currently only expect to be used as a real
2998 // assembler.
2999 CmdArgs.push_back("-filetype");
3000 CmdArgs.push_back("obj");
3001
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003002 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003003 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003004
Jim Grosbach576452b2012-02-10 20:37:10 +00003005 // Add target specific cpu and features flags.
3006 switch(getToolChain().getTriple().getArch()) {
3007 default:
3008 break;
3009
3010 case llvm::Triple::arm:
3011 case llvm::Triple::thumb:
3012 AddARMTargetArgs(Args, CmdArgs);
3013 break;
3014 }
3015
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003016 // Ignore explicit -force_cpusubtype_ALL option.
3017 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003018
Eric Christopherfc3ee562012-01-10 00:38:01 +00003019 // Determine the original source input.
3020 const Action *SourceAction = &JA;
3021 while (SourceAction->getKind() != Action::InputClass) {
3022 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3023 SourceAction = SourceAction->getInputs()[0];
3024 }
3025
3026 // Forward -g, assuming we are dealing with an actual assembly file.
3027 if (SourceAction->getType() == types::TY_Asm ||
3028 SourceAction->getType() == types::TY_PP_Asm) {
3029 Args.ClaimAllArgs(options::OPT_g_Group);
3030 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3031 if (!A->getOption().matches(options::OPT_g0))
3032 CmdArgs.push_back("-g");
3033 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003034
3035 // Optionally embed the -cc1as level arguments into the debug info, for build
3036 // analysis.
3037 if (getToolChain().UseDwarfDebugFlags()) {
3038 ArgStringList OriginalArgs;
3039 for (ArgList::const_iterator it = Args.begin(),
3040 ie = Args.end(); it != ie; ++it)
3041 (*it)->render(Args, OriginalArgs);
3042
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003043 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003044 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3045 Flags += Exec;
3046 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3047 Flags += " ";
3048 Flags += OriginalArgs[i];
3049 }
3050 CmdArgs.push_back("-dwarf-debug-flags");
3051 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3052 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003053
3054 // FIXME: Add -static support, once we have it.
3055
3056 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3057 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003058 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003059
3060 assert(Output.isFilename() && "Unexpected lipo output.");
3061 CmdArgs.push_back("-o");
3062 CmdArgs.push_back(Output.getFilename());
3063
Daniel Dunbarb440f562010-08-02 02:38:21 +00003064 assert(Input.isFilename() && "Invalid input.");
3065 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003066
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003067 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003068 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003069}
3070
Daniel Dunbara3246a02009-03-18 08:07:30 +00003071void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003072 const InputInfo &Output,
3073 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003074 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003075 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003076 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003077 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003078
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003079 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003080 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003081 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003082 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003083 // Don't forward any -g arguments to assembly steps.
3084 if (isa<AssembleJobAction>(JA) &&
3085 A->getOption().matches(options::OPT_g_Group))
3086 continue;
3087
Daniel Dunbar2da02722009-03-19 07:55:12 +00003088 // It is unfortunate that we have to claim here, as this means
3089 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003090 // platforms using a generic gcc, even if we are just using gcc
3091 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003092 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003093 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003094 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003095 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003096
Daniel Dunbar4e295052010-01-25 22:35:08 +00003097 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003098
3099 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003100 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003101 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003102 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003103
3104 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003105 if (Arch == "powerpc")
3106 CmdArgs.push_back("ppc");
3107 else if (Arch == "powerpc64")
3108 CmdArgs.push_back("ppc64");
3109 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003110 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003111 }
3112
Daniel Dunbar5716d872009-05-02 21:41:52 +00003113 // Try to force gcc to match the tool chain we want, if we recognize
3114 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003115 //
3116 // FIXME: The triple class should directly provide the information we want
3117 // here.
3118 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003119 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003120 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003121 CmdArgs.push_back("-m64");
3122
Daniel Dunbarb440f562010-08-02 02:38:21 +00003123 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003124 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003125 CmdArgs.push_back(Output.getFilename());
3126 } else {
3127 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003128 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003129 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003130
Tony Linthicum76329bf2011-12-12 21:14:55 +00003131 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3132 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003133
3134 // Only pass -x if gcc will understand it; otherwise hope gcc
3135 // understands the suffix correctly. The main use case this would go
3136 // wrong in is for linker inputs if they happened to have an odd
3137 // suffix; really the only way to get this to happen is a command
3138 // like '-x foobar a.c' which will treat a.c like a linker input.
3139 //
3140 // FIXME: For the linker case specifically, can we safely convert
3141 // inputs into '-Wl,' options?
3142 for (InputInfoList::const_iterator
3143 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3144 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003145
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003146 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003147 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3148 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003149 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003150 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003151 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003152 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003153 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003154
Daniel Dunbara3246a02009-03-18 08:07:30 +00003155 if (types::canTypeBeUserSpecified(II.getType())) {
3156 CmdArgs.push_back("-x");
3157 CmdArgs.push_back(types::getTypeName(II.getType()));
3158 }
3159
Daniel Dunbarb440f562010-08-02 02:38:21 +00003160 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003161 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003162 else {
3163 const Arg &A = II.getInputArg();
3164
3165 // Reverse translate some rewritten options.
3166 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3167 CmdArgs.push_back("-lstdc++");
3168 continue;
3169 }
3170
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003171 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003172 A.render(Args, CmdArgs);
3173 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003174 }
3175
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003176 const std::string customGCCName = D.getCCCGenericGCCName();
3177 const char *GCCName;
3178 if (!customGCCName.empty())
3179 GCCName = customGCCName.c_str();
3180 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003181 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003182 } else
3183 GCCName = "gcc";
3184
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003185 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003186 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003187 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003188}
3189
Daniel Dunbar4e295052010-01-25 22:35:08 +00003190void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3191 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003192 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003193}
3194
Daniel Dunbar4e295052010-01-25 22:35:08 +00003195void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3196 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003197 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003198}
3199
Daniel Dunbar4e295052010-01-25 22:35:08 +00003200void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3201 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003202 const Driver &D = getToolChain().getDriver();
3203
Daniel Dunbar4e295052010-01-25 22:35:08 +00003204 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003205 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3206 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003207 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003208 else {
3209 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003210 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003211 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003212
Daniel Dunbar4e295052010-01-25 22:35:08 +00003213 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003214 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003215}
3216
Daniel Dunbar4e295052010-01-25 22:35:08 +00003217void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3218 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003219 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003220}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003221
Daniel Dunbar4e295052010-01-25 22:35:08 +00003222void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3223 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003224 // The types are (hopefully) good enough.
3225}
3226
Tony Linthicum76329bf2011-12-12 21:14:55 +00003227// Hexagon tools start.
3228void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3229 ArgStringList &CmdArgs) const {
3230
3231}
3232void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3233 const InputInfo &Output,
3234 const InputInfoList &Inputs,
3235 const ArgList &Args,
3236 const char *LinkingOutput) const {
3237
3238 const Driver &D = getToolChain().getDriver();
3239 ArgStringList CmdArgs;
3240
3241 std::string MarchString = "-march=";
3242 MarchString += getHexagonTargetCPU(Args);
3243 CmdArgs.push_back(Args.MakeArgString(MarchString));
3244
3245 RenderExtraToolArgs(JA, CmdArgs);
3246
3247 if (Output.isFilename()) {
3248 CmdArgs.push_back("-o");
3249 CmdArgs.push_back(Output.getFilename());
3250 } else {
3251 assert(Output.isNothing() && "Unexpected output");
3252 CmdArgs.push_back("-fsyntax-only");
3253 }
3254
3255
3256 // Only pass -x if gcc will understand it; otherwise hope gcc
3257 // understands the suffix correctly. The main use case this would go
3258 // wrong in is for linker inputs if they happened to have an odd
3259 // suffix; really the only way to get this to happen is a command
3260 // like '-x foobar a.c' which will treat a.c like a linker input.
3261 //
3262 // FIXME: For the linker case specifically, can we safely convert
3263 // inputs into '-Wl,' options?
3264 for (InputInfoList::const_iterator
3265 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3266 const InputInfo &II = *it;
3267
3268 // Don't try to pass LLVM or AST inputs to a generic gcc.
3269 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3270 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3271 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3272 << getToolChain().getTripleString();
3273 else if (II.getType() == types::TY_AST)
3274 D.Diag(clang::diag::err_drv_no_ast_support)
3275 << getToolChain().getTripleString();
3276
3277 if (II.isFilename())
3278 CmdArgs.push_back(II.getFilename());
3279 else
3280 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3281 II.getInputArg().render(Args, CmdArgs);
3282 }
3283
3284 const char *GCCName = "hexagon-as";
3285 const char *Exec =
3286 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3287 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3288
3289}
3290void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3291 ArgStringList &CmdArgs) const {
3292 // The types are (hopefully) good enough.
3293}
3294
3295void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3296 const InputInfo &Output,
3297 const InputInfoList &Inputs,
3298 const ArgList &Args,
3299 const char *LinkingOutput) const {
3300
3301 const Driver &D = getToolChain().getDriver();
3302 ArgStringList CmdArgs;
3303
3304 for (ArgList::const_iterator
3305 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3306 Arg *A = *it;
3307 if (A->getOption().hasForwardToGCC()) {
3308 // Don't forward any -g arguments to assembly steps.
3309 if (isa<AssembleJobAction>(JA) &&
3310 A->getOption().matches(options::OPT_g_Group))
3311 continue;
3312
3313 // It is unfortunate that we have to claim here, as this means
3314 // we will basically never report anything interesting for
3315 // platforms using a generic gcc, even if we are just using gcc
3316 // to get to the assembler.
3317 A->claim();
3318 A->render(Args, CmdArgs);
3319 }
3320 }
3321
3322 RenderExtraToolArgs(JA, CmdArgs);
3323
3324 // Add Arch Information
3325 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003326 if ((A = getLastHexagonArchArg(Args))) {
3327 if (A->getOption().matches(options::OPT_m_Joined))
3328 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003329 else
Sebastian Pop86500282012-01-13 20:37:10 +00003330 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003331 }
Sebastian Pop86500282012-01-13 20:37:10 +00003332 else {
3333 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3334 }
3335
Tony Linthicum76329bf2011-12-12 21:14:55 +00003336 CmdArgs.push_back("-mqdsp6-compat");
3337
3338 const char *GCCName;
3339 if (C.getDriver().CCCIsCXX)
3340 GCCName = "hexagon-g++";
3341 else
3342 GCCName = "hexagon-gcc";
3343 const char *Exec =
3344 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3345
3346 if (Output.isFilename()) {
3347 CmdArgs.push_back("-o");
3348 CmdArgs.push_back(Output.getFilename());
3349 }
3350
3351 for (InputInfoList::const_iterator
3352 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3353 const InputInfo &II = *it;
3354
3355 // Don't try to pass LLVM or AST inputs to a generic gcc.
3356 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3357 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3358 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3359 << getToolChain().getTripleString();
3360 else if (II.getType() == types::TY_AST)
3361 D.Diag(clang::diag::err_drv_no_ast_support)
3362 << getToolChain().getTripleString();
3363
3364 if (II.isFilename())
3365 CmdArgs.push_back(II.getFilename());
3366 else
3367 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3368 II.getInputArg().render(Args, CmdArgs);
3369 }
3370 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3371
3372}
3373// Hexagon tools end.
3374
3375
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003376const char *darwin::CC1::getCC1Name(types::ID Type) const {
3377 switch (Type) {
3378 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003379 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003380 case types::TY_Asm:
3381 case types::TY_C: case types::TY_CHeader:
3382 case types::TY_PP_C: case types::TY_PP_CHeader:
3383 return "cc1";
3384 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003385 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3386 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003387 return "cc1obj";
3388 case types::TY_CXX: case types::TY_CXXHeader:
3389 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3390 return "cc1plus";
3391 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003392 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3393 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003394 return "cc1objplus";
3395 }
3396}
3397
David Blaikie68e081d2011-12-20 02:48:34 +00003398void darwin::CC1::anchor() {}
3399
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003400const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003401 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003402 return Args.MakeArgString(
3403 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003404}
3405
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003406const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003407 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003408 const char *Str = getBaseInputName(Args, Inputs);
3409
Chris Lattner906bb902011-01-16 08:14:11 +00003410 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003411 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003412
3413 return Str;
3414}
3415
3416const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003417darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003418 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003419 // FIXME: Think about this more.
3420 std::string Res;
3421
3422 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3423 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003424 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003425 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003426 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003427 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003428 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003429}
3430
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003431void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003432 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003433 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003434
3435 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003436 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003437
Bob Wilson7ecbd322012-02-07 01:17:55 +00003438 // Erase both -fmodule-cache-path and its argument.
3439 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3440 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003441 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003442 continue;
3443 }
3444
Bob Wilson7ecbd322012-02-07 01:17:55 +00003445 // Remove unsupported -f options.
3446 if (Option.startswith("-f")) {
3447 // Remove -f/-fno- to reduce the number of cases.
3448 if (Option.startswith("-fno-"))
3449 Option = Option.substr(5);
3450 else
3451 Option = Option.substr(2);
3452 RemoveOption = llvm::StringSwitch<bool>(Option)
3453 .Case("altivec", true)
3454 .Case("modules", true)
3455 .Case("diagnostics-show-note-include-stack", true)
3456 .Default(false);
3457 }
3458
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003459 // Handle machine specific options.
3460 if (Option.startswith("-m")) {
3461 RemoveOption = llvm::StringSwitch<bool>(Option)
3462 .Case("-mthumb", true)
3463 .Case("-mno-thumb", true)
3464 .Case("-mno-fused-madd", true)
3465 .Case("-mlong-branch", true)
3466 .Case("-mlongcall", true)
3467 .Case("-mcpu=G4", true)
3468 .Case("-mcpu=G5", true)
3469 .Default(false);
3470 }
3471
3472 // Handle warning options.
3473 if (Option.startswith("-W")) {
3474 // Remove -W/-Wno- to reduce the number of cases.
3475 if (Option.startswith("-Wno-"))
3476 Option = Option.substr(5);
3477 else
3478 Option = Option.substr(2);
3479
3480 RemoveOption = llvm::StringSwitch<bool>(Option)
3481 .Case("address-of-temporary", true)
3482 .Case("ambiguous-member-template", true)
3483 .Case("analyzer-incompatible-plugin", true)
3484 .Case("array-bounds", true)
3485 .Case("array-bounds-pointer-arithmetic", true)
3486 .Case("bind-to-temporary-copy", true)
3487 .Case("bitwise-op-parentheses", true)
3488 .Case("bool-conversions", true)
3489 .Case("builtin-macro-redefined", true)
3490 .Case("c++-hex-floats", true)
3491 .Case("c++0x-compat", true)
3492 .Case("c++0x-extensions", true)
3493 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003494 .Case("c++11-compat", true)
3495 .Case("c++11-extensions", true)
3496 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003497 .Case("conditional-uninitialized", true)
3498 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003499 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003500 .Case("CFString-literal", true)
3501 .Case("constant-logical-operand", true)
3502 .Case("custom-atomic-properties", true)
3503 .Case("default-arg-special-member", true)
3504 .Case("delegating-ctor-cycles", true)
3505 .Case("delete-non-virtual-dtor", true)
3506 .Case("deprecated-implementations", true)
3507 .Case("deprecated-writable-strings", true)
3508 .Case("distributed-object-modifiers", true)
3509 .Case("duplicate-method-arg", true)
3510 .Case("dynamic-class-memaccess", true)
3511 .Case("enum-compare", true)
3512 .Case("exit-time-destructors", true)
3513 .Case("gnu", true)
3514 .Case("gnu-designator", true)
3515 .Case("header-hygiene", true)
3516 .Case("idiomatic-parentheses", true)
3517 .Case("ignored-qualifiers", true)
3518 .Case("implicit-atomic-properties", true)
3519 .Case("incompatible-pointer-types", true)
3520 .Case("incomplete-implementation", true)
3521 .Case("initializer-overrides", true)
3522 .Case("invalid-noreturn", true)
3523 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003524 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003525 .Case("literal-conversion", true)
3526 .Case("literal-range", true)
3527 .Case("local-type-template-args", true)
3528 .Case("logical-op-parentheses", true)
3529 .Case("method-signatures", true)
3530 .Case("microsoft", true)
3531 .Case("mismatched-tags", true)
3532 .Case("missing-method-return-type", true)
3533 .Case("non-pod-varargs", true)
3534 .Case("nonfragile-abi2", true)
3535 .Case("null-arithmetic", true)
3536 .Case("null-dereference", true)
3537 .Case("out-of-line-declaration", true)
3538 .Case("overriding-method-mismatch", true)
3539 .Case("readonly-setter-attrs", true)
3540 .Case("return-stack-address", true)
3541 .Case("self-assign", true)
3542 .Case("semicolon-before-method-body", true)
3543 .Case("sentinel", true)
3544 .Case("shift-overflow", true)
3545 .Case("shift-sign-overflow", true)
3546 .Case("sign-conversion", true)
3547 .Case("sizeof-array-argument", true)
3548 .Case("sizeof-pointer-memaccess", true)
3549 .Case("string-compare", true)
3550 .Case("super-class-method-mismatch", true)
3551 .Case("tautological-compare", true)
3552 .Case("typedef-redefinition", true)
3553 .Case("typename-missing", true)
3554 .Case("undefined-reinterpret-cast", true)
3555 .Case("unknown-warning-option", true)
3556 .Case("unnamed-type-template-args", true)
3557 .Case("unneeded-internal-declaration", true)
3558 .Case("unneeded-member-function", true)
3559 .Case("unused-comparison", true)
3560 .Case("unused-exception-parameter", true)
3561 .Case("unused-member-function", true)
3562 .Case("unused-result", true)
3563 .Case("vector-conversions", true)
3564 .Case("vla", true)
3565 .Case("used-but-marked-unused", true)
3566 .Case("weak-vtables", true)
3567 .Default(false);
3568 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003569 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003570 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003571 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003572 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003573 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003574 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003575 }
3576}
3577
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003578void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003579 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003580 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003581
3582 CheckCodeGenerationOptions(D, Args);
3583
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003584 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003585 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3586 !Args.hasArg(options::OPT_mdynamic_no_pic))
3587 CmdArgs.push_back("-fPIC");
3588
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003589 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3590 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3591 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3592 CmdArgs.push_back("-fno-builtin-strcat");
3593 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3594 CmdArgs.push_back("-fno-builtin-strcpy");
3595 }
3596
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003597 if (Args.hasArg(options::OPT_g_Flag) &&
3598 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3599 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3600}
3601
3602void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3603 const InputInfoList &Inputs,
3604 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003605 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003606
3607 // Derived from cc1_options spec.
3608 if (Args.hasArg(options::OPT_fast) ||
3609 Args.hasArg(options::OPT_fastf) ||
3610 Args.hasArg(options::OPT_fastcp))
3611 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003612
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003613 if (Arg *A = Args.getLastArg(options::OPT_pg))
3614 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003615 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003616 << A->getAsString(Args) << "-fomit-frame-pointer";
3617
3618 AddCC1Args(Args, CmdArgs);
3619
3620 if (!Args.hasArg(options::OPT_Q))
3621 CmdArgs.push_back("-quiet");
3622
3623 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003624 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003625
3626 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3627
3628 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3629 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3630
3631 // FIXME: The goal is to use the user provided -o if that is our
3632 // final output, otherwise to drive from the original input
3633 // name. Find a clean way to go about this.
3634 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3635 Args.hasArg(options::OPT_o)) {
3636 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3637 CmdArgs.push_back("-auxbase-strip");
3638 CmdArgs.push_back(OutputOpt->getValue(Args));
3639 } else {
3640 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003641 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003642 }
3643
3644 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3645
3646 Args.AddAllArgs(CmdArgs, options::OPT_O);
3647 // FIXME: -Wall is getting some special treatment. Investigate.
3648 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3649 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003650 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003651 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003652 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3653 // Honor -std-default.
3654 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3655 "-std=", /*Joined=*/true);
3656 }
3657
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003658 if (Args.hasArg(options::OPT_v))
3659 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003660 if (Args.hasArg(options::OPT_pg) &&
3661 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003662 CmdArgs.push_back("-p");
3663 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003664
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003665 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003666 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3667 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3668 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3669 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3670 //
3671 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003672 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3673 options::OPT_fsyntax_only),
3674 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003675 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3676 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3677 (*it)->claim();
3678 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003679 }
3680 }
3681 } else
3682 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003683
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003684 // Claim Clang only -f options, they aren't worth warning about.
3685 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3686
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003687 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3688 if (Args.hasArg(options::OPT_Qn))
3689 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003690
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003691 // FIXME: This isn't correct.
3692 //Args.AddLastArg(CmdArgs, options::OPT__help)
3693 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3694
3695 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3696
3697 // FIXME: Still don't get what is happening here. Investigate.
3698 Args.AddAllArgs(CmdArgs, options::OPT__param);
3699
3700 if (Args.hasArg(options::OPT_fmudflap) ||
3701 Args.hasArg(options::OPT_fmudflapth)) {
3702 CmdArgs.push_back("-fno-builtin");
3703 CmdArgs.push_back("-fno-merge-constants");
3704 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003705
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003706 if (Args.hasArg(options::OPT_coverage)) {
3707 CmdArgs.push_back("-fprofile-arcs");
3708 CmdArgs.push_back("-ftest-coverage");
3709 }
3710
3711 if (types::isCXX(Inputs[0].getType()))
3712 CmdArgs.push_back("-D__private_extern__=extern");
3713}
3714
3715void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3716 const InputInfoList &Inputs,
3717 const ArgStringList &OutputArgs) const {
3718 // Derived from cpp_options
3719 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003720
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003721 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3722
3723 AddCC1Args(Args, CmdArgs);
3724
3725 // NOTE: The code below has some commonality with cpp_options, but
3726 // in classic gcc style ends up sending things in different
3727 // orders. This may be a good merge candidate once we drop pedantic
3728 // compatibility.
3729
3730 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003731 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003732 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003733 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3734 // Honor -std-default.
3735 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3736 "-std=", /*Joined=*/true);
3737 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003738 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3739 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003740
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003741 // The driver treats -fsyntax-only specially.
3742 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3743
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003744 // Claim Clang only -f options, they aren't worth warning about.
3745 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3746
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003747 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3748 !Args.hasArg(options::OPT_fno_working_directory))
3749 CmdArgs.push_back("-fworking-directory");
3750
3751 Args.AddAllArgs(CmdArgs, options::OPT_O);
3752 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3753 if (Args.hasArg(options::OPT_save_temps))
3754 CmdArgs.push_back("-fpch-preprocess");
3755}
3756
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003757void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003758 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003759 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003760 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003761
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003762 CheckPreprocessingOptions(D, Args);
3763
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003764 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003765 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3766 Args.AddLastArg(CmdArgs, options::OPT_C);
3767 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003768 if (!Args.hasArg(options::OPT_Q))
3769 CmdArgs.push_back("-quiet");
3770 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003771 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003772 Args.AddLastArg(CmdArgs, options::OPT_v);
3773 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3774 Args.AddLastArg(CmdArgs, options::OPT_P);
3775
3776 // FIXME: Handle %I properly.
3777 if (getToolChain().getArchName() == "x86_64") {
3778 CmdArgs.push_back("-imultilib");
3779 CmdArgs.push_back("x86_64");
3780 }
3781
3782 if (Args.hasArg(options::OPT_MD)) {
3783 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003784 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003785 }
3786
3787 if (Args.hasArg(options::OPT_MMD)) {
3788 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003789 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003790 }
3791
3792 Args.AddLastArg(CmdArgs, options::OPT_M);
3793 Args.AddLastArg(CmdArgs, options::OPT_MM);
3794 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3795 Args.AddLastArg(CmdArgs, options::OPT_MG);
3796 Args.AddLastArg(CmdArgs, options::OPT_MP);
3797 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3798 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3799 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3800 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3801 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3802 CmdArgs.push_back("-MQ");
3803 CmdArgs.push_back(OutputOpt->getValue(Args));
3804 }
3805 }
3806
3807 Args.AddLastArg(CmdArgs, options::OPT_remap);
3808 if (Args.hasArg(options::OPT_g3))
3809 CmdArgs.push_back("-dD");
3810 Args.AddLastArg(CmdArgs, options::OPT_H);
3811
3812 AddCPPArgs(Args, CmdArgs);
3813
3814 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3815 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3816
3817 for (InputInfoList::const_iterator
3818 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3819 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003820
Daniel Dunbarb440f562010-08-02 02:38:21 +00003821 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003822 }
3823
3824 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3825 options::OPT_Xpreprocessor);
3826
3827 if (Args.hasArg(options::OPT_fmudflap)) {
3828 CmdArgs.push_back("-D_MUDFLAP");
3829 CmdArgs.push_back("-include");
3830 CmdArgs.push_back("mf-runtime.h");
3831 }
3832
3833 if (Args.hasArg(options::OPT_fmudflapth)) {
3834 CmdArgs.push_back("-D_MUDFLAP");
3835 CmdArgs.push_back("-D_MUDFLAPTH");
3836 CmdArgs.push_back("-include");
3837 CmdArgs.push_back("mf-runtime.h");
3838 }
3839}
3840
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003841void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003842 ArgStringList &CmdArgs) const {
3843 // Derived from cpp spec.
3844
3845 if (Args.hasArg(options::OPT_static)) {
3846 // The gcc spec is broken here, it refers to dynamic but
3847 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003848
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003849 // if (!Args.hasArg(arglist.parser.dynamicOption))
3850 CmdArgs.push_back("-D__STATIC__");
3851 } else
3852 CmdArgs.push_back("-D__DYNAMIC__");
3853
3854 if (Args.hasArg(options::OPT_pthread))
3855 CmdArgs.push_back("-D_REENTRANT");
3856}
3857
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003858void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003859 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003860 const InputInfoList &Inputs,
3861 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003862 const char *LinkingOutput) const {
3863 ArgStringList CmdArgs;
3864
3865 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3866
3867 CmdArgs.push_back("-E");
3868
3869 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003870 Args.hasArg(options::OPT_traditional_cpp))
3871 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003872
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003873 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003874 assert(Output.isFilename() && "Unexpected CC1 output.");
3875 OutputArgs.push_back("-o");
3876 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003877
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003878 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003879 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3880 } else {
3881 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3882 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3883 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003884
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003885 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3886
Chad Rosierc31e48d2011-09-08 00:38:00 +00003887 RemoveCC1UnsupportedArgs(CmdArgs);
3888
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003889 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003890 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003891 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003893}
3894
3895void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003896 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003897 const InputInfoList &Inputs,
3898 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003899 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003900 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003901 ArgStringList CmdArgs;
3902
3903 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3904
Bob Wilson0090df22012-04-01 23:03:29 +00003905 // Silence warning about unused --serialize-diagnostics
3906 Args.ClaimAllArgs(options::OPT__serialize_diags);
3907
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003908 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003909 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003910 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003911 << A->getAsString(Args) << "-E";
3912
Daniel Dunbar24e52992010-06-07 23:28:45 +00003913 if (JA.getType() == types::TY_LLVM_IR ||
3914 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003915 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003916 else if (JA.getType() == types::TY_LLVM_BC ||
3917 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003918 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003919 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003920 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003921 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003922 else if (JA.getType() != types::TY_PP_Asm &&
3923 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003924 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003925 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003926
3927 ArgStringList OutputArgs;
3928 if (Output.getType() != types::TY_PCH) {
3929 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003930 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003931 OutputArgs.push_back("/dev/null");
3932 else
3933 OutputArgs.push_back(Output.getFilename());
3934 }
3935
3936 // There is no need for this level of compatibility, but it makes
3937 // diffing easier.
3938 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3939 Args.hasArg(options::OPT_S));
3940
3941 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003942 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003943 if (OutputArgsEarly) {
3944 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3945 } else {
3946 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3947 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3948 }
3949 } else {
3950 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003951
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003952 for (InputInfoList::const_iterator
3953 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3954 const InputInfo &II = *it;
3955
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003956 // Reject AST inputs.
3957 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003958 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003959 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003960 return;
3961 }
3962
Daniel Dunbarb440f562010-08-02 02:38:21 +00003963 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003964 }
3965
3966 if (OutputArgsEarly) {
3967 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3968 } else {
3969 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3970 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3971 }
3972 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003973
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003974 if (Output.getType() == types::TY_PCH) {
3975 assert(Output.isFilename() && "Invalid PCH output.");
3976
3977 CmdArgs.push_back("-o");
3978 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
3979 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00003980 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00003981 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00003982 C.addTempFile(TmpPath);
3983 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003984
Eric Christopher84fbdb42011-08-19 00:30:14 +00003985 // If we're emitting a pch file with the last 4 characters of ".pth"
3986 // and falling back to llvm-gcc we want to use ".gch" instead.
3987 std::string OutputFile(Output.getFilename());
3988 size_t loc = OutputFile.rfind(".pth");
3989 if (loc != std::string::npos)
3990 OutputFile.replace(loc, 4, ".gch");
3991 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
3992 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003993 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003994
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003995 RemoveCC1UnsupportedArgs(CmdArgs);
3996
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003997 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003998 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003999 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004000 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004001}
4002
Daniel Dunbarbe220842009-03-20 16:06:39 +00004003void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004004 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004005 const InputInfoList &Inputs,
4006 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004007 const char *LinkingOutput) const {
4008 ArgStringList CmdArgs;
4009
4010 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4011 const InputInfo &Input = Inputs[0];
4012
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004013 // Determine the original source input.
4014 const Action *SourceAction = &JA;
4015 while (SourceAction->getKind() != Action::InputClass) {
4016 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4017 SourceAction = SourceAction->getInputs()[0];
4018 }
4019
4020 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004021 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004022 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004023 if (Args.hasArg(options::OPT_gstabs))
4024 CmdArgs.push_back("--gstabs");
4025 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004026 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004027 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004028
Daniel Dunbarbe220842009-03-20 16:06:39 +00004029 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004030 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004031
Daniel Dunbar6d484762010-07-22 01:47:22 +00004032 // Use -force_cpusubtype_ALL on x86 by default.
4033 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4034 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004035 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4036 CmdArgs.push_back("-force_cpusubtype_ALL");
4037
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004038 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4039 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004040 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004041 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004042 CmdArgs.push_back("-static");
4043
Daniel Dunbarbe220842009-03-20 16:06:39 +00004044 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4045 options::OPT_Xassembler);
4046
4047 assert(Output.isFilename() && "Unexpected lipo output.");
4048 CmdArgs.push_back("-o");
4049 CmdArgs.push_back(Output.getFilename());
4050
Daniel Dunbarb440f562010-08-02 02:38:21 +00004051 assert(Input.isFilename() && "Invalid input.");
4052 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004053
4054 // asm_final spec is empty.
4055
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004056 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004057 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004058 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004059}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004060
David Blaikie68e081d2011-12-20 02:48:34 +00004061void darwin::DarwinTool::anchor() {}
4062
Daniel Dunbare9ded432009-09-09 18:36:20 +00004063void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4064 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004065 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004066
Daniel Dunbarc1964212009-03-26 16:23:12 +00004067 // Derived from darwin_arch spec.
4068 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004069 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004070
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004071 // FIXME: Is this needed anymore?
4072 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004073 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004074}
4075
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004076void darwin::Link::AddLinkArgs(Compilation &C,
4077 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004078 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004079 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004080 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004081
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004082 unsigned Version[3] = { 0, 0, 0 };
4083 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4084 bool HadExtra;
4085 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4086 Version[1], Version[2], HadExtra) ||
4087 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004088 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004089 << A->getAsString(Args);
4090 }
4091
4092 // Newer linkers support -demangle, pass it if supported and not disabled by
4093 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004094 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004095 // Don't pass -demangle to ld_classic.
4096 //
4097 // FIXME: This is a temporary workaround, ld should be handling this.
4098 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4099 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004100 if (getToolChain().getArch() == llvm::Triple::x86) {
4101 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4102 options::OPT_Wl_COMMA),
4103 ie = Args.filtered_end(); it != ie; ++it) {
4104 const Arg *A = *it;
4105 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004106 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004107 UsesLdClassic = true;
4108 }
4109 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004110 if (!UsesLdClassic)
4111 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004112 }
4113
Daniel Dunbaref889c72011-06-21 20:55:11 +00004114 // If we are using LTO, then automatically create a temporary file path for
4115 // the linker to use, so that it's lifetime will extend past a possible
4116 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004117 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004118 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004119 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004120 C.addTempFile(TmpPath);
4121 CmdArgs.push_back("-object_path_lto");
4122 CmdArgs.push_back(TmpPath);
4123 }
4124
Daniel Dunbarc1964212009-03-26 16:23:12 +00004125 // Derived from the "link" spec.
4126 Args.AddAllArgs(CmdArgs, options::OPT_static);
4127 if (!Args.hasArg(options::OPT_static))
4128 CmdArgs.push_back("-dynamic");
4129 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4130 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4131 // here. How do we wish to handle such things?
4132 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004133
Daniel Dunbarc1964212009-03-26 16:23:12 +00004134 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004135 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004136 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004137 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004138
4139 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4140 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4141 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4142
4143 Arg *A;
4144 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4145 (A = Args.getLastArg(options::OPT_current__version)) ||
4146 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004147 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004148 << A->getAsString(Args) << "-dynamiclib";
4149
4150 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4151 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4152 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4153 } else {
4154 CmdArgs.push_back("-dylib");
4155
4156 Arg *A;
4157 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4158 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4159 (A = Args.getLastArg(options::OPT_client__name)) ||
4160 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4161 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4162 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004163 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004164 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004165
Daniel Dunbarc1964212009-03-26 16:23:12 +00004166 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4167 "-dylib_compatibility_version");
4168 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4169 "-dylib_current_version");
4170
Daniel Dunbara48823f2010-01-22 02:04:52 +00004171 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004172
4173 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4174 "-dylib_install_name");
4175 }
4176
4177 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4178 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4179 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004180 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004181 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004182 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4183 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4184 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4185 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4186 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4187 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004188 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004189 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4190 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4191 Args.AddAllArgs(CmdArgs, options::OPT_init);
4192
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004193 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004194 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004195
4196 // If we had an explicit -mios-simulator-version-min argument, honor that,
4197 // otherwise use the traditional deployment targets. We can't just check the
4198 // is-sim attribute because existing code follows this path, and the linker
4199 // may not handle the argument.
4200 //
4201 // FIXME: We may be able to remove this, once we can verify no one depends on
4202 // it.
4203 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4204 CmdArgs.push_back("-ios_simulator_version_min");
4205 else if (DarwinTC.isTargetIPhoneOS())
4206 CmdArgs.push_back("-iphoneos_version_min");
4207 else
4208 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004209 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004210
Daniel Dunbarc1964212009-03-26 16:23:12 +00004211 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4212 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4213 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4214 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4215 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004216
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004217 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4218 options::OPT_fno_pie,
4219 options::OPT_fno_PIE)) {
4220 if (A->getOption().matches(options::OPT_fpie) ||
4221 A->getOption().matches(options::OPT_fPIE))
4222 CmdArgs.push_back("-pie");
4223 else
4224 CmdArgs.push_back("-no_pie");
4225 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004226
4227 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4228 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4229 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4230 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4231 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4232 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4233 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4234 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4235 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4236 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4237 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4238 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4239 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4240 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4241 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4242 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004243
Daniel Dunbar84384642011-05-02 21:03:47 +00004244 // Give --sysroot= preference, over the Apple specific behavior to also use
4245 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004246 StringRef sysroot = C.getSysRoot();
4247 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004248 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004249 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004250 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4251 CmdArgs.push_back("-syslibroot");
4252 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004253 }
4254
Daniel Dunbarc1964212009-03-26 16:23:12 +00004255 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4256 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4257 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4258 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4259 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004260 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004261 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4262 Args.AddAllArgs(CmdArgs, options::OPT_y);
4263 Args.AddLastArg(CmdArgs, options::OPT_w);
4264 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4265 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4266 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4267 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4268 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4269 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4270 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4271 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4272 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4273 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4274 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4275 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4276}
4277
4278void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004279 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004280 const InputInfoList &Inputs,
4281 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004282 const char *LinkingOutput) const {
4283 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004284
Daniel Dunbarc1964212009-03-26 16:23:12 +00004285 // The logic here is derived from gcc's behavior; most of which
4286 // comes from specs (starting with link_command). Consult gcc for
4287 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004288 ArgStringList CmdArgs;
4289
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004290 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4291 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4292 options::OPT_ccc_arcmt_migrate)) {
4293 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4294 (*I)->claim();
4295 const char *Exec =
4296 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4297 CmdArgs.push_back(Output.getFilename());
4298 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4299 return;
4300 }
4301
Daniel Dunbarc1964212009-03-26 16:23:12 +00004302 // I'm not sure why this particular decomposition exists in gcc, but
4303 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004304 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004305
Daniel Dunbarc1964212009-03-26 16:23:12 +00004306 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4307 Args.AddAllArgs(CmdArgs, options::OPT_s);
4308 Args.AddAllArgs(CmdArgs, options::OPT_t);
4309 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4310 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004311 Args.AddLastArg(CmdArgs, options::OPT_e);
4312 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4313 Args.AddAllArgs(CmdArgs, options::OPT_r);
4314
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004315 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4316 // members of static archive libraries which implement Objective-C classes or
4317 // categories.
4318 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4319 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004320
Daniel Dunbarc1964212009-03-26 16:23:12 +00004321 CmdArgs.push_back("-o");
4322 CmdArgs.push_back(Output.getFilename());
4323
Chad Rosier06fd3c62012-05-16 23:45:12 +00004324 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004325 !Args.hasArg(options::OPT_nostartfiles)) {
4326 // Derived from startfile spec.
4327 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004328 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004329 if (getDarwinToolChain().isTargetIOSSimulator()) {
4330 // The simulator doesn't have a versioned crt1 file.
4331 CmdArgs.push_back("-ldylib1.o");
4332 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004333 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4334 CmdArgs.push_back("-ldylib1.o");
4335 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004336 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004337 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004338 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004339 CmdArgs.push_back("-ldylib1.10.5.o");
4340 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004341 } else {
4342 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004343 if (!Args.hasArg(options::OPT_static)) {
4344 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004345 if (getDarwinToolChain().isTargetIOSSimulator()) {
4346 // The simulator doesn't have a versioned crt1 file.
4347 CmdArgs.push_back("-lbundle1.o");
4348 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004349 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4350 CmdArgs.push_back("-lbundle1.o");
4351 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004352 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004353 CmdArgs.push_back("-lbundle1.o");
4354 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004355 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004356 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004357 if (Args.hasArg(options::OPT_pg) &&
4358 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004359 if (Args.hasArg(options::OPT_static) ||
4360 Args.hasArg(options::OPT_object) ||
4361 Args.hasArg(options::OPT_preload)) {
4362 CmdArgs.push_back("-lgcrt0.o");
4363 } else {
4364 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004365
Daniel Dunbarc1964212009-03-26 16:23:12 +00004366 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004367 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004368 // By default on OS X 10.8 and later, we don't link with a crt1.o
4369 // file and the linker knows to use _main as the entry point. But,
4370 // when compiling with -pg, we need to link with the gcrt1.o file,
4371 // so pass the -no_new_main option to tell the linker to use the
4372 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004373 if (getDarwinToolChain().isTargetMacOS() &&
4374 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4375 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004376 } else {
4377 if (Args.hasArg(options::OPT_static) ||
4378 Args.hasArg(options::OPT_object) ||
4379 Args.hasArg(options::OPT_preload)) {
4380 CmdArgs.push_back("-lcrt0.o");
4381 } else {
4382 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004383 if (getDarwinToolChain().isTargetIOSSimulator()) {
4384 // The simulator doesn't have a versioned crt1 file.
4385 CmdArgs.push_back("-lcrt1.o");
4386 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004387 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4388 CmdArgs.push_back("-lcrt1.o");
4389 else
4390 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004391 } else {
4392 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4393 CmdArgs.push_back("-lcrt1.o");
4394 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4395 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004396 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004397 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004398
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004399 // darwin_crt2 spec is empty.
4400 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004401 }
4402 }
4403 }
4404 }
4405
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004406 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4407 Args.hasArg(options::OPT_shared_libgcc) &&
4408 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004409 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004410 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004411 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004412 }
4413 }
4414
4415 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004416
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004417 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4418 // symbols may appear. Mark all of them as dynamic_lookup.
4419 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4420 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4421 options::OPT_fno_address_sanitizer, false)) {
4422 if (Args.hasArg(options::OPT_dynamiclib) ||
4423 Args.hasArg(options::OPT_bundle)) {
4424 CmdArgs.push_back("-undefined");
4425 CmdArgs.push_back("dynamic_lookup");
4426 }
4427 }
4428
Daniel Dunbarc1964212009-03-26 16:23:12 +00004429 if (Args.hasArg(options::OPT_fopenmp))
4430 // This is more complicated in gcc...
4431 CmdArgs.push_back("-lgomp");
4432
Douglas Gregor9295df02012-05-15 21:00:27 +00004433 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4434
Bob Wilson16d93952012-05-15 18:57:39 +00004435 if (isObjCRuntimeLinked(Args) &&
4436 !Args.hasArg(options::OPT_nostdlib) &&
4437 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004438 // Avoid linking compatibility stubs on i386 mac.
4439 if (!getDarwinToolChain().isTargetMacOS() ||
4440 getDarwinToolChain().getArchName() != "i386") {
4441 // If we don't have ARC or subscripting runtime support, link in the
4442 // runtime stubs. We have to do this *before* adding any of the normal
4443 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004444 ObjCRuntime runtime =
4445 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004446 // We use arclite library for both ARC and subscripting support.
John McCall5fb5df92012-06-20 06:18:46 +00004447 if ((!runtime.hasARC() && isObjCAutoRefCount(Args)) ||
4448 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004449 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004450 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004451 CmdArgs.push_back("-framework");
4452 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004453 // Link libobj.
4454 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004455 }
John McCall31168b02011-06-15 23:02:42 +00004456
Daniel Dunbarc1964212009-03-26 16:23:12 +00004457 if (LinkingOutput) {
4458 CmdArgs.push_back("-arch_multiple");
4459 CmdArgs.push_back("-final_output");
4460 CmdArgs.push_back(LinkingOutput);
4461 }
4462
Daniel Dunbarc1964212009-03-26 16:23:12 +00004463 if (Args.hasArg(options::OPT_fnested_functions))
4464 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004465
Daniel Dunbarc1964212009-03-26 16:23:12 +00004466 if (!Args.hasArg(options::OPT_nostdlib) &&
4467 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004468 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004469 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004470
Daniel Dunbarc1964212009-03-26 16:23:12 +00004471 // link_ssp spec is empty.
4472
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004473 // Let the tool chain choose which runtime library to link.
4474 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004475 }
4476
Chad Rosier06fd3c62012-05-16 23:45:12 +00004477 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004478 !Args.hasArg(options::OPT_nostartfiles)) {
4479 // endfile_spec is empty.
4480 }
4481
4482 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4483 Args.AddAllArgs(CmdArgs, options::OPT_F);
4484
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004485 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004486 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004487 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004488}
4489
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004490void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004491 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004492 const InputInfoList &Inputs,
4493 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004494 const char *LinkingOutput) const {
4495 ArgStringList CmdArgs;
4496
4497 CmdArgs.push_back("-create");
4498 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004499
4500 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004501 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004502
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004503 for (InputInfoList::const_iterator
4504 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4505 const InputInfo &II = *it;
4506 assert(II.isFilename() && "Unexpected lipo input.");
4507 CmdArgs.push_back(II.getFilename());
4508 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004509 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004510 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004511 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004512}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004513
Daniel Dunbar88299622010-06-04 18:28:36 +00004514void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004515 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004516 const InputInfoList &Inputs,
4517 const ArgList &Args,
4518 const char *LinkingOutput) const {
4519 ArgStringList CmdArgs;
4520
Daniel Dunbareb86b042011-05-09 17:23:16 +00004521 CmdArgs.push_back("-o");
4522 CmdArgs.push_back(Output.getFilename());
4523
Daniel Dunbar88299622010-06-04 18:28:36 +00004524 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4525 const InputInfo &Input = Inputs[0];
4526 assert(Input.isFilename() && "Unexpected dsymutil input.");
4527 CmdArgs.push_back(Input.getFilename());
4528
Daniel Dunbar88299622010-06-04 18:28:36 +00004529 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004530 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004531 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004532}
4533
Eric Christopher551ef452011-08-23 17:56:55 +00004534void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4535 const InputInfo &Output,
4536 const InputInfoList &Inputs,
4537 const ArgList &Args,
4538 const char *LinkingOutput) const {
4539 ArgStringList CmdArgs;
4540 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004541 CmdArgs.push_back("--debug-info");
4542 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004543 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004544
4545 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4546 const InputInfo &Input = Inputs[0];
4547 assert(Input.isFilename() && "Unexpected verify input");
4548
4549 // Grabbing the output of the earlier dsymutil run.
4550 CmdArgs.push_back(Input.getFilename());
4551
4552 const char *Exec =
4553 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4554 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4555}
4556
David Chisnallf571cde2012-02-15 13:39:01 +00004557void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4558 const InputInfo &Output,
4559 const InputInfoList &Inputs,
4560 const ArgList &Args,
4561 const char *LinkingOutput) const {
4562 ArgStringList CmdArgs;
4563
4564 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4565 options::OPT_Xassembler);
4566
4567 CmdArgs.push_back("-o");
4568 CmdArgs.push_back(Output.getFilename());
4569
4570 for (InputInfoList::const_iterator
4571 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4572 const InputInfo &II = *it;
4573 CmdArgs.push_back(II.getFilename());
4574 }
4575
4576 const char *Exec =
4577 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4578 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4579}
4580
4581
4582void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4583 const InputInfo &Output,
4584 const InputInfoList &Inputs,
4585 const ArgList &Args,
4586 const char *LinkingOutput) const {
4587 // FIXME: Find a real GCC, don't hard-code versions here
4588 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4589 const llvm::Triple &T = getToolChain().getTriple();
4590 std::string LibPath = "/usr/lib/";
4591 llvm::Triple::ArchType Arch = T.getArch();
4592 switch (Arch) {
4593 case llvm::Triple::x86:
4594 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4595 T.getOSName()).str() + "/4.5.2/";
4596 break;
4597 case llvm::Triple::x86_64:
4598 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4599 T.getOSName()).str();
4600 GCCLibPath += "/4.5.2/amd64/";
4601 LibPath += "amd64/";
4602 break;
4603 default:
4604 assert(0 && "Unsupported architecture");
4605 }
4606
4607 ArgStringList CmdArgs;
4608
David Chisnall272a0712012-02-29 15:06:12 +00004609 // Demangle C++ names in errors
4610 CmdArgs.push_back("-C");
4611
David Chisnallf571cde2012-02-15 13:39:01 +00004612 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4613 (!Args.hasArg(options::OPT_shared))) {
4614 CmdArgs.push_back("-e");
4615 CmdArgs.push_back("_start");
4616 }
4617
4618 if (Args.hasArg(options::OPT_static)) {
4619 CmdArgs.push_back("-Bstatic");
4620 CmdArgs.push_back("-dn");
4621 } else {
4622 CmdArgs.push_back("-Bdynamic");
4623 if (Args.hasArg(options::OPT_shared)) {
4624 CmdArgs.push_back("-shared");
4625 } else {
4626 CmdArgs.push_back("--dynamic-linker");
4627 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4628 }
4629 }
4630
4631 if (Output.isFilename()) {
4632 CmdArgs.push_back("-o");
4633 CmdArgs.push_back(Output.getFilename());
4634 } else {
4635 assert(Output.isNothing() && "Invalid output.");
4636 }
4637
4638 if (!Args.hasArg(options::OPT_nostdlib) &&
4639 !Args.hasArg(options::OPT_nostartfiles)) {
4640 if (!Args.hasArg(options::OPT_shared)) {
4641 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4642 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004643 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004644 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4645 } else {
4646 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004647 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4648 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004649 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004650 if (getToolChain().getDriver().CCCIsCXX)
4651 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004652 }
4653
4654 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4655
4656 Args.AddAllArgs(CmdArgs, options::OPT_L);
4657 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4658 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004659 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004660
4661 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4662
4663 if (!Args.hasArg(options::OPT_nostdlib) &&
4664 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004665 if (getToolChain().getDriver().CCCIsCXX)
4666 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004667 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004668 if (!Args.hasArg(options::OPT_shared)) {
4669 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004670 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004671 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004672 }
David Chisnallf571cde2012-02-15 13:39:01 +00004673 }
4674
4675 if (!Args.hasArg(options::OPT_nostdlib) &&
4676 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004677 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004678 }
David Chisnall96de9932012-02-16 16:00:47 +00004679 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004680
4681 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4682
4683 const char *Exec =
4684 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4685 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4686}
4687
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004688void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004689 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004690 const InputInfoList &Inputs,
4691 const ArgList &Args,
4692 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004693 ArgStringList CmdArgs;
4694
4695 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4696 options::OPT_Xassembler);
4697
4698 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004699 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004700
4701 for (InputInfoList::const_iterator
4702 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4703 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004704 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004705 }
4706
4707 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004708 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004709 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004710}
4711
4712void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004713 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004714 const InputInfoList &Inputs,
4715 const ArgList &Args,
4716 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004717 ArgStringList CmdArgs;
4718
4719 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004720 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004721 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004722 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004723 }
4724
4725 if (Args.hasArg(options::OPT_static)) {
4726 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004727 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004728 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004729// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004730 CmdArgs.push_back("-Bdynamic");
4731 if (Args.hasArg(options::OPT_shared)) {
4732 CmdArgs.push_back("-shared");
4733 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004734 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004735 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4736 }
4737 }
4738
Daniel Dunbarb440f562010-08-02 02:38:21 +00004739 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004740 CmdArgs.push_back("-o");
4741 CmdArgs.push_back(Output.getFilename());
4742 } else {
4743 assert(Output.isNothing() && "Invalid output.");
4744 }
4745
4746 if (!Args.hasArg(options::OPT_nostdlib) &&
4747 !Args.hasArg(options::OPT_nostartfiles)) {
4748 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004749 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004750 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004751 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004752 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004753 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004754 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004755 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004756 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004757 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004758 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004759 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004760 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004761 }
4762
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004763 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4764 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004765 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004766
4767 Args.AddAllArgs(CmdArgs, options::OPT_L);
4768 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4769 Args.AddAllArgs(CmdArgs, options::OPT_e);
4770
Daniel Dunbar54423b22010-09-17 00:24:54 +00004771 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004772
4773 if (!Args.hasArg(options::OPT_nostdlib) &&
4774 !Args.hasArg(options::OPT_nodefaultlibs)) {
4775 // FIXME: For some reason GCC passes -lgcc before adding
4776 // the default system libraries. Just mimic this for now.
4777 CmdArgs.push_back("-lgcc");
4778
4779 if (Args.hasArg(options::OPT_pthread))
4780 CmdArgs.push_back("-pthread");
4781 if (!Args.hasArg(options::OPT_shared))
4782 CmdArgs.push_back("-lc");
4783 CmdArgs.push_back("-lgcc");
4784 }
4785
4786 if (!Args.hasArg(options::OPT_nostdlib) &&
4787 !Args.hasArg(options::OPT_nostartfiles)) {
4788 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004789 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004790 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004791 }
4792
Bill Wendling08760582011-06-27 19:15:03 +00004793 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004794
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004795 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004796 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004797 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004798}
4799
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004800void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004801 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004802 const InputInfoList &Inputs,
4803 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004804 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004805 ArgStringList CmdArgs;
4806
4807 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4808 options::OPT_Xassembler);
4809
4810 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004811 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004812
4813 for (InputInfoList::const_iterator
4814 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4815 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004816 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004817 }
4818
4819 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004820 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004821 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004822}
4823
4824void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004825 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004826 const InputInfoList &Inputs,
4827 const ArgList &Args,
4828 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004829 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004830 ArgStringList CmdArgs;
4831
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004832 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004833 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004834 CmdArgs.push_back("-e");
4835 CmdArgs.push_back("__start");
4836 }
4837
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004838 if (Args.hasArg(options::OPT_static)) {
4839 CmdArgs.push_back("-Bstatic");
4840 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004841 if (Args.hasArg(options::OPT_rdynamic))
4842 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004843 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004844 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004845 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004846 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004847 } else {
4848 CmdArgs.push_back("-dynamic-linker");
4849 CmdArgs.push_back("/usr/libexec/ld.so");
4850 }
4851 }
4852
Daniel Dunbarb440f562010-08-02 02:38:21 +00004853 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004854 CmdArgs.push_back("-o");
4855 CmdArgs.push_back(Output.getFilename());
4856 } else {
4857 assert(Output.isNothing() && "Invalid output.");
4858 }
4859
4860 if (!Args.hasArg(options::OPT_nostdlib) &&
4861 !Args.hasArg(options::OPT_nostartfiles)) {
4862 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004863 if (Args.hasArg(options::OPT_pg))
4864 CmdArgs.push_back(Args.MakeArgString(
4865 getToolChain().GetFilePath("gcrt0.o")));
4866 else
4867 CmdArgs.push_back(Args.MakeArgString(
4868 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004869 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004870 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004871 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004872 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004873 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004874 }
4875 }
4876
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004877 std::string Triple = getToolChain().getTripleString();
4878 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004879 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004880 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004881 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004882
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004883 Args.AddAllArgs(CmdArgs, options::OPT_L);
4884 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4885 Args.AddAllArgs(CmdArgs, options::OPT_e);
4886
Daniel Dunbar54423b22010-09-17 00:24:54 +00004887 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004888
4889 if (!Args.hasArg(options::OPT_nostdlib) &&
4890 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004891 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004892 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004893 if (Args.hasArg(options::OPT_pg))
4894 CmdArgs.push_back("-lm_p");
4895 else
4896 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004897 }
4898
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004899 // FIXME: For some reason GCC passes -lgcc before adding
4900 // the default system libraries. Just mimic this for now.
4901 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004902
4903 if (Args.hasArg(options::OPT_pthread))
Chris Lattnerd0257f72011-02-21 18:36:51 +00004904 CmdArgs.push_back("-lpthread");
Chandler Carruth45661652011-12-17 22:32:42 +00004905 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004906 if (Args.hasArg(options::OPT_pg))
4907 CmdArgs.push_back("-lc_p");
4908 else
4909 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004910 }
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004911 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004912 }
4913
4914 if (!Args.hasArg(options::OPT_nostdlib) &&
4915 !Args.hasArg(options::OPT_nostartfiles)) {
4916 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004917 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004918 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004919 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004920 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004921 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004922 }
4923
4924 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004925 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004926 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004927}
Ed Schoutene33194b2009-04-02 19:13:12 +00004928
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004929void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004930 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004931 const InputInfoList &Inputs,
4932 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004933 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004934 ArgStringList CmdArgs;
4935
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004936 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4937 // instruct as in the base system to assemble 32-bit code.
4938 if (getToolChain().getArchName() == "i386")
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004939 CmdArgs.push_back("--32");
4940
Roman Divacky00859c22011-06-04 07:37:31 +00004941 if (getToolChain().getArchName() == "powerpc")
4942 CmdArgs.push_back("-a32");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004943
Eric Christopher0b26a612010-03-02 02:41:08 +00004944 // Set byte order explicitly
4945 if (getToolChain().getArchName() == "mips")
4946 CmdArgs.push_back("-EB");
4947 else if (getToolChain().getArchName() == "mipsel")
4948 CmdArgs.push_back("-EL");
4949
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004950 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4951 options::OPT_Xassembler);
4952
4953 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004954 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004955
4956 for (InputInfoList::const_iterator
4957 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4958 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004959 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004960 }
4961
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004962 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004963 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004964 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004965}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004966
4967void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004968 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004969 const InputInfoList &Inputs,
4970 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004971 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004972 const Driver &D = getToolChain().getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004973 ArgStringList CmdArgs;
4974
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00004975 if (!D.SysRoot.empty())
4976 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
4977
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004978 if (Args.hasArg(options::OPT_static)) {
4979 CmdArgs.push_back("-Bstatic");
4980 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004981 if (Args.hasArg(options::OPT_rdynamic))
4982 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00004983 CmdArgs.push_back("--eh-frame-hdr");
4984 if (Args.hasArg(options::OPT_shared)) {
4985 CmdArgs.push_back("-Bshareable");
4986 } else {
4987 CmdArgs.push_back("-dynamic-linker");
4988 CmdArgs.push_back("/libexec/ld-elf.so.1");
4989 }
4990 }
4991
4992 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
4993 // instruct ld in the base system to link 32-bit code.
4994 if (getToolChain().getArchName() == "i386") {
4995 CmdArgs.push_back("-m");
4996 CmdArgs.push_back("elf_i386_fbsd");
4997 }
4998
Roman Divacky5e300b82011-06-04 07:40:24 +00004999 if (getToolChain().getArchName() == "powerpc") {
5000 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005001 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005002 }
5003
Daniel Dunbarb440f562010-08-02 02:38:21 +00005004 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005005 CmdArgs.push_back("-o");
5006 CmdArgs.push_back(Output.getFilename());
5007 } else {
5008 assert(Output.isNothing() && "Invalid output.");
5009 }
5010
5011 if (!Args.hasArg(options::OPT_nostdlib) &&
5012 !Args.hasArg(options::OPT_nostartfiles)) {
5013 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005014 if (Args.hasArg(options::OPT_pg))
5015 CmdArgs.push_back(Args.MakeArgString(
5016 getToolChain().GetFilePath("gcrt1.o")));
Roman Divacky3403a3b2011-10-10 19:47:45 +00005017 else {
5018 const char *crt = Args.hasArg(options::OPT_pie) ? "Scrt1.o" : "crt1.o";
Roman Divacky66f22762011-02-10 16:59:40 +00005019 CmdArgs.push_back(Args.MakeArgString(
Roman Divacky3403a3b2011-10-10 19:47:45 +00005020 getToolChain().GetFilePath(crt)));
5021 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005022 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005023 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005024 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005025 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005026 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005027 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005028 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005029 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005030 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005031 }
5032 }
5033
5034 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyee8188a2011-03-01 17:53:14 +00005035 const ToolChain::path_list Paths = getToolChain().getFilePaths();
5036 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5037 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005038 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005039 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5040 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005041 Args.AddAllArgs(CmdArgs, options::OPT_s);
5042 Args.AddAllArgs(CmdArgs, options::OPT_t);
5043 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5044 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005045
Daniel Dunbar54423b22010-09-17 00:24:54 +00005046 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005047
5048 if (!Args.hasArg(options::OPT_nostdlib) &&
5049 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005050 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005051 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005052 if (Args.hasArg(options::OPT_pg))
5053 CmdArgs.push_back("-lm_p");
5054 else
5055 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005056 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005057 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5058 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005059 if (Args.hasArg(options::OPT_pg))
5060 CmdArgs.push_back("-lgcc_p");
5061 else
5062 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005063 if (Args.hasArg(options::OPT_static)) {
5064 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005065 } else if (Args.hasArg(options::OPT_pg)) {
5066 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005067 } else {
5068 CmdArgs.push_back("--as-needed");
5069 CmdArgs.push_back("-lgcc_s");
5070 CmdArgs.push_back("--no-as-needed");
5071 }
5072
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005073 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005074 if (Args.hasArg(options::OPT_pg))
5075 CmdArgs.push_back("-lpthread_p");
5076 else
5077 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005078 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005079
Roman Divacky66f22762011-02-10 16:59:40 +00005080 if (Args.hasArg(options::OPT_pg)) {
5081 if (Args.hasArg(options::OPT_shared))
5082 CmdArgs.push_back("-lc");
5083 else
5084 CmdArgs.push_back("-lc_p");
5085 CmdArgs.push_back("-lgcc_p");
5086 } else {
5087 CmdArgs.push_back("-lc");
5088 CmdArgs.push_back("-lgcc");
5089 }
5090
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005091 if (Args.hasArg(options::OPT_static)) {
5092 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005093 } else if (Args.hasArg(options::OPT_pg)) {
5094 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005095 } else {
5096 CmdArgs.push_back("--as-needed");
5097 CmdArgs.push_back("-lgcc_s");
5098 CmdArgs.push_back("--no-as-needed");
5099 }
5100 }
5101
5102 if (!Args.hasArg(options::OPT_nostdlib) &&
5103 !Args.hasArg(options::OPT_nostartfiles)) {
5104 if (!Args.hasArg(options::OPT_shared))
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005105 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
Chris Lattner3e2ee142010-07-07 16:01:42 +00005106 "crtend.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005107 else
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005108 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
Chris Lattner3e2ee142010-07-07 16:01:42 +00005109 "crtendS.o")));
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005110 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
Chris Lattner3e2ee142010-07-07 16:01:42 +00005111 "crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005112 }
5113
Bill Wendling08760582011-06-27 19:15:03 +00005114 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005115
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005116 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005117 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005118 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005119}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005120
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005121void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5122 const InputInfo &Output,
5123 const InputInfoList &Inputs,
5124 const ArgList &Args,
5125 const char *LinkingOutput) const {
5126 ArgStringList CmdArgs;
5127
5128 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5129 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005130 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005131 CmdArgs.push_back("--32");
5132
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005133 // Set byte order explicitly
5134 if (getToolChain().getArchName() == "mips")
5135 CmdArgs.push_back("-EB");
5136 else if (getToolChain().getArchName() == "mipsel")
5137 CmdArgs.push_back("-EL");
5138
5139 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5140 options::OPT_Xassembler);
5141
5142 CmdArgs.push_back("-o");
5143 CmdArgs.push_back(Output.getFilename());
5144
5145 for (InputInfoList::const_iterator
5146 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5147 const InputInfo &II = *it;
5148 CmdArgs.push_back(II.getFilename());
5149 }
5150
David Chisnallddbd68f2011-09-27 22:03:18 +00005151 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005152 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5153}
5154
5155void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5156 const InputInfo &Output,
5157 const InputInfoList &Inputs,
5158 const ArgList &Args,
5159 const char *LinkingOutput) const {
5160 const Driver &D = getToolChain().getDriver();
5161 ArgStringList CmdArgs;
5162
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005163 if (!D.SysRoot.empty())
5164 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5165
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005166 if (Args.hasArg(options::OPT_static)) {
5167 CmdArgs.push_back("-Bstatic");
5168 } else {
5169 if (Args.hasArg(options::OPT_rdynamic))
5170 CmdArgs.push_back("-export-dynamic");
5171 CmdArgs.push_back("--eh-frame-hdr");
5172 if (Args.hasArg(options::OPT_shared)) {
5173 CmdArgs.push_back("-Bshareable");
5174 } else {
5175 CmdArgs.push_back("-dynamic-linker");
5176 CmdArgs.push_back("/libexec/ld.elf_so");
5177 }
5178 }
5179
5180 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5181 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005182 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005183 CmdArgs.push_back("-m");
5184 CmdArgs.push_back("elf_i386");
5185 }
5186
5187 if (Output.isFilename()) {
5188 CmdArgs.push_back("-o");
5189 CmdArgs.push_back(Output.getFilename());
5190 } else {
5191 assert(Output.isNothing() && "Invalid output.");
5192 }
5193
5194 if (!Args.hasArg(options::OPT_nostdlib) &&
5195 !Args.hasArg(options::OPT_nostartfiles)) {
5196 if (!Args.hasArg(options::OPT_shared)) {
5197 CmdArgs.push_back(Args.MakeArgString(
5198 getToolChain().GetFilePath("crt0.o")));
5199 CmdArgs.push_back(Args.MakeArgString(
5200 getToolChain().GetFilePath("crti.o")));
5201 CmdArgs.push_back(Args.MakeArgString(
5202 getToolChain().GetFilePath("crtbegin.o")));
5203 } else {
5204 CmdArgs.push_back(Args.MakeArgString(
5205 getToolChain().GetFilePath("crti.o")));
5206 CmdArgs.push_back(Args.MakeArgString(
5207 getToolChain().GetFilePath("crtbeginS.o")));
5208 }
5209 }
5210
5211 Args.AddAllArgs(CmdArgs, options::OPT_L);
5212 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5213 Args.AddAllArgs(CmdArgs, options::OPT_e);
5214 Args.AddAllArgs(CmdArgs, options::OPT_s);
5215 Args.AddAllArgs(CmdArgs, options::OPT_t);
5216 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5217 Args.AddAllArgs(CmdArgs, options::OPT_r);
5218
5219 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5220
5221 if (!Args.hasArg(options::OPT_nostdlib) &&
5222 !Args.hasArg(options::OPT_nodefaultlibs)) {
5223 if (D.CCCIsCXX) {
5224 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5225 CmdArgs.push_back("-lm");
5226 }
5227 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5228 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005229 if (Args.hasArg(options::OPT_static)) {
5230 CmdArgs.push_back("-lgcc_eh");
5231 } else {
5232 CmdArgs.push_back("--as-needed");
5233 CmdArgs.push_back("-lgcc_s");
5234 CmdArgs.push_back("--no-as-needed");
5235 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005236 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005237
5238 if (Args.hasArg(options::OPT_pthread))
5239 CmdArgs.push_back("-lpthread");
5240 CmdArgs.push_back("-lc");
5241
5242 CmdArgs.push_back("-lgcc");
5243 if (Args.hasArg(options::OPT_static)) {
5244 CmdArgs.push_back("-lgcc_eh");
5245 } else {
5246 CmdArgs.push_back("--as-needed");
5247 CmdArgs.push_back("-lgcc_s");
5248 CmdArgs.push_back("--no-as-needed");
5249 }
5250 }
5251
5252 if (!Args.hasArg(options::OPT_nostdlib) &&
5253 !Args.hasArg(options::OPT_nostartfiles)) {
5254 if (!Args.hasArg(options::OPT_shared))
5255 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5256 "crtend.o")));
5257 else
5258 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5259 "crtendS.o")));
5260 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5261 "crtn.o")));
5262 }
5263
Bill Wendling08760582011-06-27 19:15:03 +00005264 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005265
David Chisnallddbd68f2011-09-27 22:03:18 +00005266 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005267 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5268}
5269
Rafael Espindola92b00932010-08-10 00:25:48 +00005270void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5271 const InputInfo &Output,
5272 const InputInfoList &Inputs,
5273 const ArgList &Args,
5274 const char *LinkingOutput) const {
5275 ArgStringList CmdArgs;
5276
5277 // Add --32/--64 to make sure we get the format we want.
5278 // This is incomplete
5279 if (getToolChain().getArch() == llvm::Triple::x86) {
5280 CmdArgs.push_back("--32");
5281 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5282 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005283 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5284 CmdArgs.push_back("-a32");
5285 CmdArgs.push_back("-mppc");
5286 CmdArgs.push_back("-many");
5287 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5288 CmdArgs.push_back("-a64");
5289 CmdArgs.push_back("-mppc64");
5290 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005291 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005292 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005293 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5294 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005295
5296 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5297 getToolChain().getTriple());
5298 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005299
5300 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5301 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5302 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005303 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5304 getToolChain().getArch() == llvm::Triple::mipsel ||
5305 getToolChain().getArch() == llvm::Triple::mips64 ||
5306 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005307 StringRef CPUName;
5308 StringRef ABIName;
5309 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005310
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005311 CmdArgs.push_back("-march");
5312 CmdArgs.push_back(CPUName.data());
5313
5314 // Convert ABI name to the GNU tools acceptable variant.
5315 if (ABIName == "o32")
5316 ABIName = "32";
5317 else if (ABIName == "n64")
5318 ABIName = "64";
5319
5320 CmdArgs.push_back("-mabi");
5321 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005322
5323 if (getToolChain().getArch() == llvm::Triple::mips ||
5324 getToolChain().getArch() == llvm::Triple::mips64)
5325 CmdArgs.push_back("-EB");
5326 else
5327 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005328
5329 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5330 options::OPT_fpic, options::OPT_fno_pic,
5331 options::OPT_fPIE, options::OPT_fno_PIE,
5332 options::OPT_fpie, options::OPT_fno_pie);
5333 if (LastPICArg &&
5334 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5335 LastPICArg->getOption().matches(options::OPT_fpic) ||
5336 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5337 LastPICArg->getOption().matches(options::OPT_fpie))) {
5338 CmdArgs.push_back("-KPIC");
5339 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005340 }
5341
5342 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5343 options::OPT_Xassembler);
5344
5345 CmdArgs.push_back("-o");
5346 CmdArgs.push_back(Output.getFilename());
5347
5348 for (InputInfoList::const_iterator
5349 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5350 const InputInfo &II = *it;
5351 CmdArgs.push_back(II.getFilename());
5352 }
5353
5354 const char *Exec =
5355 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5356 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5357}
5358
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005359static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5360 ArgStringList &CmdArgs, const ArgList &Args) {
5361 bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI;
5362 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005363 Args.hasArg(options::OPT_static_libgcc);
5364 if (!D.CCCIsCXX)
5365 CmdArgs.push_back("-lgcc");
5366
5367 if (StaticLibgcc) {
5368 if (D.CCCIsCXX)
5369 CmdArgs.push_back("-lgcc");
5370 } else {
5371 if (!D.CCCIsCXX)
5372 CmdArgs.push_back("--as-needed");
5373 CmdArgs.push_back("-lgcc_s");
5374 if (!D.CCCIsCXX)
5375 CmdArgs.push_back("--no-as-needed");
5376 }
5377
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005378 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005379 CmdArgs.push_back("-lgcc_eh");
5380 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5381 CmdArgs.push_back("-lgcc");
5382}
5383
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005384void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5385 const InputInfo &Output,
5386 const InputInfoList &Inputs,
5387 const ArgList &Args,
5388 const char *LinkingOutput) const {
5389 const toolchains::Linux& ToolChain =
5390 static_cast<const toolchains::Linux&>(getToolChain());
5391 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005392 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
5393 llvm::Triple::ANDROIDEABI;
5394
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005395 ArgStringList CmdArgs;
5396
Rafael Espindolad1002f62010-11-15 18:28:16 +00005397 // Silence warning for "clang -g foo.o -o foo"
5398 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005399 // and "clang -emit-llvm foo.o -o foo"
5400 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005401 // and for "clang -g foo.o -o foo". Other warning options are already
5402 // handled somewhere else.
5403 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005404
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005405 if (!D.SysRoot.empty())
5406 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005407
Rafael Espindolad47ac232010-11-17 22:26:15 +00005408 if (Args.hasArg(options::OPT_pie))
5409 CmdArgs.push_back("-pie");
5410
Rafael Espindola1c76c592010-11-07 22:57:16 +00005411 if (Args.hasArg(options::OPT_rdynamic))
5412 CmdArgs.push_back("-export-dynamic");
5413
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005414 if (Args.hasArg(options::OPT_s))
5415 CmdArgs.push_back("-s");
5416
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005417 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5418 e = ToolChain.ExtraOpts.end();
5419 i != e; ++i)
5420 CmdArgs.push_back(i->c_str());
5421
5422 if (!Args.hasArg(options::OPT_static)) {
5423 CmdArgs.push_back("--eh-frame-hdr");
5424 }
5425
5426 CmdArgs.push_back("-m");
5427 if (ToolChain.getArch() == llvm::Triple::x86)
5428 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005429 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005430 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005431 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005432 else if (ToolChain.getArch() == llvm::Triple::ppc)
5433 CmdArgs.push_back("elf32ppclinux");
5434 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5435 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005436 else if (ToolChain.getArch() == llvm::Triple::mips)
5437 CmdArgs.push_back("elf32btsmip");
5438 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5439 CmdArgs.push_back("elf32ltsmip");
5440 else if (ToolChain.getArch() == llvm::Triple::mips64)
5441 CmdArgs.push_back("elf64btsmip");
5442 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5443 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005444 else
5445 CmdArgs.push_back("elf_x86_64");
5446
5447 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005448 if (ToolChain.getArch() == llvm::Triple::arm
5449 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005450 CmdArgs.push_back("-Bstatic");
5451 else
5452 CmdArgs.push_back("-static");
5453 } else if (Args.hasArg(options::OPT_shared)) {
5454 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005455 if ((ToolChain.getArch() == llvm::Triple::arm
5456 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5457 CmdArgs.push_back("-Bsymbolic");
5458 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005459 }
5460
5461 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005462 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005463 (!Args.hasArg(options::OPT_static) &&
5464 !Args.hasArg(options::OPT_shared))) {
5465 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005466 if (isAndroid)
5467 CmdArgs.push_back("/system/bin/linker");
5468 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005469 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005470 else if (ToolChain.getArch() == llvm::Triple::arm ||
5471 ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005472 CmdArgs.push_back("/lib/ld-linux.so.3");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005473 else if (ToolChain.getArch() == llvm::Triple::mips ||
5474 ToolChain.getArch() == llvm::Triple::mipsel)
5475 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005476 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5477 ToolChain.getArch() == llvm::Triple::mips64el)
5478 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005479 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005480 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005481 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005482 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005483 else
5484 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5485 }
5486
5487 CmdArgs.push_back("-o");
5488 CmdArgs.push_back(Output.getFilename());
5489
Rafael Espindola81937ec2010-12-01 01:52:43 +00005490 if (!Args.hasArg(options::OPT_nostdlib) &&
5491 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005492 if (!isAndroid) {
5493 const char *crt1 = NULL;
5494 if (!Args.hasArg(options::OPT_shared)){
5495 if (Args.hasArg(options::OPT_pie))
5496 crt1 = "Scrt1.o";
5497 else
5498 crt1 = "crt1.o";
5499 }
5500 if (crt1)
5501 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005502
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005503 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5504 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005505
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005506 const char *crtbegin;
5507 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005508 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Rafael Espindolad47ac232010-11-17 22:26:15 +00005509 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005510 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005511 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005512 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005513 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5514 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005515
5516 Args.AddAllArgs(CmdArgs, options::OPT_L);
5517
5518 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5519
Roman Divackyee8188a2011-03-01 17:53:14 +00005520 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5521 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005522 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005523
Rafael Espindola9446d762012-04-09 23:53:34 +00005524 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5525 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5526 // forward.
5527 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5528 CmdArgs.push_back("-plugin");
5529 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5530 CmdArgs.push_back(Args.MakeArgString(Plugin));
5531 }
5532
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005533 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5534
Chandler Carruth94a32012012-05-14 18:31:18 +00005535 if (D.CCCIsCXX &&
5536 !Args.hasArg(options::OPT_nostdlib) &&
5537 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005538 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5539 !Args.hasArg(options::OPT_static);
5540 if (OnlyLibstdcxxStatic)
5541 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005542 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005543 if (OnlyLibstdcxxStatic)
5544 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005545 CmdArgs.push_back("-lm");
5546 }
5547
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005548 // Call this before we add the C run-time.
5549 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005550 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005551
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005552 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005553 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5554 if (Args.hasArg(options::OPT_static))
5555 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005556
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005557 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005558
Chandler Carruth94a32012012-05-14 18:31:18 +00005559 if (Args.hasArg(options::OPT_pthread) ||
5560 Args.hasArg(options::OPT_pthreads))
5561 CmdArgs.push_back("-lpthread");
5562
5563 CmdArgs.push_back("-lc");
5564
5565 if (Args.hasArg(options::OPT_static))
5566 CmdArgs.push_back("--end-group");
5567 else
5568 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5569 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005570
Rafael Espindola81937ec2010-12-01 01:52:43 +00005571 if (!Args.hasArg(options::OPT_nostartfiles)) {
5572 const char *crtend;
5573 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005574 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005575 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005576 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005577
Rafael Espindola81937ec2010-12-01 01:52:43 +00005578 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005579 if (!isAndroid)
5580 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005581 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005582 }
5583
Bill Wendling08760582011-06-27 19:15:03 +00005584 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005585
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005586 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5587}
Rafael Espindola92b00932010-08-10 00:25:48 +00005588
Chris Lattner3e2ee142010-07-07 16:01:42 +00005589void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005590 const InputInfo &Output,
5591 const InputInfoList &Inputs,
5592 const ArgList &Args,
5593 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005594 ArgStringList CmdArgs;
5595
5596 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5597 options::OPT_Xassembler);
5598
5599 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005600 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005601
5602 for (InputInfoList::const_iterator
5603 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5604 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005605 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005606 }
5607
5608 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005609 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005610 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005611}
5612
5613void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005614 const InputInfo &Output,
5615 const InputInfoList &Inputs,
5616 const ArgList &Args,
5617 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005618 const Driver &D = getToolChain().getDriver();
5619 ArgStringList CmdArgs;
5620
Daniel Dunbarb440f562010-08-02 02:38:21 +00005621 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005622 CmdArgs.push_back("-o");
5623 CmdArgs.push_back(Output.getFilename());
5624 } else {
5625 assert(Output.isNothing() && "Invalid output.");
5626 }
5627
5628 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005629 !Args.hasArg(options::OPT_nostartfiles)) {
5630 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5631 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5632 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5633 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5634 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005635
5636 Args.AddAllArgs(CmdArgs, options::OPT_L);
5637 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5638 Args.AddAllArgs(CmdArgs, options::OPT_e);
5639
Daniel Dunbar54423b22010-09-17 00:24:54 +00005640 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005641
Eli Friedman83de5132011-12-08 23:54:21 +00005642 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5643
Chris Lattner3e2ee142010-07-07 16:01:42 +00005644 if (!Args.hasArg(options::OPT_nostdlib) &&
5645 !Args.hasArg(options::OPT_nodefaultlibs)) {
5646 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005647 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005648 CmdArgs.push_back("-lm");
5649 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005650 }
5651
5652 if (!Args.hasArg(options::OPT_nostdlib) &&
5653 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005654 if (Args.hasArg(options::OPT_pthread))
5655 CmdArgs.push_back("-lpthread");
5656 CmdArgs.push_back("-lc");
5657 CmdArgs.push_back("-lCompilerRT-Generic");
5658 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5659 CmdArgs.push_back(
5660 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005661 }
5662
Eli Friedman83de5132011-12-08 23:54:21 +00005663 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005664 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005665}
5666
Daniel Dunbarcc912342009-05-02 18:28:39 +00005667/// DragonFly Tools
5668
5669// For now, DragonFly Assemble does just about the same as for
5670// FreeBSD, but this may change soon.
5671void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005672 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005673 const InputInfoList &Inputs,
5674 const ArgList &Args,
5675 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005676 ArgStringList CmdArgs;
5677
5678 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5679 // instruct as in the base system to assemble 32-bit code.
5680 if (getToolChain().getArchName() == "i386")
5681 CmdArgs.push_back("--32");
5682
5683 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5684 options::OPT_Xassembler);
5685
5686 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005687 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005688
5689 for (InputInfoList::const_iterator
5690 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5691 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005692 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005693 }
5694
5695 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005696 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005697 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005698}
5699
5700void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005701 const InputInfo &Output,
5702 const InputInfoList &Inputs,
5703 const ArgList &Args,
5704 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005705 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005706 ArgStringList CmdArgs;
5707
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005708 if (!D.SysRoot.empty())
5709 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5710
Daniel Dunbarcc912342009-05-02 18:28:39 +00005711 if (Args.hasArg(options::OPT_static)) {
5712 CmdArgs.push_back("-Bstatic");
5713 } else {
5714 if (Args.hasArg(options::OPT_shared))
5715 CmdArgs.push_back("-Bshareable");
5716 else {
5717 CmdArgs.push_back("-dynamic-linker");
5718 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5719 }
5720 }
5721
5722 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5723 // instruct ld in the base system to link 32-bit code.
5724 if (getToolChain().getArchName() == "i386") {
5725 CmdArgs.push_back("-m");
5726 CmdArgs.push_back("elf_i386");
5727 }
5728
Daniel Dunbarb440f562010-08-02 02:38:21 +00005729 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005730 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)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005739 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005740 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005741 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005742 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005743 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005744 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005745 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005746 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005747 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005748 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005749 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005750 }
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
Daniel Dunbar54423b22010-09-17 00:24:54 +00005757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00005758
5759 if (!Args.hasArg(options::OPT_nostdlib) &&
5760 !Args.hasArg(options::OPT_nodefaultlibs)) {
5761 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5762 // rpaths
5763 CmdArgs.push_back("-L/usr/lib/gcc41");
5764
5765 if (!Args.hasArg(options::OPT_static)) {
5766 CmdArgs.push_back("-rpath");
5767 CmdArgs.push_back("/usr/lib/gcc41");
5768
5769 CmdArgs.push_back("-rpath-link");
5770 CmdArgs.push_back("/usr/lib/gcc41");
5771
5772 CmdArgs.push_back("-rpath");
5773 CmdArgs.push_back("/usr/lib");
5774
5775 CmdArgs.push_back("-rpath-link");
5776 CmdArgs.push_back("/usr/lib");
5777 }
5778
Rafael Espindola38360b32010-07-20 12:59:03 +00005779 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005780 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00005781 CmdArgs.push_back("-lm");
5782 }
5783
Daniel Dunbarcc912342009-05-02 18:28:39 +00005784 if (Args.hasArg(options::OPT_shared)) {
5785 CmdArgs.push_back("-lgcc_pic");
5786 } else {
5787 CmdArgs.push_back("-lgcc");
5788 }
5789
5790
5791 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00005792 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00005793
5794 if (!Args.hasArg(options::OPT_nolibc)) {
5795 CmdArgs.push_back("-lc");
5796 }
5797
5798 if (Args.hasArg(options::OPT_shared)) {
5799 CmdArgs.push_back("-lgcc_pic");
5800 } else {
5801 CmdArgs.push_back("-lgcc");
5802 }
5803 }
5804
5805 if (!Args.hasArg(options::OPT_nostdlib) &&
5806 !Args.hasArg(options::OPT_nostartfiles)) {
5807 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005808 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005809 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005810 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005811 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005812 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005813 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005814 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005815 }
5816
Bill Wendling08760582011-06-27 19:15:03 +00005817 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005818
Daniel Dunbarcc912342009-05-02 18:28:39 +00005819 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005820 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005821 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005822}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005823
5824void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
5825 const InputInfo &Output,
5826 const InputInfoList &Inputs,
5827 const ArgList &Args,
5828 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005829 ArgStringList CmdArgs;
5830
5831 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00005832 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
5833 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005834 } else {
5835 assert(Output.isNothing() && "Invalid output.");
5836 }
5837
5838 if (!Args.hasArg(options::OPT_nostdlib) &&
5839 !Args.hasArg(options::OPT_nostartfiles)) {
5840 CmdArgs.push_back("-defaultlib:libcmt");
5841 }
5842
5843 CmdArgs.push_back("-nologo");
5844
Michael J. Spencere2f49362012-06-18 16:56:04 +00005845 Args.AddAllArgValues(CmdArgs, options::OPT_l);
5846
5847 // Add filenames immediately.
5848 for (InputInfoList::const_iterator
5849 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5850 if (it->isFilename())
5851 CmdArgs.push_back(it->getFilename());
5852 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005853
5854 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00005855 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00005856 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5857}