blob: 7848b488d37bd0159548ac33ca8d8c93c4cb0822 [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) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000179 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000180 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182}
183
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000184static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000199
Bill Wendling08760582011-06-27 19:15:03 +0000200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000201}
202
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000203static bool forwardToGCC(const Option &O) {
204 return !O.hasFlag(options::NoForward) &&
205 !O.hasFlag(options::DriverOption) &&
206 !O.hasFlag(options::LinkerInput);
207}
208
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000209void Clang::AddPreprocessingOptions(Compilation &C,
210 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000211 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000212 ArgStringList &CmdArgs,
213 const InputInfo &Output,
214 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000215 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000216
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000217 CheckPreprocessingOptions(D, Args);
218
219 Args.AddLastArg(CmdArgs, options::OPT_C);
220 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000221
222 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000223 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000224 (A = Args.getLastArg(options::OPT_MD)) ||
225 (A = Args.getLastArg(options::OPT_MMD))) {
226 // Determine the output location.
227 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000228 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000229 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000230 C.addFailureResultFile(DepFile);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000231 } else if (Output.getType() == types::TY_Dependencies) {
232 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000233 } else if (A->getOption().matches(options::OPT_M) ||
234 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000235 DepFile = "-";
236 } else {
237 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000238 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000239 }
240 CmdArgs.push_back("-dependency-file");
241 CmdArgs.push_back(DepFile);
242
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000243 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000244 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
245 const char *DepTarget;
246
247 // If user provided -o, that is the dependency target, except
248 // when we are only generating a dependency file.
249 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
250 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
251 DepTarget = OutputOpt->getValue(Args);
252 } else {
253 // Otherwise derive from the base input.
254 //
255 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000256 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000257 llvm::sys::path::replace_extension(P, "o");
258 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 }
260
261 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000262 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000263 QuoteTarget(DepTarget, Quoted);
264 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000265 }
266
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000267 if (A->getOption().matches(options::OPT_M) ||
268 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 CmdArgs.push_back("-sys-header-deps");
270 }
271
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000272 if (Args.hasArg(options::OPT_MG)) {
273 if (!A || A->getOption().matches(options::OPT_MD) ||
274 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000275 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000276 CmdArgs.push_back("-MG");
277 }
278
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000279 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000280
281 // Convert all -MQ <target> args to -MT <quoted target>
282 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
283 options::OPT_MQ),
284 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000285 const Arg *A = *it;
286 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000287
Daniel Dunbara442fd52010-06-11 22:00:13 +0000288 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000289 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000290 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000291 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000292 CmdArgs.push_back(Args.MakeArgString(Quoted));
293
294 // -MT flag - no change
295 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000296 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000297 }
298 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299
Douglas Gregor111af7d2009-04-18 00:34:01 +0000300 // Add -i* options, and automatically translate to
301 // -include-pch/-include-pth for transparent PCH support. It's
302 // wonky, but we include looking for .gch so we can support seamless
303 // replacement into a build system already set up to be generating
304 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000305 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000306 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
307 ie = Args.filtered_end(); it != ie; ++it) {
308 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000309
310 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000311 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
312 RenderedImplicitInclude = true;
313
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000314 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000315 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000316
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000319 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000320 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000321 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000322 P.appendSuffix("pch");
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 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000325 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000326 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000327 }
328
Douglas Gregor111af7d2009-04-18 00:34:01 +0000329 if (!FoundPCH) {
330 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000331 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000332 FoundPTH = true;
333 else
334 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000335 }
336
Douglas Gregor111af7d2009-04-18 00:34:01 +0000337 if (!FoundPCH && !FoundPTH) {
338 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000339 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000340 FoundPCH = UsePCH;
341 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000342 }
Mike Stump11289f42009-09-09 15:08:12 +0000343 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000344 P.eraseSuffix();
345 }
346
347 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000348 if (IsFirstImplicitInclude) {
349 A->claim();
350 if (UsePCH)
351 CmdArgs.push_back("-include-pch");
352 else
353 CmdArgs.push_back("-include-pth");
354 CmdArgs.push_back(Args.MakeArgString(P.str()));
355 continue;
356 } else {
357 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000358 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000359 << P.str() << A->getAsString(Args);
360 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000361 }
362 }
363
364 // Not translated, render as usual.
365 A->claim();
366 A->render(Args, CmdArgs);
367 }
368
369 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000370 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
371 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000372
373 // Add -Wp, and -Xassembler if using the preprocessor.
374
375 // FIXME: There is a very unfortunate problem here, some troubled
376 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
377 // really support that we would have to parse and then translate
378 // those options. :(
379 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
380 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000381
382 // -I- is a deprecated GCC feature, reject it.
383 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000384 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000385
386 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
387 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000388 StringRef sysroot = C.getSysRoot();
389 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000390 if (!Args.hasArg(options::OPT_isysroot)) {
391 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000392 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000393 }
394 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000395
396 // If a module path was provided, pass it along. Otherwise, use a temporary
397 // directory.
398 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000399 A->claim();
400 A->render(Args, CmdArgs);
401 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000402 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000403 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
404 DefaultModuleCache);
405 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
406 CmdArgs.push_back("-fmodule-cache-path");
407 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
408 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000409
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000411 // FIXME: We should probably sink the logic for handling these from the
412 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000413 // CPATH - included following the user specified includes (but prior to
414 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000416 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000418 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000419 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000420 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000421 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000422 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000423 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000424
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000425 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000426 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000427 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000428
429 // Add system include arguments.
430 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431}
432
Daniel Dunbarf492c922009-09-10 22:59:51 +0000433/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000434/// CPU.
435//
436// FIXME: This is redundant with -mcpu, why does LLVM use this.
437// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000438static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000439 return llvm::StringSwitch<const char *>(CPU)
440 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
441 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
442 .Cases("arm920", "arm920t", "arm922t", "v4t")
443 .Cases("arm940t", "ep9312","v4t")
444 .Cases("arm10tdmi", "arm1020t", "v5")
445 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
446 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
447 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
448 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
449 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
450 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Silviu Baranga157f7c62012-09-13 15:06:00 +0000451 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000452 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000453 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000454 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000455 .Case("cortex-a9-mp", "v7f")
456 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000457 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000458}
459
Benjamin Kramer09811c72012-06-26 22:20:06 +0000460/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
461//
462// FIXME: tblgen this.
463static std::string getARMTargetCPU(const ArgList &Args,
464 const llvm::Triple &Triple) {
465 // FIXME: Warn on inconsistent use of -mcpu and -march.
466
467 // If we have -mcpu=, use that.
468 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
469 StringRef MCPU = A->getValue(Args);
470 // Handle -mcpu=native.
471 if (MCPU == "native")
472 return llvm::sys::getHostCPUName();
473 else
474 return MCPU;
475 }
476
477 StringRef MArch;
478 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
479 // Otherwise, if we have -march= choose the base CPU for that arch.
480 MArch = A->getValue(Args);
481 } else {
482 // Otherwise, use the Arch from the triple.
483 MArch = Triple.getArchName();
484 }
485
486 // Handle -march=native.
487 std::string NativeMArch;
488 if (MArch == "native") {
489 std::string CPU = llvm::sys::getHostCPUName();
490 if (CPU != "generic") {
491 // Translate the native cpu into the architecture. The switch below will
492 // then chose the minimum cpu for that arch.
493 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
494 MArch = NativeMArch;
495 }
496 }
497
498 return llvm::StringSwitch<const char *>(MArch)
499 .Cases("armv2", "armv2a","arm2")
500 .Case("armv3", "arm6")
501 .Case("armv3m", "arm7m")
502 .Cases("armv4", "armv4t", "arm7tdmi")
503 .Cases("armv5", "armv5t", "arm10tdmi")
504 .Cases("armv5e", "armv5te", "arm1022e")
505 .Case("armv5tej", "arm926ej-s")
506 .Cases("armv6", "armv6k", "arm1136jf-s")
507 .Case("armv6j", "arm1136j-s")
508 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
509 .Case("armv6t2", "arm1156t2-s")
510 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000511 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
512 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000513 .Cases("armv7r", "armv7-r", "cortex-r4")
514 .Cases("armv7m", "armv7-m", "cortex-m3")
515 .Case("ep9312", "ep9312")
516 .Case("iwmmxt", "iwmmxt")
517 .Case("xscale", "xscale")
518 .Cases("armv6m", "armv6-m", "cortex-m0")
519 // If all else failed, return the most base CPU LLVM supports.
520 .Default("arm7tdmi");
521}
522
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523// FIXME: Move to target hook.
524static bool isSignedCharDefault(const llvm::Triple &Triple) {
525 switch (Triple.getArch()) {
526 default:
527 return true;
528
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000529 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000530 case llvm::Triple::ppc:
531 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000532 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000533 return true;
534 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000535 }
536}
537
Chad Rosiercfbfc582012-04-04 20:51:35 +0000538// Handle -mfpu=.
539//
540// FIXME: Centralize feature selection, defaulting shouldn't be also in the
541// frontend target.
542static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
543 ArgStringList &CmdArgs) {
544 StringRef FPU = A->getValue(Args);
545
546 // Set the target features based on the FPU.
547 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
548 // Disable any default FPU support.
549 CmdArgs.push_back("-target-feature");
550 CmdArgs.push_back("-vfp2");
551 CmdArgs.push_back("-target-feature");
552 CmdArgs.push_back("-vfp3");
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("-neon");
555 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
556 CmdArgs.push_back("-target-feature");
557 CmdArgs.push_back("+vfp3");
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+d16");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "vfp") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+vfp2");
565 CmdArgs.push_back("-target-feature");
566 CmdArgs.push_back("-neon");
567 } else if (FPU == "vfp3" || FPU == "vfpv3") {
568 CmdArgs.push_back("-target-feature");
569 CmdArgs.push_back("+vfp3");
570 CmdArgs.push_back("-target-feature");
571 CmdArgs.push_back("-neon");
572 } else if (FPU == "neon") {
573 CmdArgs.push_back("-target-feature");
574 CmdArgs.push_back("+neon");
575 } else
576 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
577}
578
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000579// Handle -mfpmath=.
580static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000581 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000582 StringRef FPMath = A->getValue(Args);
583
584 // Set the target features based on the FPMath.
585 if (FPMath == "neon") {
586 CmdArgs.push_back("-target-feature");
587 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000588
Silviu Baranga157f7c62012-09-13 15:06:00 +0000589 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
590 CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000591 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
592
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000593 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
594 FPMath == "vfp4") {
595 CmdArgs.push_back("-target-feature");
596 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000597
598 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000599 } else
600 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
601}
602
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000603// Select the float ABI as determined by -msoft-float, -mhard-float, and
604// -mfloat-abi=.
605static StringRef getARMFloatABI(const Driver &D,
606 const ArgList &Args,
607 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
610 options::OPT_mhard_float,
611 options::OPT_mfloat_abi_EQ)) {
612 if (A->getOption().matches(options::OPT_msoft_float))
613 FloatABI = "soft";
614 else if (A->getOption().matches(options::OPT_mhard_float))
615 FloatABI = "hard";
616 else {
617 FloatABI = A->getValue(Args);
618 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000619 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000620 << A->getAsString(Args);
621 FloatABI = "soft";
622 }
623 }
624 }
625
626 // If unspecified, choose the default based on the platform.
627 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000628 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000629 case llvm::Triple::Darwin:
630 case llvm::Triple::MacOSX:
631 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000632 // Darwin defaults to "softfp" for v6 and v7.
633 //
634 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000635 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000636 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000637 if (StringRef(ArchName).startswith("v6") ||
638 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000639 FloatABI = "softfp";
640 else
641 FloatABI = "soft";
642 break;
643 }
644
645 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000646 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000647 case llvm::Triple::GNUEABIHF:
648 FloatABI = "hard";
649 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000650 case llvm::Triple::GNUEABI:
651 FloatABI = "softfp";
652 break;
653 case llvm::Triple::EABI:
654 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
655 FloatABI = "softfp";
656 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000657 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000658 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000659 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000660 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000661 FloatABI = "softfp";
662 else
663 FloatABI = "soft";
664 break;
665 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000666 default:
667 // Assume "soft", but warn the user we are guessing.
668 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000669 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000670 break;
671 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000672 }
673 }
674
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000675 return FloatABI;
676}
677
678
679void Clang::AddARMTargetArgs(const ArgList &Args,
680 ArgStringList &CmdArgs,
681 bool KernelOrKext) const {
682 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000683 // Get the effective triple, which takes into account the deployment target.
684 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
685 llvm::Triple Triple(TripleStr);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000686 std::string CPUName = getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000687
688 // Select the ABI to use.
689 //
690 // FIXME: Support -meabi.
691 const char *ABIName = 0;
692 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
693 ABIName = A->getValue(Args);
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000694 } else if (Triple.isOSDarwin()) {
695 // The backend is hardwired to assume AAPCS for M-class processors, ensure
696 // the frontend matches that.
697 if (StringRef(CPUName).startswith("cortex-m")) {
698 ABIName = "aapcs";
699 } else {
700 ABIName = "apcs-gnu";
701 }
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000702 } else {
703 // Select the default based on the platform.
704 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000705 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000706 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000707 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000708 ABIName = "aapcs-linux";
709 break;
710 case llvm::Triple::EABI:
711 ABIName = "aapcs";
712 break;
713 default:
714 ABIName = "apcs-gnu";
715 }
716 }
717 CmdArgs.push_back("-target-abi");
718 CmdArgs.push_back(ABIName);
719
720 // Set the CPU based on -march= and -mcpu=.
721 CmdArgs.push_back("-target-cpu");
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000722 CmdArgs.push_back(Args.MakeArgString(CPUName));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000723
724 // Determine floating point ABI from the options & target defaults.
725 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000726 if (FloatABI == "soft") {
727 // Floating point operations and argument passing are soft.
728 //
729 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000730 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000731 CmdArgs.push_back("-mfloat-abi");
732 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000733 } else if (FloatABI == "softfp") {
734 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000735 CmdArgs.push_back("-mfloat-abi");
736 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000737 } else {
738 // Floating point operations and argument passing are hard.
739 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000740 CmdArgs.push_back("-mfloat-abi");
741 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000742 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000743
744 // Set appropriate target features for floating point mode.
745 //
746 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
747 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
748 // stripped out by the ARM target.
749
750 // Use software floating point operations?
751 if (FloatABI == "soft") {
752 CmdArgs.push_back("-target-feature");
753 CmdArgs.push_back("+soft-float");
754 }
755
756 // Use software floating point argument passing?
757 if (FloatABI != "hard") {
758 CmdArgs.push_back("-target-feature");
759 CmdArgs.push_back("+soft-float-abi");
760 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000761
762 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000763 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000764 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000765
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000766 // Honor -mfpmath=.
767 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000768 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000769
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000770 // Setting -msoft-float effectively disables NEON because of the GCC
771 // implementation, although the same isn't true of VFP or VFP3.
772 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000773 CmdArgs.push_back("-target-feature");
774 CmdArgs.push_back("-neon");
775 }
776
777 // Kernel code has more strict alignment requirements.
778 if (KernelOrKext) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000779 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
780 CmdArgs.push_back("-backend-option");
781 CmdArgs.push_back("-arm-long-calls");
782 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000783
Daniel Dunbar12100e22011-03-22 16:48:17 +0000784 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000785 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000786
787 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000788 CmdArgs.push_back("-backend-option");
789 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000790 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000791
792 // Setting -mno-global-merge disables the codegen global merge pass. Setting
793 // -mglobal-merge has no effect as the pass is enabled by default.
794 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
795 options::OPT_mno_global_merge)) {
796 if (A->getOption().matches(options::OPT_mno_global_merge))
797 CmdArgs.push_back("-mno-global-merge");
798 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000799
Chad Rosierc14ded72012-05-16 21:19:55 +0000800 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000801 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000802}
803
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000804// Translate MIPS CPU name alias option to CPU name.
805static StringRef getMipsCPUFromAlias(const Arg &A) {
806 if (A.getOption().matches(options::OPT_mips32))
807 return "mips32";
808 if (A.getOption().matches(options::OPT_mips32r2))
809 return "mips32r2";
810 if (A.getOption().matches(options::OPT_mips64))
811 return "mips64";
812 if (A.getOption().matches(options::OPT_mips64r2))
813 return "mips64r2";
814 llvm_unreachable("Unexpected option");
815 return "";
816}
817
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000818// Get CPU and ABI names. They are not independent
819// so we have to calculate them together.
820static void getMipsCPUAndABI(const ArgList &Args,
821 const ToolChain &TC,
822 StringRef &CPUName,
823 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000824 const char *DefMips32CPU = "mips32";
825 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000826
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000827 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000828 options::OPT_mcpu_EQ,
829 options::OPT_mips_CPUs_Group)) {
830 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
831 CPUName = getMipsCPUFromAlias(*A);
832 else
833 CPUName = A->getValue(Args);
834 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000835
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000836 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000837 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000838
839 // Setup default CPU and ABI names.
840 if (CPUName.empty() && ABIName.empty()) {
841 switch (TC.getTriple().getArch()) {
842 default:
843 llvm_unreachable("Unexpected triple arch name");
844 case llvm::Triple::mips:
845 case llvm::Triple::mipsel:
846 CPUName = DefMips32CPU;
847 break;
848 case llvm::Triple::mips64:
849 case llvm::Triple::mips64el:
850 CPUName = DefMips64CPU;
851 break;
852 }
853 }
854
855 if (!ABIName.empty()) {
856 // Deduce CPU name from ABI name.
857 CPUName = llvm::StringSwitch<const char *>(ABIName)
858 .Cases("o32", "eabi", DefMips32CPU)
859 .Cases("n32", "n64", DefMips64CPU)
860 .Default("");
861 }
862 else if (!CPUName.empty()) {
863 // Deduce ABI name from CPU name.
864 ABIName = llvm::StringSwitch<const char *>(CPUName)
865 .Cases("mips32", "mips32r2", "o32")
866 .Cases("mips64", "mips64r2", "n64")
867 .Default("");
868 }
869
870 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000871}
872
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000873// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
874// and -mfloat-abi=.
875static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000876 // Select the float ABI as determined by -msoft-float, -mhard-float,
877 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000878 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000879 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000880 options::OPT_mhard_float,
881 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000882 if (A->getOption().matches(options::OPT_msoft_float))
883 FloatABI = "soft";
884 else if (A->getOption().matches(options::OPT_mhard_float))
885 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000886 else {
887 FloatABI = A->getValue(Args);
888 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000889 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000890 FloatABI = "hard";
891 }
892 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000893 }
894
895 // If unspecified, choose the default based on the platform.
896 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000897 // Assume "hard", because it's a default value used by gcc.
898 // When we start to recognize specific target MIPS processors,
899 // we will be able to select the default more correctly.
900 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000901 }
902
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000903 return FloatABI;
904}
905
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000906static void AddTargetFeature(const ArgList &Args,
907 ArgStringList &CmdArgs,
908 OptSpecifier OnOpt,
909 OptSpecifier OffOpt,
910 StringRef FeatureName) {
911 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
912 CmdArgs.push_back("-target-feature");
913 if (A->getOption().matches(OnOpt))
914 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
915 else
916 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
917 }
918}
919
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000920void Clang::AddMIPSTargetArgs(const ArgList &Args,
921 ArgStringList &CmdArgs) const {
922 const Driver &D = getToolChain().getDriver();
923 StringRef CPUName;
924 StringRef ABIName;
925 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
926
927 CmdArgs.push_back("-target-cpu");
928 CmdArgs.push_back(CPUName.data());
929
930 CmdArgs.push_back("-target-abi");
931 CmdArgs.push_back(ABIName.data());
932
933 StringRef FloatABI = getMipsFloatABI(D, Args);
934
Eric Christopher0b26a612010-03-02 02:41:08 +0000935 if (FloatABI == "soft") {
936 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000937 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000938 CmdArgs.push_back("-mfloat-abi");
939 CmdArgs.push_back("soft");
940
941 // FIXME: Note, this is a hack. We need to pass the selected float
942 // mode to the MipsTargetInfoBase to define appropriate macros there.
943 // Now it is the only method.
944 CmdArgs.push_back("-target-feature");
945 CmdArgs.push_back("+soft-float");
946 }
947 else if (FloatABI == "single") {
948 // Restrict the use of hardware floating-point
949 // instructions to 32-bit operations.
950 CmdArgs.push_back("-target-feature");
951 CmdArgs.push_back("+single-float");
952 }
953 else {
954 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000955 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000956 CmdArgs.push_back("-mfloat-abi");
957 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000958 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000959
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000960 AddTargetFeature(Args, CmdArgs,
961 options::OPT_mips16, options::OPT_mno_mips16,
962 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000963 AddTargetFeature(Args, CmdArgs,
964 options::OPT_mdsp, options::OPT_mno_dsp,
965 "dsp");
966 AddTargetFeature(Args, CmdArgs,
967 options::OPT_mdspr2, options::OPT_mno_dspr2,
968 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000969
970 if (Arg *A = Args.getLastArg(options::OPT_G)) {
971 StringRef v = A->getValue(Args);
972 CmdArgs.push_back("-mllvm");
973 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
974 A->claim();
975 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000976}
977
Hal Finkel8eb59282012-06-11 22:35:19 +0000978/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
979static std::string getPPCTargetCPU(const ArgList &Args) {
980 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
981 StringRef CPUName = A->getValue(Args);
982
983 if (CPUName == "native") {
984 std::string CPU = llvm::sys::getHostCPUName();
985 if (!CPU.empty() && CPU != "generic")
986 return CPU;
987 else
988 return "";
989 }
990
991 return llvm::StringSwitch<const char *>(CPUName)
992 .Case("common", "generic")
993 .Case("440", "440")
994 .Case("440fp", "440")
995 .Case("450", "450")
996 .Case("601", "601")
997 .Case("602", "602")
998 .Case("603", "603")
999 .Case("603e", "603e")
1000 .Case("603ev", "603ev")
1001 .Case("604", "604")
1002 .Case("604e", "604e")
1003 .Case("620", "620")
1004 .Case("G3", "g3")
1005 .Case("7400", "7400")
1006 .Case("G4", "g4")
1007 .Case("7450", "7450")
1008 .Case("G4+", "g4+")
1009 .Case("750", "750")
1010 .Case("970", "970")
1011 .Case("G5", "g5")
1012 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001013 .Case("e500mc", "e500mc")
1014 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +00001015 .Case("power6", "pwr6")
1016 .Case("power7", "pwr7")
1017 .Case("powerpc", "ppc")
1018 .Case("powerpc64", "ppc64")
1019 .Default("");
1020 }
1021
1022 return "";
1023}
1024
1025void Clang::AddPPCTargetArgs(const ArgList &Args,
1026 ArgStringList &CmdArgs) const {
1027 std::string TargetCPUName = getPPCTargetCPU(Args);
1028
1029 // LLVM may default to generating code for the native CPU,
1030 // but, like gcc, we default to a more generic option for
1031 // each architecture. (except on Darwin)
1032 llvm::Triple Triple = getToolChain().getTriple();
1033 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1034 if (Triple.getArch() == llvm::Triple::ppc64)
1035 TargetCPUName = "ppc64";
1036 else
1037 TargetCPUName = "ppc";
1038 }
1039
1040 if (!TargetCPUName.empty()) {
1041 CmdArgs.push_back("-target-cpu");
1042 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1043 }
1044}
1045
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001046void Clang::AddSparcTargetArgs(const ArgList &Args,
1047 ArgStringList &CmdArgs) const {
1048 const Driver &D = getToolChain().getDriver();
1049
1050 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001051 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001052 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001053 }
1054
1055 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001056 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001057 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1058 options::OPT_mhard_float)) {
1059 if (A->getOption().matches(options::OPT_msoft_float))
1060 FloatABI = "soft";
1061 else if (A->getOption().matches(options::OPT_mhard_float))
1062 FloatABI = "hard";
1063 }
1064
1065 // If unspecified, choose the default based on the platform.
1066 if (FloatABI.empty()) {
1067 switch (getToolChain().getTriple().getOS()) {
1068 default:
1069 // Assume "soft", but warn the user we are guessing.
1070 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001071 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001072 break;
1073 }
1074 }
1075
1076 if (FloatABI == "soft") {
1077 // Floating point operations and argument passing are soft.
1078 //
1079 // FIXME: This changes CPP defines, we need -target-soft-float.
1080 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001081 CmdArgs.push_back("-target-feature");
1082 CmdArgs.push_back("+soft-float");
1083 } else {
1084 assert(FloatABI == "hard" && "Invalid float abi!");
1085 CmdArgs.push_back("-mhard-float");
1086 }
1087}
1088
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001089void Clang::AddX86TargetArgs(const ArgList &Args,
1090 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001091 if (!Args.hasFlag(options::OPT_mred_zone,
1092 options::OPT_mno_red_zone,
1093 true) ||
1094 Args.hasArg(options::OPT_mkernel) ||
1095 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001096 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001097
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001098 if (Args.hasFlag(options::OPT_msoft_float,
1099 options::OPT_mno_soft_float,
1100 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001101 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001102
Daniel Dunbare13ada62009-11-14 22:04:54 +00001103 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001104 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001105 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001106 // FIXME: Reject attempts to use -march=native unless the target matches
1107 // the host.
1108 //
1109 // FIXME: We should also incorporate the detected target features for use
1110 // with -native.
1111 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001112 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001113 CPUName = Args.MakeArgString(CPU);
1114 } else
1115 CPUName = A->getValue(Args);
1116 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001117
Daniel Dunbare13ada62009-11-14 22:04:54 +00001118 // Select the default CPU if none was given (or detection failed).
1119 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001120 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001121 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001122 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001123 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001124 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001125 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001126 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001127 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001128 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001129 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001130 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001131 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001132 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001133 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001134 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001135 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001136 } else if (getToolChain().getOS().startswith("bitrig")) {
1137 if (getToolChain().getArch() == llvm::Triple::x86_64)
1138 CPUName = "x86-64";
1139 else if (getToolChain().getArch() == llvm::Triple::x86)
1140 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001141 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001142 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001143 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001144 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001145 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001146 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001147 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001148 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001149 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001150 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001151 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001152 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001153 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001154 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001155 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001156 }
1157 }
1158
Daniel Dunbare13ada62009-11-14 22:04:54 +00001159 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001160 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001161 CmdArgs.push_back(CPUName);
1162 }
1163
Eli Friedmanad811f02011-07-02 00:34:19 +00001164 // The required algorithm here is slightly strange: the options are applied
1165 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1166 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1167 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1168 // former correctly, but not the latter; handle directly-overridden
1169 // attributes here.
1170 llvm::StringMap<unsigned> PrevFeature;
1171 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001172 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1173 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001174 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001175 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001176
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001177 // Skip over "-m".
1178 assert(Name.startswith("-m") && "Invalid feature name.");
1179 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001180
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001181 bool IsNegative = Name.startswith("no-");
1182 if (IsNegative)
1183 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001184
Eli Friedmanad811f02011-07-02 00:34:19 +00001185 unsigned& Prev = PrevFeature[Name];
1186 if (Prev)
1187 Features[Prev - 1] = 0;
1188 Prev = Features.size() + 1;
1189 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1190 }
1191 for (unsigned i = 0; i < Features.size(); i++) {
1192 if (Features[i]) {
1193 CmdArgs.push_back("-target-feature");
1194 CmdArgs.push_back(Features[i]);
1195 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001196 }
1197}
1198
Tony Linthicum76329bf2011-12-12 21:14:55 +00001199static Arg* getLastHexagonArchArg (const ArgList &Args)
1200{
1201 Arg * A = NULL;
1202
Sebastian Pop86500282012-01-13 20:37:10 +00001203 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1204 it != ie; ++it) {
1205 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001206 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1207 A = *it;
1208 A->claim();
1209 }
Sebastian Pop86500282012-01-13 20:37:10 +00001210 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1211 StringRef Value = (*it)->getValue(Args,0);
1212 if (Value.startswith("v")) {
1213 A = *it;
1214 A->claim();
1215 }
1216 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001217 }
1218 return A;
1219}
1220
Sebastian Pop86500282012-01-13 20:37:10 +00001221static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001222{
1223 Arg *A;
1224 llvm::StringRef WhichHexagon;
1225
Sebastian Pop86500282012-01-13 20:37:10 +00001226 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001227 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001228 WhichHexagon = A->getValue(Args);
1229 if (WhichHexagon == "")
1230 return "v4";
1231 else
1232 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001233 }
Sebastian Pop86500282012-01-13 20:37:10 +00001234 else
1235 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001236}
1237
1238void Clang::AddHexagonTargetArgs(const ArgList &Args,
1239 ArgStringList &CmdArgs) const {
1240 llvm::Triple Triple = getToolChain().getTriple();
1241
1242 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001243 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001244 CmdArgs.push_back("-fno-signed-char");
1245 CmdArgs.push_back("-nobuiltininc");
1246
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001247 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001248 CmdArgs.push_back("-mqdsp6-compat");
1249
1250 if (Arg *A = Args.getLastArg(options::OPT_G,
1251 options::OPT_msmall_data_threshold_EQ)) {
1252 std::string SmallDataThreshold="-small-data-threshold=";
1253 SmallDataThreshold += A->getValue(Args);
1254 CmdArgs.push_back ("-mllvm");
1255 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1256 A->claim();
1257 }
1258
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001259 if (!Args.hasArg(options::OPT_fno_short_enums))
1260 CmdArgs.push_back("-fshort-enums");
1261 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1262 CmdArgs.push_back ("-mllvm");
1263 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1264 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001265 CmdArgs.push_back ("-mllvm");
1266 CmdArgs.push_back ("-machine-sink-split=0");
1267}
1268
Eric Christopher84fbdb42011-08-19 00:30:14 +00001269static bool
John McCall5fb5df92012-06-20 06:18:46 +00001270shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001271 const llvm::Triple &Triple) {
1272 // We use the zero-cost exception tables for Objective-C if the non-fragile
1273 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1274 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001275 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001276 return true;
1277
Bob Wilson6524dd32011-10-14 05:03:44 +00001278 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001279 return false;
1280
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001281 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001282 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001283 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001284}
1285
Anders Carlssone96ab552011-02-28 02:27:16 +00001286/// addExceptionArgs - Adds exception related arguments to the driver command
1287/// arguments. There's a master flag, -fexceptions and also language specific
1288/// flags to enable/disable C++ and Objective-C exceptions.
1289/// This makes it possible to for example disable C++ exceptions but enable
1290/// Objective-C exceptions.
1291static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1292 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001293 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001294 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001295 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001296 if (KernelOrKext) {
1297 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1298 // arguments now to avoid warnings about unused arguments.
1299 Args.ClaimAllArgs(options::OPT_fexceptions);
1300 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1301 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1302 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1303 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1304 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001305 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001306 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001307
1308 // Exceptions are enabled by default.
1309 bool ExceptionsEnabled = true;
1310
1311 // This keeps track of whether exceptions were explicitly turned on or off.
1312 bool DidHaveExplicitExceptionFlag = false;
1313
Rafael Espindola00a66572009-10-01 13:33:33 +00001314 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1315 options::OPT_fno_exceptions)) {
1316 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001317 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001318 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001319 ExceptionsEnabled = false;
1320
1321 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001322 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001323
Anders Carlssone96ab552011-02-28 02:27:16 +00001324 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001325
Anders Carlssone96ab552011-02-28 02:27:16 +00001326 // Exception tables and cleanups can be enabled with -fexceptions even if the
1327 // language itself doesn't support exceptions.
1328 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1329 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001330
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001331 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1332 // is not necessarily sensible, but follows GCC.
1333 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001334 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001335 options::OPT_fno_objc_exceptions,
1336 true)) {
1337 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001338
Eric Christopher84fbdb42011-08-19 00:30:14 +00001339 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001340 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001341 }
1342
1343 if (types::isCXX(InputType)) {
1344 bool CXXExceptionsEnabled = ExceptionsEnabled;
1345
Eric Christopher84fbdb42011-08-19 00:30:14 +00001346 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1347 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001348 options::OPT_fexceptions,
1349 options::OPT_fno_exceptions)) {
1350 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1351 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001352 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001353 CXXExceptionsEnabled = false;
1354 }
1355
1356 if (CXXExceptionsEnabled) {
1357 CmdArgs.push_back("-fcxx-exceptions");
1358
1359 ShouldUseExceptionTables = true;
1360 }
1361 }
1362
1363 if (ShouldUseExceptionTables)
1364 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001365}
1366
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001367static bool ShouldDisableCFI(const ArgList &Args,
1368 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001369 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001370 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001371 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001372 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001373 Default = Args.hasFlag(options::OPT_integrated_as,
1374 options::OPT_no_integrated_as,
1375 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001376 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001377 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1378 options::OPT_fno_dwarf2_cfi_asm,
1379 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001380}
1381
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001382static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1383 const ToolChain &TC) {
1384 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1385 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1386 options::OPT_no_integrated_as,
1387 IsIADefault);
1388 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1389 options::OPT_fno_dwarf_directory_asm,
1390 UseIntegratedAs);
1391 return !UseDwarfDirectory;
1392}
1393
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001394/// \brief Check whether the given input tree contains any compilation actions.
1395static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001396 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001397 return true;
1398
1399 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1400 if (ContainsCompileAction(*it))
1401 return true;
1402
1403 return false;
1404}
1405
1406/// \brief Check if -relax-all should be passed to the internal assembler.
1407/// This is done by default when compiling non-assembler source with -O0.
1408static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1409 bool RelaxDefault = true;
1410
1411 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1412 RelaxDefault = A->getOption().matches(options::OPT_O0);
1413
1414 if (RelaxDefault) {
1415 RelaxDefault = false;
1416 for (ActionList::const_iterator it = C.getActions().begin(),
1417 ie = C.getActions().end(); it != ie; ++it) {
1418 if (ContainsCompileAction(*it)) {
1419 RelaxDefault = true;
1420 break;
1421 }
1422 }
1423 }
1424
1425 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1426 RelaxDefault);
1427}
1428
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001429/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1430/// This needs to be called before we add the C run-time (malloc, etc).
1431static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001432 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001433 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001434 options::OPT_fno_address_sanitizer, false))
1435 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001436 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001437 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001438 if (!Args.hasArg(options::OPT_pie))
1439 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001440 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001441
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001442 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1443 llvm::sys::path::append(LibAsan, "lib", "linux",
1444 (Twine("libclang_rt.asan-") +
1445 TC.getArchName() + "-android.so"));
1446 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001447 } else {
1448 if (!Args.hasArg(options::OPT_shared)) {
1449 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1450 // resource directory.
1451 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1452 llvm::sys::path::append(LibAsan, "lib", "linux",
1453 (Twine("libclang_rt.asan-") +
1454 TC.getArchName() + ".a"));
1455 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1456 CmdArgs.push_back("-lpthread");
1457 CmdArgs.push_back("-ldl");
1458 CmdArgs.push_back("-export-dynamic");
1459 }
1460 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001461}
1462
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001463/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1464/// This needs to be called before we add the C run-time (malloc, etc).
1465static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1466 ArgStringList &CmdArgs) {
1467 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1468 options::OPT_fno_thread_sanitizer, false))
1469 return;
1470 if (!Args.hasArg(options::OPT_shared)) {
1471 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1472 // resource directory.
1473 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1474 llvm::sys::path::append(LibTsan, "lib", "linux",
1475 (Twine("libclang_rt.tsan-") +
1476 TC.getArchName() + ".a"));
1477 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1478 CmdArgs.push_back("-lpthread");
1479 CmdArgs.push_back("-ldl");
1480 CmdArgs.push_back("-export-dynamic");
1481 }
1482}
1483
Richard Smithe30752c2012-10-09 19:52:38 +00001484/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
1485/// (Linux).
1486static void addUbsanRTLinux(const ToolChain &TC, const ArgList &Args,
1487 ArgStringList &CmdArgs) {
1488 if (!Args.hasArg(options::OPT_fcatch_undefined_behavior))
1489 return;
1490 if (!Args.hasArg(options::OPT_shared)) {
1491 // LibUbsan is "libclang_rt.ubsan-<ArchName>.a" in the Linux library
1492 // resource directory.
1493 SmallString<128> LibUbsan(TC.getDriver().ResourceDir);
1494 llvm::sys::path::append(LibUbsan, "lib", "linux",
1495 (Twine("libclang_rt.ubsan-") +
1496 TC.getArchName() + ".a"));
1497 CmdArgs.push_back(Args.MakeArgString(LibUbsan));
1498 }
1499}
1500
Rafael Espindola224dd632011-12-14 21:02:23 +00001501static bool shouldUseFramePointer(const ArgList &Args,
1502 const llvm::Triple &Triple) {
1503 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1504 options::OPT_fomit_frame_pointer))
1505 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1506
Rafael Espindola00b29182011-12-14 21:50:24 +00001507 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001508 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1509 Triple.getArch() == llvm::Triple::x86) &&
1510 Triple.getOS() == llvm::Triple::Linux) {
1511 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1512 if (!A->getOption().matches(options::OPT_O0))
1513 return false;
1514 }
1515
1516 return true;
1517}
1518
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001519void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001520 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001521 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001522 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001523 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001524 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1525 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001526 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001527 ArgStringList CmdArgs;
1528
Daniel Dunbare521a892009-03-31 20:53:55 +00001529 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1530
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001531 // Invoke ourselves in -cc1 mode.
1532 //
1533 // FIXME: Implement custom jobs for internal actions.
1534 CmdArgs.push_back("-cc1");
1535
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001536 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001537 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001538 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001539 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001540
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001541 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001542 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001543
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001544 if (isa<AnalyzeJobAction>(JA)) {
1545 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1546 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001547 } else if (isa<MigrateJobAction>(JA)) {
1548 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001549 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001550 if (Output.getType() == types::TY_Dependencies)
1551 CmdArgs.push_back("-Eonly");
1552 else
1553 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001554 } else if (isa<AssembleJobAction>(JA)) {
1555 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001556
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001557 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001558 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001559
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001560 // When using an integrated assembler, translate -Wa, and -Xassembler
1561 // options.
1562 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1563 options::OPT_Xassembler),
1564 ie = Args.filtered_end(); it != ie; ++it) {
1565 const Arg *A = *it;
1566 A->claim();
1567
1568 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001569 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001570
1571 if (Value == "-force_cpusubtype_ALL") {
1572 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001573 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001574 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001575 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001576 CmdArgs.push_back("-mllvm");
1577 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001578 } else if (Value == "--noexecstack") {
1579 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001580 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001581 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001582 << A->getOption().getName() << Value;
1583 }
1584 }
1585 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001586
1587 // Also ignore explicit -force_cpusubtype_ALL option.
1588 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001589 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001590 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001591 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001592
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001593 if (JA.getType() == types::TY_Nothing)
1594 CmdArgs.push_back("-fsyntax-only");
1595 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001596 CmdArgs.push_back("-emit-pch");
1597 else
1598 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001599 } else {
1600 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001601
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001602 if (JA.getType() == types::TY_Nothing) {
1603 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001604 } else if (JA.getType() == types::TY_LLVM_IR ||
1605 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001606 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001607 } else if (JA.getType() == types::TY_LLVM_BC ||
1608 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001609 CmdArgs.push_back("-emit-llvm-bc");
1610 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001611 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001612 } else if (JA.getType() == types::TY_AST) {
1613 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001614 } else if (JA.getType() == types::TY_RewrittenObjC) {
1615 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001616 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001617 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1618 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001619 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001620 } else {
1621 assert(JA.getType() == types::TY_PP_Asm &&
1622 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001623 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001624 }
1625
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001626 // The make clang go fast button.
1627 CmdArgs.push_back("-disable-free");
1628
John McCallbb79b5f2010-02-13 03:50:24 +00001629 // Disable the verification pass in -asserts builds.
1630#ifdef NDEBUG
1631 CmdArgs.push_back("-disable-llvm-verifier");
1632#endif
1633
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001634 // Set the main file name, so that debug info works even with
1635 // -save-temps.
1636 CmdArgs.push_back("-main-file-name");
1637 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1638
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001639 // Some flags which affect the language (via preprocessor
1640 // defines). See darwin::CC1::AddCPPArgs.
1641 if (Args.hasArg(options::OPT_static))
1642 CmdArgs.push_back("-static-define");
1643
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001644 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001645 // Enable region store model by default.
1646 CmdArgs.push_back("-analyzer-store=region");
1647
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001648 // Treat blocks as analysis entry points.
1649 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1650
Ted Kremenek49c79792011-03-24 00:28:47 +00001651 CmdArgs.push_back("-analyzer-eagerly-assume");
1652
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001653 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001654 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001655 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001656
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001657 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1658 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001659
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001660 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001661 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001662
1663 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001664
1665 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001666 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1667 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1668 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1669 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1670 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1671 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001672 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001673
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001674 // Set the output format. The default is plist, for (lame) historical
1675 // reasons.
1676 CmdArgs.push_back("-analyzer-output");
1677 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1678 CmdArgs.push_back(A->getValue(Args));
1679 else
1680 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001681
Ted Kremenekfe449a22010-03-22 22:32:05 +00001682 // Disable the presentation of standard compiler warnings when
1683 // using --analyze. We only want to show static analyzer diagnostics
1684 // or frontend errors.
1685 CmdArgs.push_back("-w");
1686
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001687 // Add -Xanalyzer arguments when running as analyzer.
1688 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001689 }
1690
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001691 CheckCodeGenerationOptions(D, Args);
1692
Daniel Dunbar44e71222009-04-29 18:32:25 +00001693 // Perform argument translation for LLVM backend. This
1694 // takes some care in reconciling with llvm-gcc. The
1695 // issue is that llvm-gcc translates these options based on
1696 // the values in cc1, whereas we are processing based on
1697 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001698
Daniel Dunbar44e71222009-04-29 18:32:25 +00001699 // This comes from the default translation the driver + cc1
1700 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001701
1702 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1703 options::OPT_fpic, options::OPT_fno_pic,
1704 options::OPT_fPIE, options::OPT_fno_PIE,
1705 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001706 bool PICDisabled = false;
1707 bool PICEnabled = false;
1708 bool PICForPIE = false;
1709 if (LastPICArg) {
1710 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1711 LastPICArg->getOption().matches(options::OPT_fpie));
1712 PICEnabled = (PICForPIE ||
1713 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1714 LastPICArg->getOption().matches(options::OPT_fpic));
1715 PICDisabled = !PICEnabled;
1716 }
1717 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1718 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001719 llvm::Triple Triple(TripleStr);
1720 if ((Args.hasArg(options::OPT_mkernel) ||
1721 Args.hasArg(options::OPT_fapple_kext)) &&
1722 (Triple.getOS() != llvm::Triple::IOS ||
1723 Triple.isOSVersionLT(6)))
Chandler Carruthc0c04552012-04-08 16:40:35 +00001724 PICDisabled = true;
1725 if (Args.hasArg(options::OPT_static))
1726 PICDisabled = true;
1727 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1728
1729 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001730 const char *Model = getToolChain().GetForcedPicModel();
1731 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001732 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001733 Model = "dynamic-no-pic";
1734 else if (PICDisabled)
1735 Model = "static";
1736 else if (PICEnabled)
1737 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001738 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001739 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001740 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001741 StringRef ModelStr = Model ? Model : "";
1742 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001743 CmdArgs.push_back("-mrelocation-model");
1744 CmdArgs.push_back(Model);
1745 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001746
Chandler Carruthc0c04552012-04-08 16:40:35 +00001747 // Infer the __PIC__ and __PIE__ values.
1748 if (ModelStr == "pic" && PICForPIE) {
1749 CmdArgs.push_back("-pie-level");
1750 CmdArgs.push_back((LastPICArg &&
1751 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1752 "2" : "1");
1753 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001754 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001755 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1756 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1757 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001758 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001759
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001760 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1761 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001762 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001763
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001764 // LLVM Code Generator Options.
1765
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001766 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1767 CmdArgs.push_back("-mregparm");
1768 CmdArgs.push_back(A->getValue(Args));
1769 }
1770
Roman Divacky65b88cd2011-03-01 17:40:53 +00001771 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1772 CmdArgs.push_back("-mrtd");
1773
Rafael Espindola224dd632011-12-14 21:02:23 +00001774 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001775 CmdArgs.push_back("-mdisable-fp-elim");
1776 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1777 options::OPT_fno_zero_initialized_in_bss))
1778 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001779 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1780 options::OPT_fno_strict_aliasing,
1781 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001782 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001783 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1784 false))
1785 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001786 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1787 options::OPT_fno_optimize_sibling_calls))
1788 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001789
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001790 // Handle various floating point optimization flags, mapping them to the
1791 // appropriate LLVM code generation flags. The pattern for all of these is to
1792 // default off the codegen optimizations, and if any flag enables them and no
1793 // flag disables them after the flag enabling them, enable the codegen
1794 // optimization. This is complicated by several "umbrella" flags.
1795 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001796 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001797 options::OPT_ffinite_math_only,
1798 options::OPT_fno_finite_math_only,
1799 options::OPT_fhonor_infinities,
1800 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001801 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1802 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001803 A->getOption().getID() != options::OPT_fhonor_infinities)
1804 CmdArgs.push_back("-menable-no-infs");
1805 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001806 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001807 options::OPT_ffinite_math_only,
1808 options::OPT_fno_finite_math_only,
1809 options::OPT_fhonor_nans,
1810 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001811 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1812 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001813 A->getOption().getID() != options::OPT_fhonor_nans)
1814 CmdArgs.push_back("-menable-no-nans");
1815
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001816 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1817 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001818 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001819 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001820 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001821 options::OPT_fno_math_errno))
1822 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1823 if (MathErrno)
1824 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001825
1826 // There are several flags which require disabling very specific
1827 // optimizations. Any of these being disabled forces us to turn off the
1828 // entire set of LLVM optimizations, so collect them through all the flag
1829 // madness.
1830 bool AssociativeMath = false;
1831 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001832 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001833 options::OPT_funsafe_math_optimizations,
1834 options::OPT_fno_unsafe_math_optimizations,
1835 options::OPT_fassociative_math,
1836 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001837 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1838 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001839 A->getOption().getID() != options::OPT_fno_associative_math)
1840 AssociativeMath = true;
1841 bool ReciprocalMath = false;
1842 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001843 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001844 options::OPT_funsafe_math_optimizations,
1845 options::OPT_fno_unsafe_math_optimizations,
1846 options::OPT_freciprocal_math,
1847 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001848 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1849 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001850 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1851 ReciprocalMath = true;
1852 bool SignedZeros = true;
1853 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001854 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001855 options::OPT_funsafe_math_optimizations,
1856 options::OPT_fno_unsafe_math_optimizations,
1857 options::OPT_fsigned_zeros,
1858 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001859 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1860 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001861 A->getOption().getID() != options::OPT_fsigned_zeros)
1862 SignedZeros = false;
1863 bool TrappingMath = true;
1864 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001865 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001866 options::OPT_funsafe_math_optimizations,
1867 options::OPT_fno_unsafe_math_optimizations,
1868 options::OPT_ftrapping_math,
1869 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001870 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1871 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001872 A->getOption().getID() != options::OPT_ftrapping_math)
1873 TrappingMath = false;
1874 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1875 !TrappingMath)
1876 CmdArgs.push_back("-menable-unsafe-fp-math");
1877
Lang Hamesaa53b932012-07-06 00:59:19 +00001878
1879 // Validate and pass through -fp-contract option.
1880 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001881 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001882 options::OPT_ffp_contract)) {
1883 if (A->getOption().getID() == options::OPT_ffp_contract) {
1884 StringRef Val = A->getValue(Args);
1885 if (Val == "fast" || Val == "on" || Val == "off") {
1886 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1887 } else {
1888 D.Diag(diag::err_drv_unsupported_option_argument)
1889 << A->getOption().getName() << Val;
1890 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001891 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001892 // If fast-math is set then set the fp-contract mode to fast.
1893 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1894 }
1895 }
1896
Bob Wilson6a039162012-07-19 03:52:53 +00001897 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1898 // and if we find them, tell the frontend to provide the appropriate
1899 // preprocessor macros. This is distinct from enabling any optimizations as
1900 // these options induce language changes which must survive serialization
1901 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001902 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1903 if (A->getOption().matches(options::OPT_ffast_math))
1904 CmdArgs.push_back("-ffast-math");
1905 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1906 if (A->getOption().matches(options::OPT_ffinite_math_only))
1907 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001908
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001909 // Decide whether to use verbose asm. Verbose assembly is the default on
1910 // toolchains which have the integrated assembler on by default.
1911 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1912 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001913 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001914 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001915 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001916
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001917 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1918 CmdArgs.push_back("-mdebug-pass");
1919 CmdArgs.push_back("Structure");
1920 }
1921 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1922 CmdArgs.push_back("-mdebug-pass");
1923 CmdArgs.push_back("Arguments");
1924 }
1925
John McCall8517abc2010-02-19 02:45:38 +00001926 // Enable -mconstructor-aliases except on darwin, where we have to
1927 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001928 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001929 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001930
John McCall7ef5cb32011-03-18 02:56:14 +00001931 // Darwin's kernel doesn't support guard variables; just die if we
1932 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001933 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001934 CmdArgs.push_back("-fforbid-guard-variables");
1935
Douglas Gregordbe39272011-02-01 15:15:22 +00001936 if (Args.hasArg(options::OPT_mms_bitfields)) {
1937 CmdArgs.push_back("-mms-bitfields");
1938 }
John McCall8517abc2010-02-19 02:45:38 +00001939
Daniel Dunbar306945d2009-09-16 06:17:29 +00001940 // This is a coarse approximation of what llvm-gcc actually does, both
1941 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1942 // complicated ways.
1943 bool AsynchronousUnwindTables =
1944 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1945 options::OPT_fno_asynchronous_unwind_tables,
1946 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001947 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001948 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1949 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001950 CmdArgs.push_back("-munwind-tables");
1951
Rafael Espindola66aa0452012-06-19 01:26:10 +00001952 getToolChain().addClangTargetOptions(CmdArgs);
1953
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001954 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1955 CmdArgs.push_back("-mlimit-float-precision");
1956 CmdArgs.push_back(A->getValue(Args));
1957 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001958
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001959 // FIXME: Handle -mtune=.
1960 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001961
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001962 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001963 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001964 CmdArgs.push_back(A->getValue(Args));
1965 }
1966
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001967 // Add target specific cpu and features flags.
1968 switch(getToolChain().getTriple().getArch()) {
1969 default:
1970 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001971
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001972 case llvm::Triple::arm:
1973 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001974 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001975 break;
1976
Eric Christopher0b26a612010-03-02 02:41:08 +00001977 case llvm::Triple::mips:
1978 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001979 case llvm::Triple::mips64:
1980 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001981 AddMIPSTargetArgs(Args, CmdArgs);
1982 break;
1983
Hal Finkel8eb59282012-06-11 22:35:19 +00001984 case llvm::Triple::ppc:
1985 case llvm::Triple::ppc64:
1986 AddPPCTargetArgs(Args, CmdArgs);
1987 break;
1988
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001989 case llvm::Triple::sparc:
1990 AddSparcTargetArgs(Args, CmdArgs);
1991 break;
1992
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001993 case llvm::Triple::x86:
1994 case llvm::Triple::x86_64:
1995 AddX86TargetArgs(Args, CmdArgs);
1996 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001997
1998 case llvm::Triple::hexagon:
1999 AddHexagonTargetArgs(Args, CmdArgs);
2000 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002001 }
2002
Tony Linthicum76329bf2011-12-12 21:14:55 +00002003
2004
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002005 // Pass the linker version in use.
2006 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2007 CmdArgs.push_back("-target-linker-version");
2008 CmdArgs.push_back(A->getValue(Args));
2009 }
2010
Nick Lewycky75033772011-02-02 06:43:03 +00002011 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002012 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00002013 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00002014 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002015 CmdArgs.push_back("-momit-leaf-frame-pointer");
2016
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002017 // Explicitly error on some things we know we don't support and can't just
2018 // ignore.
2019 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002020 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2021 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002022 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002023 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002024 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002025 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2026 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002027 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002028 << Unsupported->getOption().getName();
2029 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002030 }
2031
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002032 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002033 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002034 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002035 CmdArgs.push_back("-header-include-file");
2036 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2037 D.CCPrintHeadersFilename : "-");
2038 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002039 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002040 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002041
Chad Rosierbe10f982011-08-02 17:58:04 +00002042 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002043 CmdArgs.push_back("-diagnostic-log-file");
2044 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2045 D.CCLogDiagnosticsFilename : "-");
2046 }
2047
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002048 // Use the last option from "-g" group. "-gline-tables-only" is
2049 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002050 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002051 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2052 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2053 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002054 } else if (!A->getOption().matches(options::OPT_g0) &&
2055 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002056 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002057 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002058 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002059
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002060 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2061 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002062 if (Args.hasArg(options::OPT_gcolumn_info))
2063 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002064
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002065 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2066 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2067
Chris Lattner3c77a352010-06-22 00:03:40 +00002068 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2069
Nick Lewycky207bce32011-04-21 23:44:07 +00002070 if (Args.hasArg(options::OPT_ftest_coverage) ||
2071 Args.hasArg(options::OPT_coverage))
2072 CmdArgs.push_back("-femit-coverage-notes");
2073 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2074 Args.hasArg(options::OPT_coverage))
2075 CmdArgs.push_back("-femit-coverage-data");
2076
Nick Lewycky480cb992011-05-04 20:46:58 +00002077 if (C.getArgs().hasArg(options::OPT_c) ||
2078 C.getArgs().hasArg(options::OPT_S)) {
2079 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002080 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002081 SmallString<128> absFilename(Output.getFilename());
2082 llvm::sys::fs::make_absolute(absFilename);
2083 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002084 }
2085 }
2086
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002087 // Pass options for controlling the default header search paths.
2088 if (Args.hasArg(options::OPT_nostdinc)) {
2089 CmdArgs.push_back("-nostdsysteminc");
2090 CmdArgs.push_back("-nobuiltininc");
2091 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002092 if (Args.hasArg(options::OPT_nostdlibinc))
2093 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002094 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2095 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2096 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002097
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002098 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002099 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002100 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002101
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002102 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2103
Ted Kremenekf7639e12012-03-06 20:06:33 +00002104 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002105 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002106 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002107 options::OPT_ccc_arcmt_modify,
2108 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002109 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002110 switch (A->getOption().getID()) {
2111 default:
2112 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002113 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002114 CmdArgs.push_back("-arcmt-check");
2115 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002116 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002117 CmdArgs.push_back("-arcmt-modify");
2118 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002119 case options::OPT_ccc_arcmt_migrate:
2120 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002121 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002122 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002123
2124 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2125 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002126 break;
John McCalld70fb982011-06-15 23:25:17 +00002127 }
2128 }
2129 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002130
Ted Kremenekf7639e12012-03-06 20:06:33 +00002131 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2132 if (ARCMTEnabled) {
2133 D.Diag(diag::err_drv_argument_not_allowed_with)
2134 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2135 }
2136 CmdArgs.push_back("-mt-migrate-directory");
2137 CmdArgs.push_back(A->getValue(Args));
2138
2139 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2140 options::OPT_objcmt_migrate_subscripting)) {
2141 // None specified, means enable them all.
2142 CmdArgs.push_back("-objcmt-migrate-literals");
2143 CmdArgs.push_back("-objcmt-migrate-subscripting");
2144 } else {
2145 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2146 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2147 }
2148 }
2149
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002150 // Add preprocessing options like -I, -D, etc. if we are using the
2151 // preprocessor.
2152 //
2153 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002154 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002155 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002156
Rafael Espindolaa7431922011-07-21 23:40:37 +00002157 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2158 // that "The compiler can only warn and ignore the option if not recognized".
2159 // When building with ccache, it will pass -D options to clang even on
2160 // preprocessed inputs and configure concludes that -fPIC is not supported.
2161 Args.ClaimAllArgs(options::OPT_D);
2162
Daniel Dunbar58f78332009-09-17 06:53:36 +00002163 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002164 // others.
2165 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002166 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002167 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002168 else if (A->getOption().matches(options::OPT_O) &&
2169 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002170 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002171 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002172 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002173 }
2174
Daniel Dunbar945577c2009-10-29 02:24:45 +00002175 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002176 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2177 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002178 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002179 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002180
2181 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2182 // (-ansi is equivalent to -std=c89).
2183 //
2184 // If a std is supplied, only add -trigraphs if it follows the
2185 // option.
2186 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2187 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002188 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002189 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002190 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002191 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002192 else
2193 Std->render(Args, CmdArgs);
2194
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002195 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2196 options::OPT_trigraphs))
2197 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002198 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002199 } else {
2200 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002201 //
2202 // FIXME: Clang doesn't correctly handle -std= when the input language
2203 // doesn't match. For the time being just ignore this for C++ inputs;
2204 // eventually we want to do all the standard defaulting here instead of
2205 // splitting it between the driver and clang -cc1.
2206 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002207 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2208 "-std=", /*Joined=*/true);
2209 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2210 CmdArgs.push_back("-std=c++11");
2211
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002212 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002213 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002214
Chandler Carruthb009b142011-04-23 06:30:43 +00002215 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2216 // '-fconst-strings'; this better indicates its actual behavior.
2217 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2218 false)) {
2219 // For perfect compatibility with GCC, we do this even in the presence of
2220 // '-w'. This flag names something other than a warning for GCC.
2221 CmdArgs.push_back("-fconst-strings");
2222 }
2223
Chandler Carruth61fbf622011-04-23 09:27:53 +00002224 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002225 // during C++ compilation, which it is by default. GCC keeps this define even
2226 // in the presence of '-w', match this behavior bug-for-bug.
2227 if (types::isCXX(InputType) &&
2228 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2229 true)) {
2230 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002231 }
2232
Chandler Carruthe0391482010-05-22 02:21:53 +00002233 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2234 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2235 if (Asm->getOption().matches(options::OPT_fasm))
2236 CmdArgs.push_back("-fgnu-keywords");
2237 else
2238 CmdArgs.push_back("-fno-gnu-keywords");
2239 }
2240
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002241 if (ShouldDisableCFI(Args, getToolChain()))
2242 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002243
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002244 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2245 CmdArgs.push_back("-fno-dwarf-directory-asm");
2246
Nick Lewyckyba743b72011-10-21 02:32:14 +00002247 if (const char *pwd = ::getenv("PWD")) {
2248 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2249 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002250 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002251 std::string CompDir = pwd;
2252 CmdArgs.push_back("-fdebug-compilation-dir");
2253 CmdArgs.push_back(Args.MakeArgString(CompDir));
2254 }
2255 }
2256
Richard Smith9a568822011-11-21 19:36:32 +00002257 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2258 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002259 CmdArgs.push_back("-ftemplate-depth");
2260 CmdArgs.push_back(A->getValue(Args));
2261 }
2262
Richard Smith9a568822011-11-21 19:36:32 +00002263 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2264 CmdArgs.push_back("-fconstexpr-depth");
2265 CmdArgs.push_back(A->getValue(Args));
2266 }
2267
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002268 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2269 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002270 if (A->getNumValues()) {
2271 StringRef bytes = A->getValue(Args);
2272 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2273 } else
2274 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002275 }
2276
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002277 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2278 options::OPT_fbounds_checking_EQ)) {
2279 if (A->getNumValues()) {
2280 StringRef val = A->getValue(Args);
2281 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2282 } else
2283 CmdArgs.push_back("-fbounds-checking=1");
2284 }
2285
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002286 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002287 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002288
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002289 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2290 CmdArgs.push_back("-fconstant-string-class");
2291 CmdArgs.push_back(A->getValue(Args));
2292 }
David Chisnall5778fce2009-08-31 16:41:57 +00002293
Chris Lattnere23003d2010-01-09 21:54:33 +00002294 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2295 CmdArgs.push_back("-ftabstop");
2296 CmdArgs.push_back(A->getValue(Args));
2297 }
2298
Chris Lattnerb35583d2010-04-07 20:49:23 +00002299 CmdArgs.push_back("-ferror-limit");
2300 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2301 CmdArgs.push_back(A->getValue(Args));
2302 else
2303 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002304
Chandler Carrutha77a7272010-05-06 04:55:18 +00002305 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2306 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002307 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002308 }
2309
2310 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2311 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002312 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002313 }
2314
Richard Smithf6f003a2011-12-16 19:06:07 +00002315 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2316 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2317 CmdArgs.push_back(A->getValue(Args));
2318 }
2319
Daniel Dunbar2c978472009-11-04 06:24:47 +00002320 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002321 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002322 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002323 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002324 } else {
2325 // If -fmessage-length=N was not specified, determine whether this is a
2326 // terminal and, if so, implicitly define -fmessage-length appropriately.
2327 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002328 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002329 }
2330
Daniel Dunbare357d562009-12-03 18:42:11 +00002331 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2332 CmdArgs.push_back("-fvisibility");
2333 CmdArgs.push_back(A->getValue(Args));
2334 }
2335
Douglas Gregor08329632010-06-15 17:05:35 +00002336 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002337
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002338 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2339
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002340 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002341 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2342 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002343 CmdArgs.push_back("-ffreestanding");
2344
Daniel Dunbare357d562009-12-03 18:42:11 +00002345 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002346 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002347 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002348 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002349 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002350 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002351 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002352 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002353 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2354 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002355
2356 // Report and error for -faltivec on anything other then PowerPC.
2357 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2358 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2359 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2360 D.Diag(diag::err_drv_argument_only_allowed_with)
2361 << A->getAsString(Args) << "ppc/ppc64";
2362
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002363 if (getToolChain().SupportsProfiling())
2364 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002365
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002366 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2367 options::OPT_fno_address_sanitizer, false))
2368 CmdArgs.push_back("-faddress-sanitizer");
2369
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002370 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2371 options::OPT_fno_thread_sanitizer, false))
2372 CmdArgs.push_back("-fthread-sanitizer");
2373
Daniel Dunbar35621a92010-03-16 16:57:46 +00002374 // -flax-vector-conversions is default.
2375 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2376 options::OPT_fno_lax_vector_conversions))
2377 CmdArgs.push_back("-fno-lax-vector-conversions");
2378
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002379 if (Args.getLastArg(options::OPT_fapple_kext))
2380 CmdArgs.push_back("-fapple-kext");
2381
David Blaikie690f21e2012-06-14 18:55:27 +00002382 if (Args.hasFlag(options::OPT_frewrite_includes,
2383 options::OPT_fno_rewrite_includes, false))
2384 CmdArgs.push_back("-frewrite-includes");
2385
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002386 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002387 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002388 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002389 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2390 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002391
2392 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2393 CmdArgs.push_back("-ftrapv-handler");
2394 CmdArgs.push_back(A->getValue(Args));
2395 }
2396
Bob Wilson14adb362012-02-03 06:27:22 +00002397 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002398
Chandler Carruth6e501032011-03-27 00:04:55 +00002399 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2400 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2401 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2402 options::OPT_fno_wrapv)) {
2403 if (A->getOption().matches(options::OPT_fwrapv))
2404 CmdArgs.push_back("-fwrapv");
2405 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2406 options::OPT_fno_strict_overflow)) {
2407 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2408 CmdArgs.push_back("-fwrapv");
2409 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002410 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002411 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002412
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002413 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2414
Daniel Dunbar4930e332009-11-17 08:07:36 +00002415 // -stack-protector=0 is default.
2416 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002417 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2418 options::OPT_fstack_protector_all,
2419 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002420 if (A->getOption().matches(options::OPT_fstack_protector))
2421 StackProtectorLevel = 1;
2422 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2423 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002424 } else {
2425 StackProtectorLevel =
2426 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2427 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002428 if (StackProtectorLevel) {
2429 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002430 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002431 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002432
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002433 // --param ssp-buffer-size=
2434 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2435 ie = Args.filtered_end(); it != ie; ++it) {
2436 StringRef Str((*it)->getValue(Args));
2437 if (Str.startswith("ssp-buffer-size=")) {
2438 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002439 CmdArgs.push_back("-stack-protector-buffer-size");
2440 // FIXME: Verify the argument is a valid integer.
2441 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002442 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002443 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002444 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002445 }
2446
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002447 // Translate -mstackrealign
2448 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2449 false)) {
2450 CmdArgs.push_back("-backend-option");
2451 CmdArgs.push_back("-force-align-stack");
2452 }
2453 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2454 false)) {
2455 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2456 }
2457
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002458 if (Args.hasArg(options::OPT_mstack_alignment)) {
2459 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2460 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002461 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002462
Daniel Dunbard18049a2009-04-07 21:16:11 +00002463 // Forward -f options with positive and negative forms; we translate
2464 // these by hand.
2465
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002466 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002467 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002468 CmdArgs.push_back("-fapple-kext");
2469 if (!Args.hasArg(options::OPT_fbuiltin))
2470 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002471 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002472 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002473 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002474 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002475 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002476
Nuno Lopes13c88c72009-12-16 16:59:22 +00002477 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2478 options::OPT_fno_assume_sane_operator_new))
2479 CmdArgs.push_back("-fno-assume-sane-operator-new");
2480
Daniel Dunbar4930e332009-11-17 08:07:36 +00002481 // -fblocks=0 is default.
2482 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002483 getToolChain().IsBlocksDefault()) ||
2484 (Args.hasArg(options::OPT_fgnu_runtime) &&
2485 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2486 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002487 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002488
2489 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2490 !getToolChain().hasBlocksRuntime())
2491 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002492 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002493
Douglas Gregor226173a2012-01-18 15:19:58 +00002494 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2495 // users must also pass -fcxx-modules. The latter flag will disappear once the
2496 // modules implementation is solid for C++/Objective-C++ programs as well.
2497 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2498 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2499 options::OPT_fno_cxx_modules,
2500 false);
2501 if (AllowedInCXX || !types::isCXX(InputType))
2502 CmdArgs.push_back("-fmodules");
2503 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002504
John McCalldfea9982010-04-09 19:12:06 +00002505 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002506 if (Args.hasFlag(options::OPT_fno_access_control,
2507 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002508 false))
John McCall3155f572010-04-09 19:03:51 +00002509 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002510
Anders Carlssond470fef2010-11-21 00:09:52 +00002511 // -felide-constructors is the default.
2512 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2513 options::OPT_felide_constructors,
2514 false))
2515 CmdArgs.push_back("-fno-elide-constructors");
2516
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002517 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002518 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2519 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002520 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002521
Tony Linthicum76329bf2011-12-12 21:14:55 +00002522 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002523 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002524 options::OPT_fno_short_enums,
2525 getToolChain().getTriple().getArch() ==
2526 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002527 CmdArgs.push_back("-fshort-enums");
2528
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002529 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002530 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002531 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002532 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002533
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002534 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002535 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002536 options::OPT_fno_threadsafe_statics))
2537 CmdArgs.push_back("-fno-threadsafe-statics");
2538
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002539 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002540 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2541 options::OPT_fno_use_cxa_atexit,
2542 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002543 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002544 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2545 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002546 CmdArgs.push_back("-fno-use-cxa-atexit");
2547
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002548 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002549 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002550 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2551 CmdArgs.push_back("-fms-extensions");
2552
Chad Rosiered943242012-07-20 21:20:33 +00002553 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002554 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2555 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002556
Francois Pichet1b4f1632011-09-17 04:32:15 +00002557 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002558 if (Args.hasFlag(options::OPT_fms_compatibility,
2559 options::OPT_fno_ms_compatibility,
2560 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2561 Args.hasFlag(options::OPT_fms_extensions,
2562 options::OPT_fno_ms_extensions,
2563 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002564 CmdArgs.push_back("-fms-compatibility");
2565
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002566 // -fmsc-version=1300 is default.
2567 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2568 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2569 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002570 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002571 if (msc_ver.empty())
2572 CmdArgs.push_back("-fmsc-version=1300");
2573 else
2574 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2575 }
2576
2577
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002578 // -fborland-extensions=0 is default.
2579 if (Args.hasFlag(options::OPT_fborland_extensions,
2580 options::OPT_fno_borland_extensions, false))
2581 CmdArgs.push_back("-fborland-extensions");
2582
Francois Pichet02744872011-09-01 16:38:08 +00002583 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2584 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002585 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2586 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002587 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002588 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002589
Chandler Carruthe03aa552010-04-17 20:17:31 +00002590 // -fgnu-keywords default varies depending on language; only pass if
2591 // specified.
2592 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002593 options::OPT_fno_gnu_keywords))
2594 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002595
Rafael Espindola922a6242011-06-02 17:30:53 +00002596 if (Args.hasFlag(options::OPT_fgnu89_inline,
2597 options::OPT_fno_gnu89_inline,
2598 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002599 CmdArgs.push_back("-fgnu89-inline");
2600
Chad Rosier9c76d242012-03-15 22:31:42 +00002601 if (Args.hasArg(options::OPT_fno_inline))
2602 CmdArgs.push_back("-fno-inline");
2603
Chad Rosier64d6be92012-03-06 21:17:19 +00002604 if (Args.hasArg(options::OPT_fno_inline_functions))
2605 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002606
John McCall5fb5df92012-06-20 06:18:46 +00002607 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002608
John McCall5fb5df92012-06-20 06:18:46 +00002609 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2610 // legacy is the default.
2611 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002612 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2613 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002614 objcRuntime.isLegacyDispatchDefaultForArch(
2615 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002616 if (getToolChain().UseObjCMixedDispatch())
2617 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2618 else
2619 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2620 }
2621 }
2622
Nico Weber97bd94b2012-03-09 21:19:44 +00002623 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2624 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002625 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002626 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2627 }
2628
John McCall24fc0de2011-07-06 00:26:06 +00002629 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2630 // NOTE: This logic is duplicated in ToolChains.cpp.
2631 bool ARC = isObjCAutoRefCount(Args);
2632 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002633 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002634
John McCall24fc0de2011-07-06 00:26:06 +00002635 CmdArgs.push_back("-fobjc-arc");
2636
Chandler Carruth491db322011-11-04 07:34:47 +00002637 // FIXME: It seems like this entire block, and several around it should be
2638 // wrapped in isObjC, but for now we just use it here as this is where it
2639 // was being used previously.
2640 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2641 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2642 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2643 else
2644 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2645 }
2646
John McCall24fc0de2011-07-06 00:26:06 +00002647 // Allow the user to enable full exceptions code emission.
2648 // We define off for Objective-CC, on for Objective-C++.
2649 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2650 options::OPT_fno_objc_arc_exceptions,
2651 /*default*/ types::isCXX(InputType)))
2652 CmdArgs.push_back("-fobjc-arc-exceptions");
2653 }
2654
2655 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2656 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002657 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002658 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002659
John McCall24fc0de2011-07-06 00:26:06 +00002660 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2661 // takes precedence.
2662 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2663 if (!GCArg)
2664 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2665 if (GCArg) {
2666 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002667 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002668 << GCArg->getAsString(Args);
2669 } else if (getToolChain().SupportsObjCGC()) {
2670 GCArg->render(Args, CmdArgs);
2671 } else {
2672 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002673 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002674 << GCArg->getAsString(Args);
2675 }
2676 }
2677
John McCallb5f652e2011-06-22 00:53:57 +00002678 // Add exception args.
2679 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002680 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002681
2682 if (getToolChain().UseSjLjExceptions())
2683 CmdArgs.push_back("-fsjlj-exceptions");
2684
2685 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002686 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2687 options::OPT_fno_assume_sane_operator_new))
2688 CmdArgs.push_back("-fno-assume-sane-operator-new");
2689
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002690 // -fconstant-cfstrings is default, and may be subject to argument translation
2691 // on Darwin.
2692 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2693 options::OPT_fno_constant_cfstrings) ||
2694 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2695 options::OPT_mno_constant_cfstrings))
2696 CmdArgs.push_back("-fno-constant-cfstrings");
2697
John Thompsoned4e2952009-11-05 20:14:16 +00002698 // -fshort-wchar default varies depending on platform; only
2699 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002700 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2701 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002702
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002703 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2704 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002705 //
2706 // FIXME: This is gross; that translation should be pulled from the
2707 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002708 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002709 options::OPT_fno_pascal_strings,
2710 false) ||
2711 Args.hasFlag(options::OPT_mpascal_strings,
2712 options::OPT_mno_pascal_strings,
2713 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002714 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002715
Daniel Dunbar096ed292011-10-05 21:04:55 +00002716 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2717 // -fno-pack-struct doesn't apply to -fpack-struct=.
2718 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002719 std::string PackStructStr = "-fpack-struct=";
2720 PackStructStr += A->getValue(Args);
2721 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002722 } else if (Args.hasFlag(options::OPT_fpack_struct,
2723 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002724 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002725 }
2726
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002727 if (Args.hasArg(options::OPT_mkernel) ||
2728 Args.hasArg(options::OPT_fapple_kext)) {
2729 if (!Args.hasArg(options::OPT_fcommon))
2730 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002731 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002732 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002733
Daniel Dunbard18049a2009-04-07 21:16:11 +00002734 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002735 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002736 CmdArgs.push_back("-fno-common");
2737
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002738 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002739 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002740 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002741 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002742 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002743 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2744
Daniel Dunbar6358d682010-10-15 22:30:42 +00002745 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2746 if (!Args.hasFlag(options::OPT_ffor_scope,
2747 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002748 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002749 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2750
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002751 // -fcaret-diagnostics is default.
2752 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2753 options::OPT_fno_caret_diagnostics, true))
2754 CmdArgs.push_back("-fno-caret-diagnostics");
2755
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002756 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002757 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002758 options::OPT_fno_diagnostics_fixit_info))
2759 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002760
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002761 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002762 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002763 options::OPT_fno_diagnostics_show_option))
2764 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002765
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002766 if (const Arg *A =
2767 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2768 CmdArgs.push_back("-fdiagnostics-show-category");
2769 CmdArgs.push_back(A->getValue(Args));
2770 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002771
Douglas Gregor643c9222011-05-21 17:07:29 +00002772 if (const Arg *A =
2773 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2774 CmdArgs.push_back("-fdiagnostics-format");
2775 CmdArgs.push_back(A->getValue(Args));
2776 }
2777
Chandler Carruthb6766f02011-03-27 01:50:55 +00002778 if (Arg *A = Args.getLastArg(
2779 options::OPT_fdiagnostics_show_note_include_stack,
2780 options::OPT_fno_diagnostics_show_note_include_stack)) {
2781 if (A->getOption().matches(
2782 options::OPT_fdiagnostics_show_note_include_stack))
2783 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2784 else
2785 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2786 }
2787
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002788 // Color diagnostics are the default, unless the terminal doesn't support
2789 // them.
2790 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002791 options::OPT_fno_color_diagnostics,
2792 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002793 CmdArgs.push_back("-fcolor-diagnostics");
2794
Daniel Dunbardb097022009-06-08 21:13:54 +00002795 if (!Args.hasFlag(options::OPT_fshow_source_location,
2796 options::OPT_fno_show_source_location))
2797 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002798
Douglas Gregor643c9222011-05-21 17:07:29 +00002799 if (!Args.hasFlag(options::OPT_fshow_column,
2800 options::OPT_fno_show_column,
2801 true))
2802 CmdArgs.push_back("-fno-show-column");
2803
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002804 if (!Args.hasFlag(options::OPT_fspell_checking,
2805 options::OPT_fno_spell_checking))
2806 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002807
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002808
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002809 // Silently ignore -fasm-blocks for now.
2810 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2811 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002812
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002813 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2814 A->render(Args, CmdArgs);
2815
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002816 // -fdollars-in-identifiers default varies depending on platform and
2817 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002818 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002819 options::OPT_fno_dollars_in_identifiers)) {
2820 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002821 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002822 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002823 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002824 }
2825
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002826 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2827 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002828 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002829 options::OPT_fno_unit_at_a_time)) {
2830 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002831 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002832 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002833
Eli Friedman055c9702011-11-02 01:53:16 +00002834 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2835 options::OPT_fno_apple_pragma_pack, false))
2836 CmdArgs.push_back("-fapple-pragma-pack");
2837
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002838 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002839 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002840 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002841#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002842 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002843 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2844 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2845 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2846 CmdArgs.push_back("-fno-builtin-strcat");
2847 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2848 CmdArgs.push_back("-fno-builtin-strcpy");
2849 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002850#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002851
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002852 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002853 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002854 options::OPT_traditional_cpp)) {
2855 if (isa<PreprocessJobAction>(JA))
2856 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002857 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002858 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002859 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002860
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002861 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002862 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002863
2864 // Handle serialized diagnostics.
2865 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2866 CmdArgs.push_back("-serialize-diagnostic-file");
2867 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2868 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002869
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002870 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2871 CmdArgs.push_back("-fretain-comments-from-system-headers");
2872
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002873 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2874 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002875 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002876 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2877 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002878 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002879
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002880 // We translate this by hand to the -cc1 argument, since nightly test uses
2881 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002882 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002883 CmdArgs.push_back("-disable-llvm-optzns");
2884 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002885 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002886 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002887
Daniel Dunbard67a3222009-03-30 06:36:42 +00002888 if (Output.getType() == types::TY_Dependencies) {
2889 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002890 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002891 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002892 CmdArgs.push_back(Output.getFilename());
2893 } else {
2894 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002895 }
2896
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002897 for (InputInfoList::const_iterator
2898 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2899 const InputInfo &II = *it;
2900 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00002901 if (Args.hasArg(options::OPT_rewrite_objc))
2902 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2903 else
2904 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002905 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002906 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002907 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002908 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002909 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002910
Chris Lattnere9d7d782009-11-03 19:50:27 +00002911 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2912
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002913 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002914
2915 // Optionally embed the -cc1 level arguments into the debug info, for build
2916 // analysis.
2917 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002918 ArgStringList OriginalArgs;
2919 for (ArgList::const_iterator it = Args.begin(),
2920 ie = Args.end(); it != ie; ++it)
2921 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002922
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002923 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002924 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002925 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002926 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002927 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002928 }
2929 CmdArgs.push_back("-dwarf-debug-flags");
2930 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2931 }
2932
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002933 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002934
Roman Divacky178e01602011-02-10 16:52:03 +00002935 if (Arg *A = Args.getLastArg(options::OPT_pg))
2936 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002937 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002938 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002939
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002940 // Claim some arguments which clang supports automatically.
2941
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002942 // -fpch-preprocess is used with gcc to add a special marker in the output to
2943 // include the PCH file. Clang's PTH solution is completely transparent, so we
2944 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002945 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002946
Daniel Dunbar17731772009-03-23 19:03:36 +00002947 // Claim some arguments which clang doesn't support, but we don't
2948 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002949 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2950 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002951
Rafael Espindolad95a8122011-03-01 05:25:27 +00002952 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002953 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002954 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002955}
2956
Jim Grosbach576452b2012-02-10 20:37:10 +00002957void ClangAs::AddARMTargetArgs(const ArgList &Args,
2958 ArgStringList &CmdArgs) const {
2959 const Driver &D = getToolChain().getDriver();
2960 llvm::Triple Triple = getToolChain().getTriple();
2961
2962 // Set the CPU based on -march= and -mcpu=.
2963 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002964 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002965
2966 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002967 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002968 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002969
2970 // Honor -mfpmath=.
2971 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002972 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002973}
2974
John McCall5fb5df92012-06-20 06:18:46 +00002975/// Add options related to the Objective-C runtime/ABI.
2976///
2977/// Returns true if the runtime is non-fragile.
2978ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2979 ArgStringList &cmdArgs,
2980 RewriteKind rewriteKind) const {
2981 // Look for the controlling runtime option.
2982 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2983 options::OPT_fgnu_runtime,
2984 options::OPT_fobjc_runtime_EQ);
2985
2986 // Just forward -fobjc-runtime= to the frontend. This supercedes
2987 // options about fragility.
2988 if (runtimeArg &&
2989 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2990 ObjCRuntime runtime;
2991 StringRef value = runtimeArg->getValue(args);
2992 if (runtime.tryParse(value)) {
2993 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2994 << value;
2995 }
2996
2997 runtimeArg->render(args, cmdArgs);
2998 return runtime;
2999 }
3000
3001 // Otherwise, we'll need the ABI "version". Version numbers are
3002 // slightly confusing for historical reasons:
3003 // 1 - Traditional "fragile" ABI
3004 // 2 - Non-fragile ABI, version 1
3005 // 3 - Non-fragile ABI, version 2
3006 unsigned objcABIVersion = 1;
3007 // If -fobjc-abi-version= is present, use that to set the version.
3008 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
3009 StringRef value = abiArg->getValue(args);
3010 if (value == "1")
3011 objcABIVersion = 1;
3012 else if (value == "2")
3013 objcABIVersion = 2;
3014 else if (value == "3")
3015 objcABIVersion = 3;
3016 else
3017 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3018 << value;
3019 } else {
3020 // Otherwise, determine if we are using the non-fragile ABI.
3021 bool nonFragileABIIsDefault =
3022 (rewriteKind == RK_NonFragile ||
3023 (rewriteKind == RK_None &&
3024 getToolChain().IsObjCNonFragileABIDefault()));
3025 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
3026 options::OPT_fno_objc_nonfragile_abi,
3027 nonFragileABIIsDefault)) {
3028 // Determine the non-fragile ABI version to use.
3029#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
3030 unsigned nonFragileABIVersion = 1;
3031#else
3032 unsigned nonFragileABIVersion = 2;
3033#endif
3034
3035 if (Arg *abiArg = args.getLastArg(
3036 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3037 StringRef value = abiArg->getValue(args);
3038 if (value == "1")
3039 nonFragileABIVersion = 1;
3040 else if (value == "2")
3041 nonFragileABIVersion = 2;
3042 else
3043 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3044 << value;
3045 }
3046
3047 objcABIVersion = 1 + nonFragileABIVersion;
3048 } else {
3049 objcABIVersion = 1;
3050 }
3051 }
3052
3053 // We don't actually care about the ABI version other than whether
3054 // it's non-fragile.
3055 bool isNonFragile = objcABIVersion != 1;
3056
3057 // If we have no runtime argument, ask the toolchain for its default runtime.
3058 // However, the rewriter only really supports the Mac runtime, so assume that.
3059 ObjCRuntime runtime;
3060 if (!runtimeArg) {
3061 switch (rewriteKind) {
3062 case RK_None:
3063 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3064 break;
3065 case RK_Fragile:
3066 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3067 break;
3068 case RK_NonFragile:
3069 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3070 break;
3071 }
3072
3073 // -fnext-runtime
3074 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3075 // On Darwin, make this use the default behavior for the toolchain.
3076 if (getToolChain().getTriple().isOSDarwin()) {
3077 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3078
3079 // Otherwise, build for a generic macosx port.
3080 } else {
3081 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3082 }
3083
3084 // -fgnu-runtime
3085 } else {
3086 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003087 // Legacy behaviour is to target the gnustep runtime if we are i
3088 // non-fragile mode or the GCC runtime in fragile mode.
3089 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00003090 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00003091 else
3092 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003093 }
3094
3095 cmdArgs.push_back(args.MakeArgString(
3096 "-fobjc-runtime=" + runtime.getAsString()));
3097 return runtime;
3098}
3099
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003100void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003101 const InputInfo &Output,
3102 const InputInfoList &Inputs,
3103 const ArgList &Args,
3104 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003105 ArgStringList CmdArgs;
3106
3107 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3108 const InputInfo &Input = Inputs[0];
3109
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003110 // Don't warn about "clang -w -c foo.s"
3111 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003112 // and "clang -emit-llvm -c foo.s"
3113 Args.ClaimAllArgs(options::OPT_emit_llvm);
3114 // and "clang -use-gold-plugin -c foo.s"
3115 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003116
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003117 // Invoke ourselves in -cc1as mode.
3118 //
3119 // FIXME: Implement custom jobs for internal actions.
3120 CmdArgs.push_back("-cc1as");
3121
3122 // Add the "effective" target triple.
3123 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003124 std::string TripleStr =
3125 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003126 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3127
3128 // Set the output mode, we currently only expect to be used as a real
3129 // assembler.
3130 CmdArgs.push_back("-filetype");
3131 CmdArgs.push_back("obj");
3132
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003133 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003134 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003135
Jim Grosbach576452b2012-02-10 20:37:10 +00003136 // Add target specific cpu and features flags.
3137 switch(getToolChain().getTriple().getArch()) {
3138 default:
3139 break;
3140
3141 case llvm::Triple::arm:
3142 case llvm::Triple::thumb:
3143 AddARMTargetArgs(Args, CmdArgs);
3144 break;
3145 }
3146
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003147 // Ignore explicit -force_cpusubtype_ALL option.
3148 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003149
Eric Christopherfc3ee562012-01-10 00:38:01 +00003150 // Determine the original source input.
3151 const Action *SourceAction = &JA;
3152 while (SourceAction->getKind() != Action::InputClass) {
3153 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3154 SourceAction = SourceAction->getInputs()[0];
3155 }
3156
3157 // Forward -g, assuming we are dealing with an actual assembly file.
3158 if (SourceAction->getType() == types::TY_Asm ||
3159 SourceAction->getType() == types::TY_PP_Asm) {
3160 Args.ClaimAllArgs(options::OPT_g_Group);
3161 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3162 if (!A->getOption().matches(options::OPT_g0))
3163 CmdArgs.push_back("-g");
3164 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003165
3166 // Optionally embed the -cc1as level arguments into the debug info, for build
3167 // analysis.
3168 if (getToolChain().UseDwarfDebugFlags()) {
3169 ArgStringList OriginalArgs;
3170 for (ArgList::const_iterator it = Args.begin(),
3171 ie = Args.end(); it != ie; ++it)
3172 (*it)->render(Args, OriginalArgs);
3173
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003174 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003175 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3176 Flags += Exec;
3177 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3178 Flags += " ";
3179 Flags += OriginalArgs[i];
3180 }
3181 CmdArgs.push_back("-dwarf-debug-flags");
3182 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3183 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003184
3185 // FIXME: Add -static support, once we have it.
3186
3187 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3188 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003189 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003190
3191 assert(Output.isFilename() && "Unexpected lipo output.");
3192 CmdArgs.push_back("-o");
3193 CmdArgs.push_back(Output.getFilename());
3194
Daniel Dunbarb440f562010-08-02 02:38:21 +00003195 assert(Input.isFilename() && "Invalid input.");
3196 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003197
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003198 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003199 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003200}
3201
Daniel Dunbara3246a02009-03-18 08:07:30 +00003202void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003203 const InputInfo &Output,
3204 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003205 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003206 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003207 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003208 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003209
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003210 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003211 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003212 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003213 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003214 // Don't forward any -g arguments to assembly steps.
3215 if (isa<AssembleJobAction>(JA) &&
3216 A->getOption().matches(options::OPT_g_Group))
3217 continue;
3218
Daniel Dunbar2da02722009-03-19 07:55:12 +00003219 // It is unfortunate that we have to claim here, as this means
3220 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003221 // platforms using a generic gcc, even if we are just using gcc
3222 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003223 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003224 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003225 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003226 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003227
Daniel Dunbar4e295052010-01-25 22:35:08 +00003228 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003229
3230 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003231 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003232 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003233 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003234
3235 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003236 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003237 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003238 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003239 CmdArgs.push_back("ppc64");
3240 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003241 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003242 }
3243
Daniel Dunbar5716d872009-05-02 21:41:52 +00003244 // Try to force gcc to match the tool chain we want, if we recognize
3245 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003246 //
3247 // FIXME: The triple class should directly provide the information we want
3248 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003249 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003250 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003251 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003252 CmdArgs.push_back("-m64");
3253
Daniel Dunbarb440f562010-08-02 02:38:21 +00003254 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003255 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003256 CmdArgs.push_back(Output.getFilename());
3257 } else {
3258 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003259 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003260 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003261
Tony Linthicum76329bf2011-12-12 21:14:55 +00003262 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3263 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003264
3265 // Only pass -x if gcc will understand it; otherwise hope gcc
3266 // understands the suffix correctly. The main use case this would go
3267 // wrong in is for linker inputs if they happened to have an odd
3268 // suffix; really the only way to get this to happen is a command
3269 // like '-x foobar a.c' which will treat a.c like a linker input.
3270 //
3271 // FIXME: For the linker case specifically, can we safely convert
3272 // inputs into '-Wl,' options?
3273 for (InputInfoList::const_iterator
3274 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3275 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003276
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003277 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003278 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3279 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003280 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003281 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003282 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003283 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003284 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003285
Daniel Dunbara3246a02009-03-18 08:07:30 +00003286 if (types::canTypeBeUserSpecified(II.getType())) {
3287 CmdArgs.push_back("-x");
3288 CmdArgs.push_back(types::getTypeName(II.getType()));
3289 }
3290
Daniel Dunbarb440f562010-08-02 02:38:21 +00003291 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003292 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003293 else {
3294 const Arg &A = II.getInputArg();
3295
3296 // Reverse translate some rewritten options.
3297 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3298 CmdArgs.push_back("-lstdc++");
3299 continue;
3300 }
3301
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003302 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003303 A.render(Args, CmdArgs);
3304 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003305 }
3306
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003307 const std::string customGCCName = D.getCCCGenericGCCName();
3308 const char *GCCName;
3309 if (!customGCCName.empty())
3310 GCCName = customGCCName.c_str();
3311 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003312 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003313 } else
3314 GCCName = "gcc";
3315
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003316 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003317 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003318 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003319}
3320
Daniel Dunbar4e295052010-01-25 22:35:08 +00003321void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3322 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003323 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003324}
3325
Daniel Dunbar4e295052010-01-25 22:35:08 +00003326void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3327 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003328 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003329}
3330
Daniel Dunbar4e295052010-01-25 22:35:08 +00003331void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3332 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003333 const Driver &D = getToolChain().getDriver();
3334
Daniel Dunbar4e295052010-01-25 22:35:08 +00003335 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003336 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3337 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003338 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003339 else {
3340 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003341 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003342 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003343
Daniel Dunbar4e295052010-01-25 22:35:08 +00003344 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003345 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003346}
3347
Daniel Dunbar4e295052010-01-25 22:35:08 +00003348void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3349 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003350 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003351}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003352
Daniel Dunbar4e295052010-01-25 22:35:08 +00003353void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3354 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003355 // The types are (hopefully) good enough.
3356}
3357
Tony Linthicum76329bf2011-12-12 21:14:55 +00003358// Hexagon tools start.
3359void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3360 ArgStringList &CmdArgs) const {
3361
3362}
3363void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3364 const InputInfo &Output,
3365 const InputInfoList &Inputs,
3366 const ArgList &Args,
3367 const char *LinkingOutput) const {
3368
3369 const Driver &D = getToolChain().getDriver();
3370 ArgStringList CmdArgs;
3371
3372 std::string MarchString = "-march=";
3373 MarchString += getHexagonTargetCPU(Args);
3374 CmdArgs.push_back(Args.MakeArgString(MarchString));
3375
3376 RenderExtraToolArgs(JA, CmdArgs);
3377
3378 if (Output.isFilename()) {
3379 CmdArgs.push_back("-o");
3380 CmdArgs.push_back(Output.getFilename());
3381 } else {
3382 assert(Output.isNothing() && "Unexpected output");
3383 CmdArgs.push_back("-fsyntax-only");
3384 }
3385
3386
3387 // Only pass -x if gcc will understand it; otherwise hope gcc
3388 // understands the suffix correctly. The main use case this would go
3389 // wrong in is for linker inputs if they happened to have an odd
3390 // suffix; really the only way to get this to happen is a command
3391 // like '-x foobar a.c' which will treat a.c like a linker input.
3392 //
3393 // FIXME: For the linker case specifically, can we safely convert
3394 // inputs into '-Wl,' options?
3395 for (InputInfoList::const_iterator
3396 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3397 const InputInfo &II = *it;
3398
3399 // Don't try to pass LLVM or AST inputs to a generic gcc.
3400 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3401 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3402 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3403 << getToolChain().getTripleString();
3404 else if (II.getType() == types::TY_AST)
3405 D.Diag(clang::diag::err_drv_no_ast_support)
3406 << getToolChain().getTripleString();
3407
3408 if (II.isFilename())
3409 CmdArgs.push_back(II.getFilename());
3410 else
3411 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3412 II.getInputArg().render(Args, CmdArgs);
3413 }
3414
3415 const char *GCCName = "hexagon-as";
3416 const char *Exec =
3417 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3418 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3419
3420}
3421void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3422 ArgStringList &CmdArgs) const {
3423 // The types are (hopefully) good enough.
3424}
3425
3426void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3427 const InputInfo &Output,
3428 const InputInfoList &Inputs,
3429 const ArgList &Args,
3430 const char *LinkingOutput) const {
3431
3432 const Driver &D = getToolChain().getDriver();
3433 ArgStringList CmdArgs;
3434
3435 for (ArgList::const_iterator
3436 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3437 Arg *A = *it;
Michael J. Spencer66e2b202012-10-19 22:37:06 +00003438 if (forwardToGCC(A->getOption())) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00003439 // Don't forward any -g arguments to assembly steps.
3440 if (isa<AssembleJobAction>(JA) &&
3441 A->getOption().matches(options::OPT_g_Group))
3442 continue;
3443
3444 // It is unfortunate that we have to claim here, as this means
3445 // we will basically never report anything interesting for
3446 // platforms using a generic gcc, even if we are just using gcc
3447 // to get to the assembler.
3448 A->claim();
3449 A->render(Args, CmdArgs);
3450 }
3451 }
3452
3453 RenderExtraToolArgs(JA, CmdArgs);
3454
3455 // Add Arch Information
3456 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003457 if ((A = getLastHexagonArchArg(Args))) {
3458 if (A->getOption().matches(options::OPT_m_Joined))
3459 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003460 else
Sebastian Pop86500282012-01-13 20:37:10 +00003461 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003462 }
Sebastian Pop86500282012-01-13 20:37:10 +00003463 else {
3464 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3465 }
3466
Tony Linthicum76329bf2011-12-12 21:14:55 +00003467 CmdArgs.push_back("-mqdsp6-compat");
3468
3469 const char *GCCName;
3470 if (C.getDriver().CCCIsCXX)
3471 GCCName = "hexagon-g++";
3472 else
3473 GCCName = "hexagon-gcc";
3474 const char *Exec =
3475 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3476
3477 if (Output.isFilename()) {
3478 CmdArgs.push_back("-o");
3479 CmdArgs.push_back(Output.getFilename());
3480 }
3481
3482 for (InputInfoList::const_iterator
3483 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3484 const InputInfo &II = *it;
3485
3486 // Don't try to pass LLVM or AST inputs to a generic gcc.
3487 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3488 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3489 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3490 << getToolChain().getTripleString();
3491 else if (II.getType() == types::TY_AST)
3492 D.Diag(clang::diag::err_drv_no_ast_support)
3493 << getToolChain().getTripleString();
3494
3495 if (II.isFilename())
3496 CmdArgs.push_back(II.getFilename());
3497 else
3498 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3499 II.getInputArg().render(Args, CmdArgs);
3500 }
3501 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3502
3503}
3504// Hexagon tools end.
3505
3506
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003507const char *darwin::CC1::getCC1Name(types::ID Type) const {
3508 switch (Type) {
3509 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003510 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003511 case types::TY_Asm:
3512 case types::TY_C: case types::TY_CHeader:
3513 case types::TY_PP_C: case types::TY_PP_CHeader:
3514 return "cc1";
3515 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003516 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3517 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003518 return "cc1obj";
3519 case types::TY_CXX: case types::TY_CXXHeader:
3520 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3521 return "cc1plus";
3522 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003523 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3524 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003525 return "cc1objplus";
3526 }
3527}
3528
David Blaikie68e081d2011-12-20 02:48:34 +00003529void darwin::CC1::anchor() {}
3530
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003531const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003532 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003533 return Args.MakeArgString(
3534 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003535}
3536
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003537const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003538 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003539 const char *Str = getBaseInputName(Args, Inputs);
3540
Chris Lattner906bb902011-01-16 08:14:11 +00003541 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003542 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003543
3544 return Str;
3545}
3546
3547const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003548darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003549 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003550 // FIXME: Think about this more.
3551 std::string Res;
3552
3553 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3554 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003555 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003556 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003557 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003558 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003559 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003560}
3561
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003562void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003563 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003564 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003565
3566 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003567 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003568
Bob Wilson7ecbd322012-02-07 01:17:55 +00003569 // Erase both -fmodule-cache-path and its argument.
3570 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3571 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003572 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003573 continue;
3574 }
3575
Bob Wilson7ecbd322012-02-07 01:17:55 +00003576 // Remove unsupported -f options.
3577 if (Option.startswith("-f")) {
3578 // Remove -f/-fno- to reduce the number of cases.
3579 if (Option.startswith("-fno-"))
3580 Option = Option.substr(5);
3581 else
3582 Option = Option.substr(2);
3583 RemoveOption = llvm::StringSwitch<bool>(Option)
3584 .Case("altivec", true)
3585 .Case("modules", true)
3586 .Case("diagnostics-show-note-include-stack", true)
3587 .Default(false);
3588 }
3589
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003590 // Handle machine specific options.
3591 if (Option.startswith("-m")) {
3592 RemoveOption = llvm::StringSwitch<bool>(Option)
3593 .Case("-mthumb", true)
3594 .Case("-mno-thumb", true)
3595 .Case("-mno-fused-madd", true)
3596 .Case("-mlong-branch", true)
3597 .Case("-mlongcall", true)
3598 .Case("-mcpu=G4", true)
3599 .Case("-mcpu=G5", true)
3600 .Default(false);
3601 }
3602
3603 // Handle warning options.
3604 if (Option.startswith("-W")) {
3605 // Remove -W/-Wno- to reduce the number of cases.
3606 if (Option.startswith("-Wno-"))
3607 Option = Option.substr(5);
3608 else
3609 Option = Option.substr(2);
3610
3611 RemoveOption = llvm::StringSwitch<bool>(Option)
3612 .Case("address-of-temporary", true)
3613 .Case("ambiguous-member-template", true)
3614 .Case("analyzer-incompatible-plugin", true)
3615 .Case("array-bounds", true)
3616 .Case("array-bounds-pointer-arithmetic", true)
3617 .Case("bind-to-temporary-copy", true)
3618 .Case("bitwise-op-parentheses", true)
3619 .Case("bool-conversions", true)
3620 .Case("builtin-macro-redefined", true)
3621 .Case("c++-hex-floats", true)
3622 .Case("c++0x-compat", true)
3623 .Case("c++0x-extensions", true)
3624 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003625 .Case("c++11-compat", true)
3626 .Case("c++11-extensions", true)
3627 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003628 .Case("conditional-uninitialized", true)
3629 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003630 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003631 .Case("CFString-literal", true)
3632 .Case("constant-logical-operand", true)
3633 .Case("custom-atomic-properties", true)
3634 .Case("default-arg-special-member", true)
3635 .Case("delegating-ctor-cycles", true)
3636 .Case("delete-non-virtual-dtor", true)
3637 .Case("deprecated-implementations", true)
3638 .Case("deprecated-writable-strings", true)
3639 .Case("distributed-object-modifiers", true)
3640 .Case("duplicate-method-arg", true)
3641 .Case("dynamic-class-memaccess", true)
3642 .Case("enum-compare", true)
Ted Kremeneka88397d2012-10-09 19:29:48 +00003643 .Case("enum-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003644 .Case("exit-time-destructors", true)
3645 .Case("gnu", true)
3646 .Case("gnu-designator", true)
3647 .Case("header-hygiene", true)
3648 .Case("idiomatic-parentheses", true)
3649 .Case("ignored-qualifiers", true)
3650 .Case("implicit-atomic-properties", true)
3651 .Case("incompatible-pointer-types", true)
3652 .Case("incomplete-implementation", true)
Ted Kremenekb4762412012-10-09 19:29:46 +00003653 .Case("int-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003654 .Case("initializer-overrides", true)
3655 .Case("invalid-noreturn", true)
3656 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003657 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003658 .Case("literal-conversion", true)
3659 .Case("literal-range", true)
3660 .Case("local-type-template-args", true)
3661 .Case("logical-op-parentheses", true)
3662 .Case("method-signatures", true)
3663 .Case("microsoft", true)
3664 .Case("mismatched-tags", true)
3665 .Case("missing-method-return-type", true)
3666 .Case("non-pod-varargs", true)
3667 .Case("nonfragile-abi2", true)
3668 .Case("null-arithmetic", true)
3669 .Case("null-dereference", true)
3670 .Case("out-of-line-declaration", true)
3671 .Case("overriding-method-mismatch", true)
3672 .Case("readonly-setter-attrs", true)
3673 .Case("return-stack-address", true)
3674 .Case("self-assign", true)
3675 .Case("semicolon-before-method-body", true)
3676 .Case("sentinel", true)
3677 .Case("shift-overflow", true)
3678 .Case("shift-sign-overflow", true)
3679 .Case("sign-conversion", true)
3680 .Case("sizeof-array-argument", true)
3681 .Case("sizeof-pointer-memaccess", true)
3682 .Case("string-compare", true)
3683 .Case("super-class-method-mismatch", true)
3684 .Case("tautological-compare", true)
3685 .Case("typedef-redefinition", true)
3686 .Case("typename-missing", true)
3687 .Case("undefined-reinterpret-cast", true)
3688 .Case("unknown-warning-option", true)
3689 .Case("unnamed-type-template-args", true)
3690 .Case("unneeded-internal-declaration", true)
3691 .Case("unneeded-member-function", true)
3692 .Case("unused-comparison", true)
3693 .Case("unused-exception-parameter", true)
3694 .Case("unused-member-function", true)
3695 .Case("unused-result", true)
3696 .Case("vector-conversions", true)
3697 .Case("vla", true)
3698 .Case("used-but-marked-unused", true)
3699 .Case("weak-vtables", true)
3700 .Default(false);
3701 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003702 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003703 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003704 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003705 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003706 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003707 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003708 }
3709}
3710
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003711void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003712 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003713 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003714
3715 CheckCodeGenerationOptions(D, Args);
3716
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003717 // Derived from cc1 spec.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00003718 if ((!Args.hasArg(options::OPT_mkernel) ||
3719 (getDarwinToolChain().isTargetIPhoneOS() &&
3720 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3721 !Args.hasArg(options::OPT_static) &&
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003722 !Args.hasArg(options::OPT_mdynamic_no_pic))
3723 CmdArgs.push_back("-fPIC");
3724
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003725 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3726 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3727 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3728 CmdArgs.push_back("-fno-builtin-strcat");
3729 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3730 CmdArgs.push_back("-fno-builtin-strcpy");
3731 }
3732
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003733 if (Args.hasArg(options::OPT_g_Flag) &&
3734 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3735 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3736}
3737
3738void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3739 const InputInfoList &Inputs,
3740 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003741 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003742
3743 // Derived from cc1_options spec.
3744 if (Args.hasArg(options::OPT_fast) ||
3745 Args.hasArg(options::OPT_fastf) ||
3746 Args.hasArg(options::OPT_fastcp))
3747 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003748
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003749 if (Arg *A = Args.getLastArg(options::OPT_pg))
3750 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003751 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003752 << A->getAsString(Args) << "-fomit-frame-pointer";
3753
3754 AddCC1Args(Args, CmdArgs);
3755
3756 if (!Args.hasArg(options::OPT_Q))
3757 CmdArgs.push_back("-quiet");
3758
3759 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003760 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003761
3762 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3763
3764 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3765 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3766
3767 // FIXME: The goal is to use the user provided -o if that is our
3768 // final output, otherwise to drive from the original input
3769 // name. Find a clean way to go about this.
3770 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3771 Args.hasArg(options::OPT_o)) {
3772 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3773 CmdArgs.push_back("-auxbase-strip");
3774 CmdArgs.push_back(OutputOpt->getValue(Args));
3775 } else {
3776 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003777 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003778 }
3779
3780 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3781
3782 Args.AddAllArgs(CmdArgs, options::OPT_O);
3783 // FIXME: -Wall is getting some special treatment. Investigate.
3784 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3785 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003786 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003787 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003788 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3789 // Honor -std-default.
3790 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3791 "-std=", /*Joined=*/true);
3792 }
3793
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003794 if (Args.hasArg(options::OPT_v))
3795 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003796 if (Args.hasArg(options::OPT_pg) &&
3797 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003798 CmdArgs.push_back("-p");
3799 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003800
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003801 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003802 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3803 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3804 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3805 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3806 //
3807 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003808 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3809 options::OPT_fsyntax_only),
3810 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003811 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3812 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3813 (*it)->claim();
3814 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003815 }
3816 }
3817 } else
3818 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003819
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003820 // Claim Clang only -f options, they aren't worth warning about.
3821 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3822
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003823 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3824 if (Args.hasArg(options::OPT_Qn))
3825 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003826
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003827 // FIXME: This isn't correct.
3828 //Args.AddLastArg(CmdArgs, options::OPT__help)
3829 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3830
3831 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3832
3833 // FIXME: Still don't get what is happening here. Investigate.
3834 Args.AddAllArgs(CmdArgs, options::OPT__param);
3835
3836 if (Args.hasArg(options::OPT_fmudflap) ||
3837 Args.hasArg(options::OPT_fmudflapth)) {
3838 CmdArgs.push_back("-fno-builtin");
3839 CmdArgs.push_back("-fno-merge-constants");
3840 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003841
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003842 if (Args.hasArg(options::OPT_coverage)) {
3843 CmdArgs.push_back("-fprofile-arcs");
3844 CmdArgs.push_back("-ftest-coverage");
3845 }
3846
3847 if (types::isCXX(Inputs[0].getType()))
3848 CmdArgs.push_back("-D__private_extern__=extern");
3849}
3850
3851void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3852 const InputInfoList &Inputs,
3853 const ArgStringList &OutputArgs) const {
3854 // Derived from cpp_options
3855 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003856
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003857 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3858
3859 AddCC1Args(Args, CmdArgs);
3860
3861 // NOTE: The code below has some commonality with cpp_options, but
3862 // in classic gcc style ends up sending things in different
3863 // orders. This may be a good merge candidate once we drop pedantic
3864 // compatibility.
3865
3866 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003867 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003868 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003869 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3870 // Honor -std-default.
3871 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3872 "-std=", /*Joined=*/true);
3873 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003874 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3875 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003876
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003877 // The driver treats -fsyntax-only specially.
3878 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3879
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003880 // Claim Clang only -f options, they aren't worth warning about.
3881 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3882
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003883 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3884 !Args.hasArg(options::OPT_fno_working_directory))
3885 CmdArgs.push_back("-fworking-directory");
3886
3887 Args.AddAllArgs(CmdArgs, options::OPT_O);
3888 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3889 if (Args.hasArg(options::OPT_save_temps))
3890 CmdArgs.push_back("-fpch-preprocess");
3891}
3892
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003893void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003894 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003895 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003896 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003897
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003898 CheckPreprocessingOptions(D, Args);
3899
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003900 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003901 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3902 Args.AddLastArg(CmdArgs, options::OPT_C);
3903 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003904 if (!Args.hasArg(options::OPT_Q))
3905 CmdArgs.push_back("-quiet");
3906 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003907 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003908 Args.AddLastArg(CmdArgs, options::OPT_v);
3909 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3910 Args.AddLastArg(CmdArgs, options::OPT_P);
3911
3912 // FIXME: Handle %I properly.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003913 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003914 CmdArgs.push_back("-imultilib");
3915 CmdArgs.push_back("x86_64");
3916 }
3917
3918 if (Args.hasArg(options::OPT_MD)) {
3919 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003920 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003921 }
3922
3923 if (Args.hasArg(options::OPT_MMD)) {
3924 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003925 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003926 }
3927
3928 Args.AddLastArg(CmdArgs, options::OPT_M);
3929 Args.AddLastArg(CmdArgs, options::OPT_MM);
3930 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3931 Args.AddLastArg(CmdArgs, options::OPT_MG);
3932 Args.AddLastArg(CmdArgs, options::OPT_MP);
3933 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3934 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3935 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3936 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3937 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3938 CmdArgs.push_back("-MQ");
3939 CmdArgs.push_back(OutputOpt->getValue(Args));
3940 }
3941 }
3942
3943 Args.AddLastArg(CmdArgs, options::OPT_remap);
3944 if (Args.hasArg(options::OPT_g3))
3945 CmdArgs.push_back("-dD");
3946 Args.AddLastArg(CmdArgs, options::OPT_H);
3947
3948 AddCPPArgs(Args, CmdArgs);
3949
3950 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3951 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3952
3953 for (InputInfoList::const_iterator
3954 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3955 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003956
Daniel Dunbarb440f562010-08-02 02:38:21 +00003957 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003958 }
3959
3960 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3961 options::OPT_Xpreprocessor);
3962
3963 if (Args.hasArg(options::OPT_fmudflap)) {
3964 CmdArgs.push_back("-D_MUDFLAP");
3965 CmdArgs.push_back("-include");
3966 CmdArgs.push_back("mf-runtime.h");
3967 }
3968
3969 if (Args.hasArg(options::OPT_fmudflapth)) {
3970 CmdArgs.push_back("-D_MUDFLAP");
3971 CmdArgs.push_back("-D_MUDFLAPTH");
3972 CmdArgs.push_back("-include");
3973 CmdArgs.push_back("mf-runtime.h");
3974 }
3975}
3976
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003977void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003978 ArgStringList &CmdArgs) const {
3979 // Derived from cpp spec.
3980
3981 if (Args.hasArg(options::OPT_static)) {
3982 // The gcc spec is broken here, it refers to dynamic but
3983 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003984
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003985 // if (!Args.hasArg(arglist.parser.dynamicOption))
3986 CmdArgs.push_back("-D__STATIC__");
3987 } else
3988 CmdArgs.push_back("-D__DYNAMIC__");
3989
3990 if (Args.hasArg(options::OPT_pthread))
3991 CmdArgs.push_back("-D_REENTRANT");
3992}
3993
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003994void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003995 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003996 const InputInfoList &Inputs,
3997 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003998 const char *LinkingOutput) const {
3999 ArgStringList CmdArgs;
4000
4001 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4002
4003 CmdArgs.push_back("-E");
4004
4005 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004006 Args.hasArg(options::OPT_traditional_cpp))
4007 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004008
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004009 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004010 assert(Output.isFilename() && "Unexpected CC1 output.");
4011 OutputArgs.push_back("-o");
4012 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004013
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00004014 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00004015 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4016 } else {
4017 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4018 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4019 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004020
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00004021 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
4022
Chad Rosierc31e48d2011-09-08 00:38:00 +00004023 RemoveCC1UnsupportedArgs(CmdArgs);
4024
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004025 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004026 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004027 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004028 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004029}
4030
4031void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004032 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004033 const InputInfoList &Inputs,
4034 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004035 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004036 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004037 ArgStringList CmdArgs;
4038
4039 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4040
Bob Wilson0090df22012-04-01 23:03:29 +00004041 // Silence warning about unused --serialize-diagnostics
4042 Args.ClaimAllArgs(options::OPT__serialize_diags);
4043
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004044 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00004045 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004046 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004047 << A->getAsString(Args) << "-E";
4048
Daniel Dunbar24e52992010-06-07 23:28:45 +00004049 if (JA.getType() == types::TY_LLVM_IR ||
4050 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004051 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00004052 else if (JA.getType() == types::TY_LLVM_BC ||
4053 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004054 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004055 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004056 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004057 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004058 else if (JA.getType() != types::TY_PP_Asm &&
4059 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004060 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004061 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004062
4063 ArgStringList OutputArgs;
4064 if (Output.getType() != types::TY_PCH) {
4065 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004066 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004067 OutputArgs.push_back("/dev/null");
4068 else
4069 OutputArgs.push_back(Output.getFilename());
4070 }
4071
4072 // There is no need for this level of compatibility, but it makes
4073 // diffing easier.
4074 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4075 Args.hasArg(options::OPT_S));
4076
4077 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004078 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004079 if (OutputArgsEarly) {
4080 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4081 } else {
4082 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4083 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4084 }
4085 } else {
4086 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004087
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004088 for (InputInfoList::const_iterator
4089 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4090 const InputInfo &II = *it;
4091
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004092 // Reject AST inputs.
4093 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004094 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004095 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004096 return;
4097 }
4098
Daniel Dunbarb440f562010-08-02 02:38:21 +00004099 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004100 }
4101
4102 if (OutputArgsEarly) {
4103 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4104 } else {
4105 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4106 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4107 }
4108 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004109
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004110 if (Output.getType() == types::TY_PCH) {
4111 assert(Output.isFilename() && "Invalid PCH output.");
4112
4113 CmdArgs.push_back("-o");
4114 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4115 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004116 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004117 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004118 C.addTempFile(TmpPath);
4119 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004120
Eric Christopher84fbdb42011-08-19 00:30:14 +00004121 // If we're emitting a pch file with the last 4 characters of ".pth"
4122 // and falling back to llvm-gcc we want to use ".gch" instead.
4123 std::string OutputFile(Output.getFilename());
4124 size_t loc = OutputFile.rfind(".pth");
4125 if (loc != std::string::npos)
4126 OutputFile.replace(loc, 4, ".gch");
4127 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4128 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004129 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004130
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004131 RemoveCC1UnsupportedArgs(CmdArgs);
4132
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004133 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004134 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004135 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004136 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004137}
4138
Daniel Dunbarbe220842009-03-20 16:06:39 +00004139void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004140 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004141 const InputInfoList &Inputs,
4142 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004143 const char *LinkingOutput) const {
4144 ArgStringList CmdArgs;
4145
4146 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4147 const InputInfo &Input = Inputs[0];
4148
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004149 // Determine the original source input.
4150 const Action *SourceAction = &JA;
4151 while (SourceAction->getKind() != Action::InputClass) {
4152 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4153 SourceAction = SourceAction->getInputs()[0];
4154 }
4155
4156 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004157 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004158 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004159 if (Args.hasArg(options::OPT_gstabs))
4160 CmdArgs.push_back("--gstabs");
4161 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004162 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004163 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004164
Daniel Dunbarbe220842009-03-20 16:06:39 +00004165 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004166 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004167
Daniel Dunbar6d484762010-07-22 01:47:22 +00004168 // Use -force_cpusubtype_ALL on x86 by default.
4169 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4170 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004171 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4172 CmdArgs.push_back("-force_cpusubtype_ALL");
4173
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004174 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004175 (((Args.hasArg(options::OPT_mkernel) ||
4176 Args.hasArg(options::OPT_fapple_kext)) &&
4177 (!getDarwinToolChain().isTargetIPhoneOS() ||
4178 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4179 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004180 CmdArgs.push_back("-static");
4181
Daniel Dunbarbe220842009-03-20 16:06:39 +00004182 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4183 options::OPT_Xassembler);
4184
4185 assert(Output.isFilename() && "Unexpected lipo output.");
4186 CmdArgs.push_back("-o");
4187 CmdArgs.push_back(Output.getFilename());
4188
Daniel Dunbarb440f562010-08-02 02:38:21 +00004189 assert(Input.isFilename() && "Invalid input.");
4190 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004191
4192 // asm_final spec is empty.
4193
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004194 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004195 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004196 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004197}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004198
David Blaikie68e081d2011-12-20 02:48:34 +00004199void darwin::DarwinTool::anchor() {}
4200
Daniel Dunbare9ded432009-09-09 18:36:20 +00004201void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4202 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004203 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004204
Daniel Dunbarc1964212009-03-26 16:23:12 +00004205 // Derived from darwin_arch spec.
4206 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004207 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004208
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004209 // FIXME: Is this needed anymore?
4210 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004211 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004212}
4213
Bill Wendling3b2000f2012-10-02 18:02:50 +00004214bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4215 // We only need to generate a temp path for LTO if we aren't compiling object
4216 // files. When compiling source files, we run 'dsymutil' after linking. We
4217 // don't run 'dsymutil' when compiling object files.
4218 for (InputInfoList::const_iterator
4219 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4220 if (it->getType() != types::TY_Object)
4221 return true;
4222
4223 return false;
4224}
4225
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004226void darwin::Link::AddLinkArgs(Compilation &C,
4227 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004228 ArgStringList &CmdArgs,
4229 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004230 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004231 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004232
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004233 unsigned Version[3] = { 0, 0, 0 };
4234 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4235 bool HadExtra;
4236 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4237 Version[1], Version[2], HadExtra) ||
4238 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004239 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004240 << A->getAsString(Args);
4241 }
4242
4243 // Newer linkers support -demangle, pass it if supported and not disabled by
4244 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004245 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004246 // Don't pass -demangle to ld_classic.
4247 //
4248 // FIXME: This is a temporary workaround, ld should be handling this.
4249 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4250 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004251 if (getToolChain().getArch() == llvm::Triple::x86) {
4252 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4253 options::OPT_Wl_COMMA),
4254 ie = Args.filtered_end(); it != ie; ++it) {
4255 const Arg *A = *it;
4256 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004257 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004258 UsesLdClassic = true;
4259 }
4260 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004261 if (!UsesLdClassic)
4262 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004263 }
4264
Daniel Dunbaref889c72011-06-21 20:55:11 +00004265 // If we are using LTO, then automatically create a temporary file path for
4266 // the linker to use, so that it's lifetime will extend past a possible
4267 // dsymutil step.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004268 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004269 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004270 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004271 C.addTempFile(TmpPath);
4272 CmdArgs.push_back("-object_path_lto");
4273 CmdArgs.push_back(TmpPath);
4274 }
4275
Daniel Dunbarc1964212009-03-26 16:23:12 +00004276 // Derived from the "link" spec.
4277 Args.AddAllArgs(CmdArgs, options::OPT_static);
4278 if (!Args.hasArg(options::OPT_static))
4279 CmdArgs.push_back("-dynamic");
4280 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4281 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4282 // here. How do we wish to handle such things?
4283 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004284
Daniel Dunbarc1964212009-03-26 16:23:12 +00004285 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004286 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004287 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004288 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004289
4290 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4291 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4292 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4293
4294 Arg *A;
4295 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4296 (A = Args.getLastArg(options::OPT_current__version)) ||
4297 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004298 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004299 << A->getAsString(Args) << "-dynamiclib";
4300
4301 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4302 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4303 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4304 } else {
4305 CmdArgs.push_back("-dylib");
4306
4307 Arg *A;
4308 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4309 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4310 (A = Args.getLastArg(options::OPT_client__name)) ||
4311 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4312 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4313 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004314 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004315 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004316
Daniel Dunbarc1964212009-03-26 16:23:12 +00004317 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4318 "-dylib_compatibility_version");
4319 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4320 "-dylib_current_version");
4321
Daniel Dunbara48823f2010-01-22 02:04:52 +00004322 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004323
4324 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4325 "-dylib_install_name");
4326 }
4327
4328 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4329 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4330 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004331 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004332 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004333 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4334 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4335 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4336 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4337 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4338 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004339 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004340 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4341 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4342 Args.AddAllArgs(CmdArgs, options::OPT_init);
4343
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004344 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004345 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004346
4347 // If we had an explicit -mios-simulator-version-min argument, honor that,
4348 // otherwise use the traditional deployment targets. We can't just check the
4349 // is-sim attribute because existing code follows this path, and the linker
4350 // may not handle the argument.
4351 //
4352 // FIXME: We may be able to remove this, once we can verify no one depends on
4353 // it.
4354 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4355 CmdArgs.push_back("-ios_simulator_version_min");
4356 else if (DarwinTC.isTargetIPhoneOS())
4357 CmdArgs.push_back("-iphoneos_version_min");
4358 else
4359 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004360 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004361
Daniel Dunbarc1964212009-03-26 16:23:12 +00004362 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4363 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4364 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4365 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4366 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004367
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004368 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4369 options::OPT_fno_pie,
4370 options::OPT_fno_PIE)) {
4371 if (A->getOption().matches(options::OPT_fpie) ||
4372 A->getOption().matches(options::OPT_fPIE))
4373 CmdArgs.push_back("-pie");
4374 else
4375 CmdArgs.push_back("-no_pie");
4376 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004377
4378 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4379 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4380 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4381 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4382 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4383 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4384 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4385 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4386 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4387 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4388 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4389 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4390 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4391 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4392 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4393 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004394
Daniel Dunbar84384642011-05-02 21:03:47 +00004395 // Give --sysroot= preference, over the Apple specific behavior to also use
4396 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004397 StringRef sysroot = C.getSysRoot();
4398 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004399 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004400 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004401 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4402 CmdArgs.push_back("-syslibroot");
4403 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004404 }
4405
Daniel Dunbarc1964212009-03-26 16:23:12 +00004406 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4407 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4408 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4409 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4410 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004411 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004412 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4413 Args.AddAllArgs(CmdArgs, options::OPT_y);
4414 Args.AddLastArg(CmdArgs, options::OPT_w);
4415 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4416 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4417 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4418 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4419 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4420 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4421 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4422 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4423 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4424 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4425 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4426 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4427}
4428
4429void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004430 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004431 const InputInfoList &Inputs,
4432 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004433 const char *LinkingOutput) const {
4434 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004435
Daniel Dunbarc1964212009-03-26 16:23:12 +00004436 // The logic here is derived from gcc's behavior; most of which
4437 // comes from specs (starting with link_command). Consult gcc for
4438 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004439 ArgStringList CmdArgs;
4440
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004441 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4442 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4443 options::OPT_ccc_arcmt_migrate)) {
4444 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4445 (*I)->claim();
4446 const char *Exec =
4447 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4448 CmdArgs.push_back(Output.getFilename());
4449 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4450 return;
4451 }
4452
Daniel Dunbarc1964212009-03-26 16:23:12 +00004453 // I'm not sure why this particular decomposition exists in gcc, but
4454 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004455 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004456
Daniel Dunbarc1964212009-03-26 16:23:12 +00004457 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4458 Args.AddAllArgs(CmdArgs, options::OPT_s);
4459 Args.AddAllArgs(CmdArgs, options::OPT_t);
4460 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4461 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004462 Args.AddLastArg(CmdArgs, options::OPT_e);
4463 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4464 Args.AddAllArgs(CmdArgs, options::OPT_r);
4465
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004466 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4467 // members of static archive libraries which implement Objective-C classes or
4468 // categories.
4469 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4470 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004471
Daniel Dunbarc1964212009-03-26 16:23:12 +00004472 CmdArgs.push_back("-o");
4473 CmdArgs.push_back(Output.getFilename());
4474
Chad Rosier06fd3c62012-05-16 23:45:12 +00004475 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004476 !Args.hasArg(options::OPT_nostartfiles)) {
4477 // Derived from startfile spec.
4478 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004479 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004480 if (getDarwinToolChain().isTargetIOSSimulator()) {
4481 // The simulator doesn't have a versioned crt1 file.
4482 CmdArgs.push_back("-ldylib1.o");
4483 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004484 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4485 CmdArgs.push_back("-ldylib1.o");
4486 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004487 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004488 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004489 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004490 CmdArgs.push_back("-ldylib1.10.5.o");
4491 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004492 } else {
4493 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004494 if (!Args.hasArg(options::OPT_static)) {
4495 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004496 if (getDarwinToolChain().isTargetIOSSimulator()) {
4497 // The simulator doesn't have a versioned crt1 file.
4498 CmdArgs.push_back("-lbundle1.o");
4499 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004500 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4501 CmdArgs.push_back("-lbundle1.o");
4502 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004503 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004504 CmdArgs.push_back("-lbundle1.o");
4505 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004506 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004507 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004508 if (Args.hasArg(options::OPT_pg) &&
4509 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004510 if (Args.hasArg(options::OPT_static) ||
4511 Args.hasArg(options::OPT_object) ||
4512 Args.hasArg(options::OPT_preload)) {
4513 CmdArgs.push_back("-lgcrt0.o");
4514 } else {
4515 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004516
Daniel Dunbarc1964212009-03-26 16:23:12 +00004517 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004518 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004519 // By default on OS X 10.8 and later, we don't link with a crt1.o
4520 // file and the linker knows to use _main as the entry point. But,
4521 // when compiling with -pg, we need to link with the gcrt1.o file,
4522 // so pass the -no_new_main option to tell the linker to use the
4523 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004524 if (getDarwinToolChain().isTargetMacOS() &&
4525 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4526 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004527 } else {
4528 if (Args.hasArg(options::OPT_static) ||
4529 Args.hasArg(options::OPT_object) ||
4530 Args.hasArg(options::OPT_preload)) {
4531 CmdArgs.push_back("-lcrt0.o");
4532 } else {
4533 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004534 if (getDarwinToolChain().isTargetIOSSimulator()) {
4535 // The simulator doesn't have a versioned crt1 file.
4536 CmdArgs.push_back("-lcrt1.o");
4537 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004538 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4539 CmdArgs.push_back("-lcrt1.o");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00004540 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004541 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004542 } else {
4543 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4544 CmdArgs.push_back("-lcrt1.o");
4545 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4546 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004547 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004548 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004549
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004550 // darwin_crt2 spec is empty.
4551 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004552 }
4553 }
4554 }
4555 }
4556
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004557 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4558 Args.hasArg(options::OPT_shared_libgcc) &&
4559 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004560 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004561 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004562 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004563 }
4564 }
4565
4566 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004567
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004568 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4569 // symbols may appear. Mark all of them as dynamic_lookup.
4570 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4571 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4572 options::OPT_fno_address_sanitizer, false)) {
4573 if (Args.hasArg(options::OPT_dynamiclib) ||
4574 Args.hasArg(options::OPT_bundle)) {
4575 CmdArgs.push_back("-undefined");
4576 CmdArgs.push_back("dynamic_lookup");
4577 }
4578 }
4579
Daniel Dunbarc1964212009-03-26 16:23:12 +00004580 if (Args.hasArg(options::OPT_fopenmp))
4581 // This is more complicated in gcc...
4582 CmdArgs.push_back("-lgomp");
4583
Douglas Gregor9295df02012-05-15 21:00:27 +00004584 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4585
Bob Wilson16d93952012-05-15 18:57:39 +00004586 if (isObjCRuntimeLinked(Args) &&
4587 !Args.hasArg(options::OPT_nostdlib) &&
4588 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004589 // Avoid linking compatibility stubs on i386 mac.
4590 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004591 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004592 // If we don't have ARC or subscripting runtime support, link in the
4593 // runtime stubs. We have to do this *before* adding any of the normal
4594 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004595 ObjCRuntime runtime =
4596 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004597 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004598 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004599 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004600 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004601 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004602 CmdArgs.push_back("-framework");
4603 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004604 // Link libobj.
4605 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004606 }
John McCall31168b02011-06-15 23:02:42 +00004607
Daniel Dunbarc1964212009-03-26 16:23:12 +00004608 if (LinkingOutput) {
4609 CmdArgs.push_back("-arch_multiple");
4610 CmdArgs.push_back("-final_output");
4611 CmdArgs.push_back(LinkingOutput);
4612 }
4613
Daniel Dunbarc1964212009-03-26 16:23:12 +00004614 if (Args.hasArg(options::OPT_fnested_functions))
4615 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004616
Daniel Dunbarc1964212009-03-26 16:23:12 +00004617 if (!Args.hasArg(options::OPT_nostdlib) &&
4618 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004619 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004620 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004621
Daniel Dunbarc1964212009-03-26 16:23:12 +00004622 // link_ssp spec is empty.
4623
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004624 // Let the tool chain choose which runtime library to link.
4625 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004626 }
4627
Chad Rosier06fd3c62012-05-16 23:45:12 +00004628 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004629 !Args.hasArg(options::OPT_nostartfiles)) {
4630 // endfile_spec is empty.
4631 }
4632
4633 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4634 Args.AddAllArgs(CmdArgs, options::OPT_F);
4635
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004636 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004637 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004638 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004639}
4640
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004641void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004642 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004643 const InputInfoList &Inputs,
4644 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004645 const char *LinkingOutput) const {
4646 ArgStringList CmdArgs;
4647
4648 CmdArgs.push_back("-create");
4649 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004650
4651 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004652 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004653
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004654 for (InputInfoList::const_iterator
4655 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4656 const InputInfo &II = *it;
4657 assert(II.isFilename() && "Unexpected lipo input.");
4658 CmdArgs.push_back(II.getFilename());
4659 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004660 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004661 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004662 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004663}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004664
Daniel Dunbar88299622010-06-04 18:28:36 +00004665void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004666 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004667 const InputInfoList &Inputs,
4668 const ArgList &Args,
4669 const char *LinkingOutput) const {
4670 ArgStringList CmdArgs;
4671
Daniel Dunbareb86b042011-05-09 17:23:16 +00004672 CmdArgs.push_back("-o");
4673 CmdArgs.push_back(Output.getFilename());
4674
Daniel Dunbar88299622010-06-04 18:28:36 +00004675 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4676 const InputInfo &Input = Inputs[0];
4677 assert(Input.isFilename() && "Unexpected dsymutil input.");
4678 CmdArgs.push_back(Input.getFilename());
4679
Daniel Dunbar88299622010-06-04 18:28:36 +00004680 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004681 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004682 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004683}
4684
Eric Christopher551ef452011-08-23 17:56:55 +00004685void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4686 const InputInfo &Output,
4687 const InputInfoList &Inputs,
4688 const ArgList &Args,
4689 const char *LinkingOutput) const {
4690 ArgStringList CmdArgs;
4691 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004692 CmdArgs.push_back("--debug-info");
4693 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004694 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004695
4696 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4697 const InputInfo &Input = Inputs[0];
4698 assert(Input.isFilename() && "Unexpected verify input");
4699
4700 // Grabbing the output of the earlier dsymutil run.
4701 CmdArgs.push_back(Input.getFilename());
4702
4703 const char *Exec =
4704 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4705 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4706}
4707
David Chisnallf571cde2012-02-15 13:39:01 +00004708void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4709 const InputInfo &Output,
4710 const InputInfoList &Inputs,
4711 const ArgList &Args,
4712 const char *LinkingOutput) const {
4713 ArgStringList CmdArgs;
4714
4715 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4716 options::OPT_Xassembler);
4717
4718 CmdArgs.push_back("-o");
4719 CmdArgs.push_back(Output.getFilename());
4720
4721 for (InputInfoList::const_iterator
4722 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4723 const InputInfo &II = *it;
4724 CmdArgs.push_back(II.getFilename());
4725 }
4726
4727 const char *Exec =
4728 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4729 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4730}
4731
4732
4733void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4734 const InputInfo &Output,
4735 const InputInfoList &Inputs,
4736 const ArgList &Args,
4737 const char *LinkingOutput) const {
4738 // FIXME: Find a real GCC, don't hard-code versions here
4739 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4740 const llvm::Triple &T = getToolChain().getTriple();
4741 std::string LibPath = "/usr/lib/";
4742 llvm::Triple::ArchType Arch = T.getArch();
4743 switch (Arch) {
4744 case llvm::Triple::x86:
4745 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4746 T.getOSName()).str() + "/4.5.2/";
4747 break;
4748 case llvm::Triple::x86_64:
4749 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4750 T.getOSName()).str();
4751 GCCLibPath += "/4.5.2/amd64/";
4752 LibPath += "amd64/";
4753 break;
4754 default:
4755 assert(0 && "Unsupported architecture");
4756 }
4757
4758 ArgStringList CmdArgs;
4759
David Chisnall272a0712012-02-29 15:06:12 +00004760 // Demangle C++ names in errors
4761 CmdArgs.push_back("-C");
4762
David Chisnallf571cde2012-02-15 13:39:01 +00004763 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4764 (!Args.hasArg(options::OPT_shared))) {
4765 CmdArgs.push_back("-e");
4766 CmdArgs.push_back("_start");
4767 }
4768
4769 if (Args.hasArg(options::OPT_static)) {
4770 CmdArgs.push_back("-Bstatic");
4771 CmdArgs.push_back("-dn");
4772 } else {
4773 CmdArgs.push_back("-Bdynamic");
4774 if (Args.hasArg(options::OPT_shared)) {
4775 CmdArgs.push_back("-shared");
4776 } else {
4777 CmdArgs.push_back("--dynamic-linker");
4778 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4779 }
4780 }
4781
4782 if (Output.isFilename()) {
4783 CmdArgs.push_back("-o");
4784 CmdArgs.push_back(Output.getFilename());
4785 } else {
4786 assert(Output.isNothing() && "Invalid output.");
4787 }
4788
4789 if (!Args.hasArg(options::OPT_nostdlib) &&
4790 !Args.hasArg(options::OPT_nostartfiles)) {
4791 if (!Args.hasArg(options::OPT_shared)) {
4792 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4793 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004794 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004795 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4796 } else {
4797 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004798 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4799 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004800 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004801 if (getToolChain().getDriver().CCCIsCXX)
4802 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004803 }
4804
4805 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4806
4807 Args.AddAllArgs(CmdArgs, options::OPT_L);
4808 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4809 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004810 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004811
4812 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4813
4814 if (!Args.hasArg(options::OPT_nostdlib) &&
4815 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004816 if (getToolChain().getDriver().CCCIsCXX)
4817 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004818 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004819 if (!Args.hasArg(options::OPT_shared)) {
4820 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004821 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004822 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004823 }
David Chisnallf571cde2012-02-15 13:39:01 +00004824 }
4825
4826 if (!Args.hasArg(options::OPT_nostdlib) &&
4827 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004828 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004829 }
David Chisnall96de9932012-02-16 16:00:47 +00004830 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004831
4832 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4833
4834 const char *Exec =
4835 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4836 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4837}
4838
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004839void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004840 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004841 const InputInfoList &Inputs,
4842 const ArgList &Args,
4843 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004844 ArgStringList CmdArgs;
4845
4846 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4847 options::OPT_Xassembler);
4848
4849 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004850 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004851
4852 for (InputInfoList::const_iterator
4853 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4854 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004855 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004856 }
4857
4858 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004859 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004860 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004861}
4862
4863void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004864 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004865 const InputInfoList &Inputs,
4866 const ArgList &Args,
4867 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004868 ArgStringList CmdArgs;
4869
4870 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004871 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004872 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004873 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004874 }
4875
4876 if (Args.hasArg(options::OPT_static)) {
4877 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004878 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004879 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004880// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004881 CmdArgs.push_back("-Bdynamic");
4882 if (Args.hasArg(options::OPT_shared)) {
4883 CmdArgs.push_back("-shared");
4884 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004885 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004886 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4887 }
4888 }
4889
Daniel Dunbarb440f562010-08-02 02:38:21 +00004890 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004891 CmdArgs.push_back("-o");
4892 CmdArgs.push_back(Output.getFilename());
4893 } else {
4894 assert(Output.isNothing() && "Invalid output.");
4895 }
4896
4897 if (!Args.hasArg(options::OPT_nostdlib) &&
4898 !Args.hasArg(options::OPT_nostartfiles)) {
4899 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004900 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004901 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004902 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004903 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004904 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004905 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004906 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004907 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004908 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004909 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004910 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004911 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004912 }
4913
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004914 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4915 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004916 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004917
4918 Args.AddAllArgs(CmdArgs, options::OPT_L);
4919 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4920 Args.AddAllArgs(CmdArgs, options::OPT_e);
4921
Daniel Dunbar54423b22010-09-17 00:24:54 +00004922 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004923
4924 if (!Args.hasArg(options::OPT_nostdlib) &&
4925 !Args.hasArg(options::OPT_nodefaultlibs)) {
4926 // FIXME: For some reason GCC passes -lgcc before adding
4927 // the default system libraries. Just mimic this for now.
4928 CmdArgs.push_back("-lgcc");
4929
4930 if (Args.hasArg(options::OPT_pthread))
4931 CmdArgs.push_back("-pthread");
4932 if (!Args.hasArg(options::OPT_shared))
4933 CmdArgs.push_back("-lc");
4934 CmdArgs.push_back("-lgcc");
4935 }
4936
4937 if (!Args.hasArg(options::OPT_nostdlib) &&
4938 !Args.hasArg(options::OPT_nostartfiles)) {
4939 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004940 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004941 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004942 }
4943
Bill Wendling08760582011-06-27 19:15:03 +00004944 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004945
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004946 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004947 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004948 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004949}
4950
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004951void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004952 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004953 const InputInfoList &Inputs,
4954 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004955 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004956 ArgStringList CmdArgs;
4957
4958 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4959 options::OPT_Xassembler);
4960
4961 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004962 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004963
4964 for (InputInfoList::const_iterator
4965 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4966 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004967 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004968 }
4969
4970 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004971 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004972 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004973}
4974
4975void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004976 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004977 const InputInfoList &Inputs,
4978 const ArgList &Args,
4979 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004980 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004981 ArgStringList CmdArgs;
4982
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004983 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004984 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004985 CmdArgs.push_back("-e");
4986 CmdArgs.push_back("__start");
4987 }
4988
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004989 if (Args.hasArg(options::OPT_static)) {
4990 CmdArgs.push_back("-Bstatic");
4991 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004992 if (Args.hasArg(options::OPT_rdynamic))
4993 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004994 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004995 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004996 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004997 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004998 } else {
4999 CmdArgs.push_back("-dynamic-linker");
5000 CmdArgs.push_back("/usr/libexec/ld.so");
5001 }
5002 }
5003
Daniel Dunbarb440f562010-08-02 02:38:21 +00005004 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +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)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00005014 if (Args.hasArg(options::OPT_pg))
5015 CmdArgs.push_back(Args.MakeArgString(
5016 getToolChain().GetFilePath("gcrt0.o")));
5017 else
5018 CmdArgs.push_back(Args.MakeArgString(
5019 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005020 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005021 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005022 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005023 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005024 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005025 }
5026 }
5027
Edward O'Callaghan5c521462009-10-28 15:13:08 +00005028 std::string Triple = getToolChain().getTripleString();
5029 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005030 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005031 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005032 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005033
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005034 Args.AddAllArgs(CmdArgs, options::OPT_L);
5035 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5036 Args.AddAllArgs(CmdArgs, options::OPT_e);
5037
Daniel Dunbar54423b22010-09-17 00:24:54 +00005038 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005039
5040 if (!Args.hasArg(options::OPT_nostdlib) &&
5041 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005042 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005043 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005044 if (Args.hasArg(options::OPT_pg))
5045 CmdArgs.push_back("-lm_p");
5046 else
5047 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005048 }
5049
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005050 // FIXME: For some reason GCC passes -lgcc before adding
5051 // the default system libraries. Just mimic this for now.
5052 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005053
Eric Christopher17674ec2012-09-13 06:32:34 +00005054 if (Args.hasArg(options::OPT_pthread)) {
5055 if (!Args.hasArg(options::OPT_shared) &&
5056 Args.hasArg(options::OPT_pg))
5057 CmdArgs.push_back("-lpthread_p");
5058 else
5059 CmdArgs.push_back("-lpthread");
5060 }
5061
Chandler Carruth45661652011-12-17 22:32:42 +00005062 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005063 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005064 CmdArgs.push_back("-lc_p");
5065 else
5066 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005067 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005068
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005069 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005070 }
5071
5072 if (!Args.hasArg(options::OPT_nostdlib) &&
5073 !Args.hasArg(options::OPT_nostartfiles)) {
5074 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005075 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005076 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005077 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005078 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005079 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005080 }
5081
5082 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005083 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005084 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005085}
Ed Schoutene33194b2009-04-02 19:13:12 +00005086
Eli Friedman9fa28852012-08-08 23:57:20 +00005087void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5088 const InputInfo &Output,
5089 const InputInfoList &Inputs,
5090 const ArgList &Args,
5091 const char *LinkingOutput) const {
5092 ArgStringList CmdArgs;
5093
5094 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5095 options::OPT_Xassembler);
5096
5097 CmdArgs.push_back("-o");
5098 CmdArgs.push_back(Output.getFilename());
5099
5100 for (InputInfoList::const_iterator
5101 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5102 const InputInfo &II = *it;
5103 CmdArgs.push_back(II.getFilename());
5104 }
5105
5106 const char *Exec =
5107 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5108 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5109}
5110
5111void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5112 const InputInfo &Output,
5113 const InputInfoList &Inputs,
5114 const ArgList &Args,
5115 const char *LinkingOutput) const {
5116 const Driver &D = getToolChain().getDriver();
5117 ArgStringList CmdArgs;
5118
5119 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5120 (!Args.hasArg(options::OPT_shared))) {
5121 CmdArgs.push_back("-e");
5122 CmdArgs.push_back("__start");
5123 }
5124
5125 if (Args.hasArg(options::OPT_static)) {
5126 CmdArgs.push_back("-Bstatic");
5127 } else {
5128 if (Args.hasArg(options::OPT_rdynamic))
5129 CmdArgs.push_back("-export-dynamic");
5130 CmdArgs.push_back("--eh-frame-hdr");
5131 CmdArgs.push_back("-Bdynamic");
5132 if (Args.hasArg(options::OPT_shared)) {
5133 CmdArgs.push_back("-shared");
5134 } else {
5135 CmdArgs.push_back("-dynamic-linker");
5136 CmdArgs.push_back("/usr/libexec/ld.so");
5137 }
5138 }
5139
5140 if (Output.isFilename()) {
5141 CmdArgs.push_back("-o");
5142 CmdArgs.push_back(Output.getFilename());
5143 } else {
5144 assert(Output.isNothing() && "Invalid output.");
5145 }
5146
5147 if (!Args.hasArg(options::OPT_nostdlib) &&
5148 !Args.hasArg(options::OPT_nostartfiles)) {
5149 if (!Args.hasArg(options::OPT_shared)) {
5150 if (Args.hasArg(options::OPT_pg))
5151 CmdArgs.push_back(Args.MakeArgString(
5152 getToolChain().GetFilePath("gcrt0.o")));
5153 else
5154 CmdArgs.push_back(Args.MakeArgString(
5155 getToolChain().GetFilePath("crt0.o")));
5156 CmdArgs.push_back(Args.MakeArgString(
5157 getToolChain().GetFilePath("crtbegin.o")));
5158 } else {
5159 CmdArgs.push_back(Args.MakeArgString(
5160 getToolChain().GetFilePath("crtbeginS.o")));
5161 }
5162 }
5163
5164 Args.AddAllArgs(CmdArgs, options::OPT_L);
5165 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5166 Args.AddAllArgs(CmdArgs, options::OPT_e);
5167
5168 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5169
5170 if (!Args.hasArg(options::OPT_nostdlib) &&
5171 !Args.hasArg(options::OPT_nodefaultlibs)) {
5172 if (D.CCCIsCXX) {
5173 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5174 if (Args.hasArg(options::OPT_pg))
5175 CmdArgs.push_back("-lm_p");
5176 else
5177 CmdArgs.push_back("-lm");
5178 }
5179
5180 if (Args.hasArg(options::OPT_pthread))
5181 CmdArgs.push_back("-lpthread");
5182 if (!Args.hasArg(options::OPT_shared)) {
5183 if (Args.hasArg(options::OPT_pg))
5184 CmdArgs.push_back("-lc_p");
5185 else
5186 CmdArgs.push_back("-lc");
5187 }
5188
5189 std::string myarch = "-lclang_rt.";
5190 const llvm::Triple &T = getToolChain().getTriple();
5191 llvm::Triple::ArchType Arch = T.getArch();
5192 switch (Arch) {
5193 case llvm::Triple::arm:
5194 myarch += ("arm");
5195 break;
5196 case llvm::Triple::x86:
5197 myarch += ("i386");
5198 break;
5199 case llvm::Triple::x86_64:
5200 myarch += ("amd64");
5201 break;
5202 default:
5203 assert(0 && "Unsupported architecture");
5204 }
5205 CmdArgs.push_back(Args.MakeArgString(myarch));
5206 }
5207
5208 if (!Args.hasArg(options::OPT_nostdlib) &&
5209 !Args.hasArg(options::OPT_nostartfiles)) {
5210 if (!Args.hasArg(options::OPT_shared))
5211 CmdArgs.push_back(Args.MakeArgString(
5212 getToolChain().GetFilePath("crtend.o")));
5213 else
5214 CmdArgs.push_back(Args.MakeArgString(
5215 getToolChain().GetFilePath("crtendS.o")));
5216 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005217
5218 const char *Exec =
5219 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5220 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005221}
5222
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005223void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005224 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005225 const InputInfoList &Inputs,
5226 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005227 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005228 ArgStringList CmdArgs;
5229
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005230 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5231 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005232 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005233 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005234 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005235 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005236 else if (getToolChain().getArch() == llvm::Triple::mips ||
5237 getToolChain().getArch() == llvm::Triple::mipsel ||
5238 getToolChain().getArch() == llvm::Triple::mips64 ||
5239 getToolChain().getArch() == llvm::Triple::mips64el) {
5240 StringRef CPUName;
5241 StringRef ABIName;
5242 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005243
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005244 CmdArgs.push_back("-march");
5245 CmdArgs.push_back(CPUName.data());
5246
5247 // Convert ABI name to the GNU tools acceptable variant.
5248 if (ABIName == "o32")
5249 ABIName = "32";
5250 else if (ABIName == "n64")
5251 ABIName = "64";
5252
5253 CmdArgs.push_back("-mabi");
5254 CmdArgs.push_back(ABIName.data());
5255
5256 if (getToolChain().getArch() == llvm::Triple::mips ||
5257 getToolChain().getArch() == llvm::Triple::mips64)
5258 CmdArgs.push_back("-EB");
5259 else
5260 CmdArgs.push_back("-EL");
5261
5262 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5263 options::OPT_fpic, options::OPT_fno_pic,
5264 options::OPT_fPIE, options::OPT_fno_PIE,
5265 options::OPT_fpie, options::OPT_fno_pie);
5266 if (LastPICArg &&
5267 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5268 LastPICArg->getOption().matches(options::OPT_fpic) ||
5269 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5270 LastPICArg->getOption().matches(options::OPT_fpie))) {
5271 CmdArgs.push_back("-KPIC");
5272 }
5273 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005274
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005275 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5276 options::OPT_Xassembler);
5277
5278 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005279 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005280
5281 for (InputInfoList::const_iterator
5282 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5283 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005284 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005285 }
5286
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005287 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005288 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005289 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005290}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005291
5292void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005293 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005294 const InputInfoList &Inputs,
5295 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005296 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005297 const toolchains::FreeBSD& ToolChain =
5298 static_cast<const toolchains::FreeBSD&>(getToolChain());
5299 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005300 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005301
5302 // Silence warning for "clang -g foo.o -o foo"
5303 Args.ClaimAllArgs(options::OPT_g_Group);
5304 // and "clang -emit-llvm foo.o -o foo"
5305 Args.ClaimAllArgs(options::OPT_emit_llvm);
5306 // and for "clang -w foo.o -o foo". Other warning options are already
5307 // handled somewhere else.
5308 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005309
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005310 if (!D.SysRoot.empty())
5311 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5312
Roman Divackyafe2f232012-08-28 15:09:03 +00005313 if (Args.hasArg(options::OPT_pie))
5314 CmdArgs.push_back("-pie");
5315
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005316 if (Args.hasArg(options::OPT_static)) {
5317 CmdArgs.push_back("-Bstatic");
5318 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005319 if (Args.hasArg(options::OPT_rdynamic))
5320 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005321 CmdArgs.push_back("--eh-frame-hdr");
5322 if (Args.hasArg(options::OPT_shared)) {
5323 CmdArgs.push_back("-Bshareable");
5324 } else {
5325 CmdArgs.push_back("-dynamic-linker");
5326 CmdArgs.push_back("/libexec/ld-elf.so.1");
5327 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005328 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5329 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005330 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5331 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5332 CmdArgs.push_back("--hash-style=both");
5333 }
5334 }
5335 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005336 }
5337
5338 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5339 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005340 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005341 CmdArgs.push_back("-m");
5342 CmdArgs.push_back("elf_i386_fbsd");
5343 }
5344
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005345 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005346 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005347 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005348 }
5349
Daniel Dunbarb440f562010-08-02 02:38:21 +00005350 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005351 CmdArgs.push_back("-o");
5352 CmdArgs.push_back(Output.getFilename());
5353 } else {
5354 assert(Output.isNothing() && "Invalid output.");
5355 }
5356
5357 if (!Args.hasArg(options::OPT_nostdlib) &&
5358 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005359 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005360 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005361 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005362 crt1 = "gcrt1.o";
5363 else if (Args.hasArg(options::OPT_pie))
5364 crt1 = "Scrt1.o";
5365 else
5366 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005367 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005368 if (crt1)
5369 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5370
5371 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5372
5373 const char *crtbegin = NULL;
5374 if (Args.hasArg(options::OPT_static))
5375 crtbegin = "crtbeginT.o";
5376 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5377 crtbegin = "crtbeginS.o";
5378 else
5379 crtbegin = "crtbegin.o";
5380
5381 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005382 }
5383
5384 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005385 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005386 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5387 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005388 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005389 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5390 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005391 Args.AddAllArgs(CmdArgs, options::OPT_s);
5392 Args.AddAllArgs(CmdArgs, options::OPT_t);
5393 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5394 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005395
Roman Divackyafe2f232012-08-28 15:09:03 +00005396 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005397
5398 if (!Args.hasArg(options::OPT_nostdlib) &&
5399 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005400 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005401 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005402 if (Args.hasArg(options::OPT_pg))
5403 CmdArgs.push_back("-lm_p");
5404 else
5405 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005406 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005407 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5408 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005409 if (Args.hasArg(options::OPT_pg))
5410 CmdArgs.push_back("-lgcc_p");
5411 else
5412 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005413 if (Args.hasArg(options::OPT_static)) {
5414 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005415 } else if (Args.hasArg(options::OPT_pg)) {
5416 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005417 } else {
5418 CmdArgs.push_back("--as-needed");
5419 CmdArgs.push_back("-lgcc_s");
5420 CmdArgs.push_back("--no-as-needed");
5421 }
5422
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005423 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005424 if (Args.hasArg(options::OPT_pg))
5425 CmdArgs.push_back("-lpthread_p");
5426 else
5427 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005428 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005429
Roman Divacky66f22762011-02-10 16:59:40 +00005430 if (Args.hasArg(options::OPT_pg)) {
5431 if (Args.hasArg(options::OPT_shared))
5432 CmdArgs.push_back("-lc");
5433 else
5434 CmdArgs.push_back("-lc_p");
5435 CmdArgs.push_back("-lgcc_p");
5436 } else {
5437 CmdArgs.push_back("-lc");
5438 CmdArgs.push_back("-lgcc");
5439 }
5440
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005441 if (Args.hasArg(options::OPT_static)) {
5442 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005443 } else if (Args.hasArg(options::OPT_pg)) {
5444 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005445 } else {
5446 CmdArgs.push_back("--as-needed");
5447 CmdArgs.push_back("-lgcc_s");
5448 CmdArgs.push_back("--no-as-needed");
5449 }
5450 }
5451
5452 if (!Args.hasArg(options::OPT_nostdlib) &&
5453 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005454 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005455 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005456 else
5457 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005458 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005459 }
5460
Roman Divackyafe2f232012-08-28 15:09:03 +00005461 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005462
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005463 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005464 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005465 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005466}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005467
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005468void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5469 const InputInfo &Output,
5470 const InputInfoList &Inputs,
5471 const ArgList &Args,
5472 const char *LinkingOutput) const {
5473 ArgStringList CmdArgs;
5474
5475 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5476 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005477 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005478 CmdArgs.push_back("--32");
5479
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005480 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005481 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005482 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005483 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005484 CmdArgs.push_back("-EL");
5485
5486 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5487 options::OPT_Xassembler);
5488
5489 CmdArgs.push_back("-o");
5490 CmdArgs.push_back(Output.getFilename());
5491
5492 for (InputInfoList::const_iterator
5493 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5494 const InputInfo &II = *it;
5495 CmdArgs.push_back(II.getFilename());
5496 }
5497
David Chisnallddbd68f2011-09-27 22:03:18 +00005498 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005499 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5500}
5501
5502void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5503 const InputInfo &Output,
5504 const InputInfoList &Inputs,
5505 const ArgList &Args,
5506 const char *LinkingOutput) const {
5507 const Driver &D = getToolChain().getDriver();
5508 ArgStringList CmdArgs;
5509
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005510 if (!D.SysRoot.empty())
5511 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5512
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005513 if (Args.hasArg(options::OPT_static)) {
5514 CmdArgs.push_back("-Bstatic");
5515 } else {
5516 if (Args.hasArg(options::OPT_rdynamic))
5517 CmdArgs.push_back("-export-dynamic");
5518 CmdArgs.push_back("--eh-frame-hdr");
5519 if (Args.hasArg(options::OPT_shared)) {
5520 CmdArgs.push_back("-Bshareable");
5521 } else {
5522 CmdArgs.push_back("-dynamic-linker");
5523 CmdArgs.push_back("/libexec/ld.elf_so");
5524 }
5525 }
5526
5527 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5528 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005529 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005530 CmdArgs.push_back("-m");
5531 CmdArgs.push_back("elf_i386");
5532 }
5533
5534 if (Output.isFilename()) {
5535 CmdArgs.push_back("-o");
5536 CmdArgs.push_back(Output.getFilename());
5537 } else {
5538 assert(Output.isNothing() && "Invalid output.");
5539 }
5540
5541 if (!Args.hasArg(options::OPT_nostdlib) &&
5542 !Args.hasArg(options::OPT_nostartfiles)) {
5543 if (!Args.hasArg(options::OPT_shared)) {
5544 CmdArgs.push_back(Args.MakeArgString(
5545 getToolChain().GetFilePath("crt0.o")));
5546 CmdArgs.push_back(Args.MakeArgString(
5547 getToolChain().GetFilePath("crti.o")));
5548 CmdArgs.push_back(Args.MakeArgString(
5549 getToolChain().GetFilePath("crtbegin.o")));
5550 } else {
5551 CmdArgs.push_back(Args.MakeArgString(
5552 getToolChain().GetFilePath("crti.o")));
5553 CmdArgs.push_back(Args.MakeArgString(
5554 getToolChain().GetFilePath("crtbeginS.o")));
5555 }
5556 }
5557
5558 Args.AddAllArgs(CmdArgs, options::OPT_L);
5559 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5560 Args.AddAllArgs(CmdArgs, options::OPT_e);
5561 Args.AddAllArgs(CmdArgs, options::OPT_s);
5562 Args.AddAllArgs(CmdArgs, options::OPT_t);
5563 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5564 Args.AddAllArgs(CmdArgs, options::OPT_r);
5565
5566 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5567
5568 if (!Args.hasArg(options::OPT_nostdlib) &&
5569 !Args.hasArg(options::OPT_nodefaultlibs)) {
5570 if (D.CCCIsCXX) {
5571 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5572 CmdArgs.push_back("-lm");
5573 }
5574 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5575 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005576 if (Args.hasArg(options::OPT_static)) {
5577 CmdArgs.push_back("-lgcc_eh");
5578 } else {
5579 CmdArgs.push_back("--as-needed");
5580 CmdArgs.push_back("-lgcc_s");
5581 CmdArgs.push_back("--no-as-needed");
5582 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005583 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005584
5585 if (Args.hasArg(options::OPT_pthread))
5586 CmdArgs.push_back("-lpthread");
5587 CmdArgs.push_back("-lc");
5588
5589 CmdArgs.push_back("-lgcc");
5590 if (Args.hasArg(options::OPT_static)) {
5591 CmdArgs.push_back("-lgcc_eh");
5592 } else {
5593 CmdArgs.push_back("--as-needed");
5594 CmdArgs.push_back("-lgcc_s");
5595 CmdArgs.push_back("--no-as-needed");
5596 }
5597 }
5598
5599 if (!Args.hasArg(options::OPT_nostdlib) &&
5600 !Args.hasArg(options::OPT_nostartfiles)) {
5601 if (!Args.hasArg(options::OPT_shared))
5602 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5603 "crtend.o")));
5604 else
5605 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5606 "crtendS.o")));
5607 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5608 "crtn.o")));
5609 }
5610
Bill Wendling08760582011-06-27 19:15:03 +00005611 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005612
David Chisnallddbd68f2011-09-27 22:03:18 +00005613 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005614 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5615}
5616
Rafael Espindola92b00932010-08-10 00:25:48 +00005617void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5618 const InputInfo &Output,
5619 const InputInfoList &Inputs,
5620 const ArgList &Args,
5621 const char *LinkingOutput) const {
5622 ArgStringList CmdArgs;
5623
5624 // Add --32/--64 to make sure we get the format we want.
5625 // This is incomplete
5626 if (getToolChain().getArch() == llvm::Triple::x86) {
5627 CmdArgs.push_back("--32");
5628 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5629 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005630 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5631 CmdArgs.push_back("-a32");
5632 CmdArgs.push_back("-mppc");
5633 CmdArgs.push_back("-many");
5634 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5635 CmdArgs.push_back("-a64");
5636 CmdArgs.push_back("-mppc64");
5637 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005638 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005639 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005640 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5641 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005642
5643 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5644 getToolChain().getTriple());
5645 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005646
5647 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5648 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5649 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005650 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5651 getToolChain().getArch() == llvm::Triple::mipsel ||
5652 getToolChain().getArch() == llvm::Triple::mips64 ||
5653 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005654 StringRef CPUName;
5655 StringRef ABIName;
5656 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005657
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005658 CmdArgs.push_back("-march");
5659 CmdArgs.push_back(CPUName.data());
5660
5661 // Convert ABI name to the GNU tools acceptable variant.
5662 if (ABIName == "o32")
5663 ABIName = "32";
5664 else if (ABIName == "n64")
5665 ABIName = "64";
5666
5667 CmdArgs.push_back("-mabi");
5668 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005669
5670 if (getToolChain().getArch() == llvm::Triple::mips ||
5671 getToolChain().getArch() == llvm::Triple::mips64)
5672 CmdArgs.push_back("-EB");
5673 else
5674 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005675
5676 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5677 options::OPT_fpic, options::OPT_fno_pic,
5678 options::OPT_fPIE, options::OPT_fno_PIE,
5679 options::OPT_fpie, options::OPT_fno_pie);
5680 if (LastPICArg &&
5681 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5682 LastPICArg->getOption().matches(options::OPT_fpic) ||
5683 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5684 LastPICArg->getOption().matches(options::OPT_fpie))) {
5685 CmdArgs.push_back("-KPIC");
5686 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005687 }
5688
5689 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5690 options::OPT_Xassembler);
5691
5692 CmdArgs.push_back("-o");
5693 CmdArgs.push_back(Output.getFilename());
5694
5695 for (InputInfoList::const_iterator
5696 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5697 const InputInfo &II = *it;
5698 CmdArgs.push_back(II.getFilename());
5699 }
5700
5701 const char *Exec =
5702 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5703 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5704}
5705
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005706static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5707 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005708 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005709 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005710 Args.hasArg(options::OPT_static_libgcc);
5711 if (!D.CCCIsCXX)
5712 CmdArgs.push_back("-lgcc");
5713
5714 if (StaticLibgcc) {
5715 if (D.CCCIsCXX)
5716 CmdArgs.push_back("-lgcc");
5717 } else {
5718 if (!D.CCCIsCXX)
5719 CmdArgs.push_back("--as-needed");
5720 CmdArgs.push_back("-lgcc_s");
5721 if (!D.CCCIsCXX)
5722 CmdArgs.push_back("--no-as-needed");
5723 }
5724
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005725 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005726 CmdArgs.push_back("-lgcc_eh");
5727 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5728 CmdArgs.push_back("-lgcc");
5729}
5730
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005731static bool hasMipsN32ABIArg(const ArgList &Args) {
5732 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5733 return A && (A->getValue(Args) == StringRef("n32"));
5734}
5735
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005736void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5737 const InputInfo &Output,
5738 const InputInfoList &Inputs,
5739 const ArgList &Args,
5740 const char *LinkingOutput) const {
5741 const toolchains::Linux& ToolChain =
5742 static_cast<const toolchains::Linux&>(getToolChain());
5743 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005744 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005745 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005746
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005747 ArgStringList CmdArgs;
5748
Rafael Espindolad1002f62010-11-15 18:28:16 +00005749 // Silence warning for "clang -g foo.o -o foo"
5750 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005751 // and "clang -emit-llvm foo.o -o foo"
5752 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005753 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005754 // handled somewhere else.
5755 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005756
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005757 if (!D.SysRoot.empty())
5758 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005759
Rafael Espindolad47ac232010-11-17 22:26:15 +00005760 if (Args.hasArg(options::OPT_pie))
5761 CmdArgs.push_back("-pie");
5762
Rafael Espindola1c76c592010-11-07 22:57:16 +00005763 if (Args.hasArg(options::OPT_rdynamic))
5764 CmdArgs.push_back("-export-dynamic");
5765
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005766 if (Args.hasArg(options::OPT_s))
5767 CmdArgs.push_back("-s");
5768
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005769 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5770 e = ToolChain.ExtraOpts.end();
5771 i != e; ++i)
5772 CmdArgs.push_back(i->c_str());
5773
5774 if (!Args.hasArg(options::OPT_static)) {
5775 CmdArgs.push_back("--eh-frame-hdr");
5776 }
5777
5778 CmdArgs.push_back("-m");
5779 if (ToolChain.getArch() == llvm::Triple::x86)
5780 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005781 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005782 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005783 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005784 else if (ToolChain.getArch() == llvm::Triple::ppc)
5785 CmdArgs.push_back("elf32ppclinux");
5786 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5787 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005788 else if (ToolChain.getArch() == llvm::Triple::mips)
5789 CmdArgs.push_back("elf32btsmip");
5790 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5791 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005792 else if (ToolChain.getArch() == llvm::Triple::mips64) {
5793 if (hasMipsN32ABIArg(Args))
5794 CmdArgs.push_back("elf32btsmipn32");
5795 else
5796 CmdArgs.push_back("elf64btsmip");
5797 }
5798 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
5799 if (hasMipsN32ABIArg(Args))
5800 CmdArgs.push_back("elf32ltsmipn32");
5801 else
5802 CmdArgs.push_back("elf64ltsmip");
5803 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005804 else
5805 CmdArgs.push_back("elf_x86_64");
5806
5807 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005808 if (ToolChain.getArch() == llvm::Triple::arm
5809 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005810 CmdArgs.push_back("-Bstatic");
5811 else
5812 CmdArgs.push_back("-static");
5813 } else if (Args.hasArg(options::OPT_shared)) {
5814 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005815 if ((ToolChain.getArch() == llvm::Triple::arm
5816 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5817 CmdArgs.push_back("-Bsymbolic");
5818 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005819 }
5820
5821 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005822 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005823 (!Args.hasArg(options::OPT_static) &&
5824 !Args.hasArg(options::OPT_shared))) {
5825 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005826 if (isAndroid)
5827 CmdArgs.push_back("/system/bin/linker");
5828 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005829 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005830 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005831 ToolChain.getArch() == llvm::Triple::thumb) {
5832 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5833 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5834 else
5835 CmdArgs.push_back("/lib/ld-linux.so.3");
5836 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005837 else if (ToolChain.getArch() == llvm::Triple::mips ||
5838 ToolChain.getArch() == llvm::Triple::mipsel)
5839 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005840 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00005841 ToolChain.getArch() == llvm::Triple::mips64el) {
5842 if (hasMipsN32ABIArg(Args))
5843 CmdArgs.push_back("/lib32/ld.so.1");
5844 else
5845 CmdArgs.push_back("/lib64/ld.so.1");
5846 }
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005847 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005848 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005849 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005850 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005851 else
5852 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5853 }
5854
5855 CmdArgs.push_back("-o");
5856 CmdArgs.push_back(Output.getFilename());
5857
Rafael Espindola81937ec2010-12-01 01:52:43 +00005858 if (!Args.hasArg(options::OPT_nostdlib) &&
5859 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005860 if (!isAndroid) {
5861 const char *crt1 = NULL;
5862 if (!Args.hasArg(options::OPT_shared)){
5863 if (Args.hasArg(options::OPT_pie))
5864 crt1 = "Scrt1.o";
5865 else
5866 crt1 = "crt1.o";
5867 }
5868 if (crt1)
5869 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005870
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005871 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5872 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005873
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005874 const char *crtbegin;
5875 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005876 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005877 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005878 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005879 else if (Args.hasArg(options::OPT_pie))
5880 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005881 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005882 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005883 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005884
5885 // Add crtfastmath.o if available and fast math is enabled.
5886 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005887 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005888
5889 Args.AddAllArgs(CmdArgs, options::OPT_L);
5890
5891 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5892
Roman Divackyee8188a2011-03-01 17:53:14 +00005893 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5894 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005895 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005896
Rafael Espindola9446d762012-04-09 23:53:34 +00005897 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5898 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5899 // forward.
5900 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5901 CmdArgs.push_back("-plugin");
5902 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5903 CmdArgs.push_back(Args.MakeArgString(Plugin));
5904 }
5905
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005906 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5907 CmdArgs.push_back("--no-demangle");
5908
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005909 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5910
Chandler Carruth94a32012012-05-14 18:31:18 +00005911 if (D.CCCIsCXX &&
5912 !Args.hasArg(options::OPT_nostdlib) &&
5913 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005914 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5915 !Args.hasArg(options::OPT_static);
5916 if (OnlyLibstdcxxStatic)
5917 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005918 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005919 if (OnlyLibstdcxxStatic)
5920 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005921 CmdArgs.push_back("-lm");
5922 }
5923
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005924 // Call this before we add the C run-time.
5925 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005926 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005927
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005928 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005929 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5930 if (Args.hasArg(options::OPT_static))
5931 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005932
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005933 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005934
Chandler Carruth94a32012012-05-14 18:31:18 +00005935 if (Args.hasArg(options::OPT_pthread) ||
5936 Args.hasArg(options::OPT_pthreads))
5937 CmdArgs.push_back("-lpthread");
5938
5939 CmdArgs.push_back("-lc");
5940
5941 if (Args.hasArg(options::OPT_static))
5942 CmdArgs.push_back("--end-group");
5943 else
5944 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5945 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005946
Rafael Espindola81937ec2010-12-01 01:52:43 +00005947 if (!Args.hasArg(options::OPT_nostartfiles)) {
5948 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005949 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005950 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005951 else if (Args.hasArg(options::OPT_pie))
5952 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005953 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005954 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005955
Rafael Espindola81937ec2010-12-01 01:52:43 +00005956 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005957 if (!isAndroid)
5958 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005959 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005960 }
5961
Bill Wendling08760582011-06-27 19:15:03 +00005962 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Richard Smithe30752c2012-10-09 19:52:38 +00005963 addUbsanRTLinux(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005964
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005965 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5966}
Rafael Espindola92b00932010-08-10 00:25:48 +00005967
Chris Lattner3e2ee142010-07-07 16:01:42 +00005968void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005969 const InputInfo &Output,
5970 const InputInfoList &Inputs,
5971 const ArgList &Args,
5972 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005973 ArgStringList CmdArgs;
5974
5975 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5976 options::OPT_Xassembler);
5977
5978 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005979 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005980
5981 for (InputInfoList::const_iterator
5982 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5983 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005984 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005985 }
5986
5987 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005988 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005990}
5991
5992void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005993 const InputInfo &Output,
5994 const InputInfoList &Inputs,
5995 const ArgList &Args,
5996 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005997 const Driver &D = getToolChain().getDriver();
5998 ArgStringList CmdArgs;
5999
Daniel Dunbarb440f562010-08-02 02:38:21 +00006000 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006001 CmdArgs.push_back("-o");
6002 CmdArgs.push_back(Output.getFilename());
6003 } else {
6004 assert(Output.isNothing() && "Invalid output.");
6005 }
6006
6007 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00006008 !Args.hasArg(options::OPT_nostartfiles)) {
6009 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
6010 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
6011 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
6012 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
6013 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006014
6015 Args.AddAllArgs(CmdArgs, options::OPT_L);
6016 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6017 Args.AddAllArgs(CmdArgs, options::OPT_e);
6018
Daniel Dunbar54423b22010-09-17 00:24:54 +00006019 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006020
Eli Friedman83de5132011-12-08 23:54:21 +00006021 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
6022
Chris Lattner3e2ee142010-07-07 16:01:42 +00006023 if (!Args.hasArg(options::OPT_nostdlib) &&
6024 !Args.hasArg(options::OPT_nodefaultlibs)) {
6025 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006026 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006027 CmdArgs.push_back("-lm");
6028 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00006029 }
6030
6031 if (!Args.hasArg(options::OPT_nostdlib) &&
6032 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00006033 if (Args.hasArg(options::OPT_pthread))
6034 CmdArgs.push_back("-lpthread");
6035 CmdArgs.push_back("-lc");
6036 CmdArgs.push_back("-lCompilerRT-Generic");
6037 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
6038 CmdArgs.push_back(
6039 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006040 }
6041
Eli Friedman83de5132011-12-08 23:54:21 +00006042 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006043 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006044}
6045
Daniel Dunbarcc912342009-05-02 18:28:39 +00006046/// DragonFly Tools
6047
6048// For now, DragonFly Assemble does just about the same as for
6049// FreeBSD, but this may change soon.
6050void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006051 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006052 const InputInfoList &Inputs,
6053 const ArgList &Args,
6054 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006055 ArgStringList CmdArgs;
6056
6057 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6058 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006059 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006060 CmdArgs.push_back("--32");
6061
6062 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6063 options::OPT_Xassembler);
6064
6065 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006066 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006067
6068 for (InputInfoList::const_iterator
6069 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6070 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006071 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006072 }
6073
6074 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006075 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006076 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006077}
6078
6079void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006080 const InputInfo &Output,
6081 const InputInfoList &Inputs,
6082 const ArgList &Args,
6083 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006084 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006085 ArgStringList CmdArgs;
6086
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006087 if (!D.SysRoot.empty())
6088 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6089
Daniel Dunbarcc912342009-05-02 18:28:39 +00006090 if (Args.hasArg(options::OPT_static)) {
6091 CmdArgs.push_back("-Bstatic");
6092 } else {
6093 if (Args.hasArg(options::OPT_shared))
6094 CmdArgs.push_back("-Bshareable");
6095 else {
6096 CmdArgs.push_back("-dynamic-linker");
6097 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6098 }
6099 }
6100
6101 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6102 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006103 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006104 CmdArgs.push_back("-m");
6105 CmdArgs.push_back("elf_i386");
6106 }
6107
Daniel Dunbarb440f562010-08-02 02:38:21 +00006108 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006109 CmdArgs.push_back("-o");
6110 CmdArgs.push_back(Output.getFilename());
6111 } else {
6112 assert(Output.isNothing() && "Invalid output.");
6113 }
6114
6115 if (!Args.hasArg(options::OPT_nostdlib) &&
6116 !Args.hasArg(options::OPT_nostartfiles)) {
6117 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006118 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006119 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006120 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006121 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006122 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006123 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006124 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006125 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006126 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006127 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006128 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006129 }
6130 }
6131
6132 Args.AddAllArgs(CmdArgs, options::OPT_L);
6133 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6134 Args.AddAllArgs(CmdArgs, options::OPT_e);
6135
Daniel Dunbar54423b22010-09-17 00:24:54 +00006136 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006137
6138 if (!Args.hasArg(options::OPT_nostdlib) &&
6139 !Args.hasArg(options::OPT_nodefaultlibs)) {
6140 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6141 // rpaths
6142 CmdArgs.push_back("-L/usr/lib/gcc41");
6143
6144 if (!Args.hasArg(options::OPT_static)) {
6145 CmdArgs.push_back("-rpath");
6146 CmdArgs.push_back("/usr/lib/gcc41");
6147
6148 CmdArgs.push_back("-rpath-link");
6149 CmdArgs.push_back("/usr/lib/gcc41");
6150
6151 CmdArgs.push_back("-rpath");
6152 CmdArgs.push_back("/usr/lib");
6153
6154 CmdArgs.push_back("-rpath-link");
6155 CmdArgs.push_back("/usr/lib");
6156 }
6157
Rafael Espindola38360b32010-07-20 12:59:03 +00006158 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006159 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006160 CmdArgs.push_back("-lm");
6161 }
6162
Daniel Dunbarcc912342009-05-02 18:28:39 +00006163 if (Args.hasArg(options::OPT_shared)) {
6164 CmdArgs.push_back("-lgcc_pic");
6165 } else {
6166 CmdArgs.push_back("-lgcc");
6167 }
6168
6169
6170 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006171 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006172
6173 if (!Args.hasArg(options::OPT_nolibc)) {
6174 CmdArgs.push_back("-lc");
6175 }
6176
6177 if (Args.hasArg(options::OPT_shared)) {
6178 CmdArgs.push_back("-lgcc_pic");
6179 } else {
6180 CmdArgs.push_back("-lgcc");
6181 }
6182 }
6183
6184 if (!Args.hasArg(options::OPT_nostdlib) &&
6185 !Args.hasArg(options::OPT_nostartfiles)) {
6186 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006187 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006188 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006189 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006190 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006191 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006192 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006193 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006194 }
6195
Bill Wendling08760582011-06-27 19:15:03 +00006196 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006197
Daniel Dunbarcc912342009-05-02 18:28:39 +00006198 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006199 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006200 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006201}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006202
6203void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6204 const InputInfo &Output,
6205 const InputInfoList &Inputs,
6206 const ArgList &Args,
6207 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006208 ArgStringList CmdArgs;
6209
6210 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006211 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6212 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006213 } else {
6214 assert(Output.isNothing() && "Invalid output.");
6215 }
6216
6217 if (!Args.hasArg(options::OPT_nostdlib) &&
6218 !Args.hasArg(options::OPT_nostartfiles)) {
6219 CmdArgs.push_back("-defaultlib:libcmt");
6220 }
6221
6222 CmdArgs.push_back("-nologo");
6223
Michael J. Spencere2f49362012-06-18 16:56:04 +00006224 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6225
6226 // Add filenames immediately.
6227 for (InputInfoList::const_iterator
6228 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6229 if (it->isFilename())
6230 CmdArgs.push_back(it->getFilename());
6231 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006232
6233 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006234 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006235 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6236}