blob: fdc4eb9d684f7698dd61b2b71935150d2a035662 [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
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000203void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000205 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000209 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000210
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000215
216 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000222 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000223 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000224 C.addFailureResultFile(DepFile);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000225 } else if (Output.getType() == types::TY_Dependencies) {
226 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000232 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000237 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000250 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 }
254
255 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000256 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 }
260
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 CmdArgs.push_back("-sys-header-deps");
264 }
265
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000270 CmdArgs.push_back("-MG");
271 }
272
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000279 const Arg *A = *it;
280 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000281
Daniel Dunbara442fd52010-06-11 22:00:13 +0000282 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000285 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000290 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 }
292 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293
Douglas Gregor111af7d2009-04-18 00:34:01 +0000294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000299 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303
304 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000308 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000309 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000312 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000313 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000314 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000315 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000316 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000319 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000320 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 if (!FoundPCH) {
324 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000326 FoundPTH = true;
327 else
328 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000329 }
330
Douglas Gregor111af7d2009-04-18 00:34:01 +0000331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000336 }
Mike Stump11289f42009-09-09 15:08:12 +0000337 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000352 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000353 << P.str() << A->getAsString(Args);
354 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000387 }
388 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000396 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000403
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000404 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000418
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000419 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000420 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000425}
426
Daniel Dunbarf492c922009-09-10 22:59:51 +0000427/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000428/// CPU.
429//
430// FIXME: This is redundant with -mcpu, why does LLVM use this.
431// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000432static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Silviu Baranga157f7c62012-09-13 15:06:00 +0000445 .Cases("cortex-a8", "cortex-a9", "cortex-a15", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000446 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000447 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000448 .Case("cortex-m0", "v6m")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000449 .Case("cortex-a9-mp", "v7f")
450 .Case("swift", "v7s")
Chad Rosier9ac84512011-10-07 17:48:56 +0000451 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000452}
453
Benjamin Kramer09811c72012-06-26 22:20:06 +0000454/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
455//
456// FIXME: tblgen this.
457static std::string getARMTargetCPU(const ArgList &Args,
458 const llvm::Triple &Triple) {
459 // FIXME: Warn on inconsistent use of -mcpu and -march.
460
461 // If we have -mcpu=, use that.
462 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
463 StringRef MCPU = A->getValue(Args);
464 // Handle -mcpu=native.
465 if (MCPU == "native")
466 return llvm::sys::getHostCPUName();
467 else
468 return MCPU;
469 }
470
471 StringRef MArch;
472 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
473 // Otherwise, if we have -march= choose the base CPU for that arch.
474 MArch = A->getValue(Args);
475 } else {
476 // Otherwise, use the Arch from the triple.
477 MArch = Triple.getArchName();
478 }
479
480 // Handle -march=native.
481 std::string NativeMArch;
482 if (MArch == "native") {
483 std::string CPU = llvm::sys::getHostCPUName();
484 if (CPU != "generic") {
485 // Translate the native cpu into the architecture. The switch below will
486 // then chose the minimum cpu for that arch.
487 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
488 MArch = NativeMArch;
489 }
490 }
491
492 return llvm::StringSwitch<const char *>(MArch)
493 .Cases("armv2", "armv2a","arm2")
494 .Case("armv3", "arm6")
495 .Case("armv3m", "arm7m")
496 .Cases("armv4", "armv4t", "arm7tdmi")
497 .Cases("armv5", "armv5t", "arm10tdmi")
498 .Cases("armv5e", "armv5te", "arm1022e")
499 .Case("armv5tej", "arm926ej-s")
500 .Cases("armv6", "armv6k", "arm1136jf-s")
501 .Case("armv6j", "arm1136j-s")
502 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
503 .Case("armv6t2", "arm1156t2-s")
504 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
Bob Wilsond7cf1042012-09-29 23:52:50 +0000505 .Cases("armv7f", "armv7-f", "cortex-a9-mp")
506 .Cases("armv7s", "armv7-s", "swift")
Benjamin Kramer09811c72012-06-26 22:20:06 +0000507 .Cases("armv7r", "armv7-r", "cortex-r4")
508 .Cases("armv7m", "armv7-m", "cortex-m3")
509 .Case("ep9312", "ep9312")
510 .Case("iwmmxt", "iwmmxt")
511 .Case("xscale", "xscale")
512 .Cases("armv6m", "armv6-m", "cortex-m0")
513 // If all else failed, return the most base CPU LLVM supports.
514 .Default("arm7tdmi");
515}
516
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000517// FIXME: Move to target hook.
518static bool isSignedCharDefault(const llvm::Triple &Triple) {
519 switch (Triple.getArch()) {
520 default:
521 return true;
522
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000523 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000524 case llvm::Triple::ppc:
525 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000526 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000527 return true;
528 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000529 }
530}
531
Chad Rosiercfbfc582012-04-04 20:51:35 +0000532// Handle -mfpu=.
533//
534// FIXME: Centralize feature selection, defaulting shouldn't be also in the
535// frontend target.
536static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
537 ArgStringList &CmdArgs) {
538 StringRef FPU = A->getValue(Args);
539
540 // Set the target features based on the FPU.
541 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
542 // Disable any default FPU support.
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-vfp2");
545 CmdArgs.push_back("-target-feature");
546 CmdArgs.push_back("-vfp3");
547 CmdArgs.push_back("-target-feature");
548 CmdArgs.push_back("-neon");
549 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("+vfp3");
552 CmdArgs.push_back("-target-feature");
553 CmdArgs.push_back("+d16");
554 CmdArgs.push_back("-target-feature");
555 CmdArgs.push_back("-neon");
556 } else if (FPU == "vfp") {
557 CmdArgs.push_back("-target-feature");
558 CmdArgs.push_back("+vfp2");
559 CmdArgs.push_back("-target-feature");
560 CmdArgs.push_back("-neon");
561 } else if (FPU == "vfp3" || FPU == "vfpv3") {
562 CmdArgs.push_back("-target-feature");
563 CmdArgs.push_back("+vfp3");
564 CmdArgs.push_back("-target-feature");
565 CmdArgs.push_back("-neon");
566 } else if (FPU == "neon") {
567 CmdArgs.push_back("-target-feature");
568 CmdArgs.push_back("+neon");
569 } else
570 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
571}
572
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000573// Handle -mfpmath=.
574static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000575 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000576 StringRef FPMath = A->getValue(Args);
577
578 // Set the target features based on the FPMath.
579 if (FPMath == "neon") {
580 CmdArgs.push_back("-target-feature");
581 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000582
Silviu Baranga157f7c62012-09-13 15:06:00 +0000583 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
584 CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000585 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
586
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000587 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
588 FPMath == "vfp4") {
589 CmdArgs.push_back("-target-feature");
590 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000591
592 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000593 } else
594 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
595}
596
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000597// Select the float ABI as determined by -msoft-float, -mhard-float, and
598// -mfloat-abi=.
599static StringRef getARMFloatABI(const Driver &D,
600 const ArgList &Args,
601 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000602 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000603 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
604 options::OPT_mhard_float,
605 options::OPT_mfloat_abi_EQ)) {
606 if (A->getOption().matches(options::OPT_msoft_float))
607 FloatABI = "soft";
608 else if (A->getOption().matches(options::OPT_mhard_float))
609 FloatABI = "hard";
610 else {
611 FloatABI = A->getValue(Args);
612 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000613 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000614 << A->getAsString(Args);
615 FloatABI = "soft";
616 }
617 }
618 }
619
620 // If unspecified, choose the default based on the platform.
621 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000622 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000623 case llvm::Triple::Darwin:
624 case llvm::Triple::MacOSX:
625 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000626 // Darwin defaults to "softfp" for v6 and v7.
627 //
628 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000629 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000630 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000631 if (StringRef(ArchName).startswith("v6") ||
632 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000633 FloatABI = "softfp";
634 else
635 FloatABI = "soft";
636 break;
637 }
638
639 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000640 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000641 case llvm::Triple::GNUEABIHF:
642 FloatABI = "hard";
643 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000644 case llvm::Triple::GNUEABI:
645 FloatABI = "softfp";
646 break;
647 case llvm::Triple::EABI:
648 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
649 FloatABI = "softfp";
650 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000651 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000652 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000653 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000654 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000655 FloatABI = "softfp";
656 else
657 FloatABI = "soft";
658 break;
659 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 default:
661 // Assume "soft", but warn the user we are guessing.
662 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000663 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000664 break;
665 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000666 }
667 }
668
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000669 return FloatABI;
670}
671
672
673void Clang::AddARMTargetArgs(const ArgList &Args,
674 ArgStringList &CmdArgs,
675 bool KernelOrKext) const {
676 const Driver &D = getToolChain().getDriver();
Bob Wilson2afa0112012-09-29 23:52:58 +0000677 // Get the effective triple, which takes into account the deployment target.
678 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
679 llvm::Triple Triple(TripleStr);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000680
681 // Select the ABI to use.
682 //
683 // FIXME: Support -meabi.
684 const char *ABIName = 0;
685 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
686 ABIName = A->getValue(Args);
687 } else {
688 // Select the default based on the platform.
689 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000690 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000691 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000692 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000693 ABIName = "aapcs-linux";
694 break;
695 case llvm::Triple::EABI:
696 ABIName = "aapcs";
697 break;
698 default:
699 ABIName = "apcs-gnu";
700 }
701 }
702 CmdArgs.push_back("-target-abi");
703 CmdArgs.push_back(ABIName);
704
705 // Set the CPU based on -march= and -mcpu=.
706 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000707 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000708
709 // Determine floating point ABI from the options & target defaults.
710 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000711 if (FloatABI == "soft") {
712 // Floating point operations and argument passing are soft.
713 //
714 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000715 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000716 CmdArgs.push_back("-mfloat-abi");
717 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000718 } else if (FloatABI == "softfp") {
719 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000720 CmdArgs.push_back("-mfloat-abi");
721 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000722 } else {
723 // Floating point operations and argument passing are hard.
724 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000725 CmdArgs.push_back("-mfloat-abi");
726 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000727 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000728
729 // Set appropriate target features for floating point mode.
730 //
731 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
732 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
733 // stripped out by the ARM target.
734
735 // Use software floating point operations?
736 if (FloatABI == "soft") {
737 CmdArgs.push_back("-target-feature");
738 CmdArgs.push_back("+soft-float");
739 }
740
741 // Use software floating point argument passing?
742 if (FloatABI != "hard") {
743 CmdArgs.push_back("-target-feature");
744 CmdArgs.push_back("+soft-float-abi");
745 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000746
747 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000748 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000749 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000750
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000751 // Honor -mfpmath=.
752 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000753 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000754
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000755 // Setting -msoft-float effectively disables NEON because of the GCC
756 // implementation, although the same isn't true of VFP or VFP3.
757 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000758 CmdArgs.push_back("-target-feature");
759 CmdArgs.push_back("-neon");
760 }
761
762 // Kernel code has more strict alignment requirements.
763 if (KernelOrKext) {
Bob Wilson2afa0112012-09-29 23:52:58 +0000764 if (Triple.getOS() != llvm::Triple::IOS || Triple.isOSVersionLT(6)) {
765 CmdArgs.push_back("-backend-option");
766 CmdArgs.push_back("-arm-long-calls");
767 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000768
Daniel Dunbar12100e22011-03-22 16:48:17 +0000769 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000770 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000771
772 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000773 CmdArgs.push_back("-backend-option");
774 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000775 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000776
777 // Setting -mno-global-merge disables the codegen global merge pass. Setting
778 // -mglobal-merge has no effect as the pass is enabled by default.
779 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
780 options::OPT_mno_global_merge)) {
781 if (A->getOption().matches(options::OPT_mno_global_merge))
782 CmdArgs.push_back("-mno-global-merge");
783 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000784
Chad Rosierc14ded72012-05-16 21:19:55 +0000785 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000786 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000787}
788
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000789// Translate MIPS CPU name alias option to CPU name.
790static StringRef getMipsCPUFromAlias(const Arg &A) {
791 if (A.getOption().matches(options::OPT_mips32))
792 return "mips32";
793 if (A.getOption().matches(options::OPT_mips32r2))
794 return "mips32r2";
795 if (A.getOption().matches(options::OPT_mips64))
796 return "mips64";
797 if (A.getOption().matches(options::OPT_mips64r2))
798 return "mips64r2";
799 llvm_unreachable("Unexpected option");
800 return "";
801}
802
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000803// Get CPU and ABI names. They are not independent
804// so we have to calculate them together.
805static void getMipsCPUAndABI(const ArgList &Args,
806 const ToolChain &TC,
807 StringRef &CPUName,
808 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000809 const char *DefMips32CPU = "mips32";
810 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000811
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000812 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000813 options::OPT_mcpu_EQ,
814 options::OPT_mips_CPUs_Group)) {
815 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
816 CPUName = getMipsCPUFromAlias(*A);
817 else
818 CPUName = A->getValue(Args);
819 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000820
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000821 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000822 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000823
824 // Setup default CPU and ABI names.
825 if (CPUName.empty() && ABIName.empty()) {
826 switch (TC.getTriple().getArch()) {
827 default:
828 llvm_unreachable("Unexpected triple arch name");
829 case llvm::Triple::mips:
830 case llvm::Triple::mipsel:
831 CPUName = DefMips32CPU;
832 break;
833 case llvm::Triple::mips64:
834 case llvm::Triple::mips64el:
835 CPUName = DefMips64CPU;
836 break;
837 }
838 }
839
840 if (!ABIName.empty()) {
841 // Deduce CPU name from ABI name.
842 CPUName = llvm::StringSwitch<const char *>(ABIName)
843 .Cases("o32", "eabi", DefMips32CPU)
844 .Cases("n32", "n64", DefMips64CPU)
845 .Default("");
846 }
847 else if (!CPUName.empty()) {
848 // Deduce ABI name from CPU name.
849 ABIName = llvm::StringSwitch<const char *>(CPUName)
850 .Cases("mips32", "mips32r2", "o32")
851 .Cases("mips64", "mips64r2", "n64")
852 .Default("");
853 }
854
855 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000856}
857
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000858// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
859// and -mfloat-abi=.
860static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000861 // Select the float ABI as determined by -msoft-float, -mhard-float,
862 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000863 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000864 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000865 options::OPT_mhard_float,
866 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000867 if (A->getOption().matches(options::OPT_msoft_float))
868 FloatABI = "soft";
869 else if (A->getOption().matches(options::OPT_mhard_float))
870 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000871 else {
872 FloatABI = A->getValue(Args);
873 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000874 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000875 FloatABI = "hard";
876 }
877 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000878 }
879
880 // If unspecified, choose the default based on the platform.
881 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000882 // Assume "hard", because it's a default value used by gcc.
883 // When we start to recognize specific target MIPS processors,
884 // we will be able to select the default more correctly.
885 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000886 }
887
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000888 return FloatABI;
889}
890
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000891static void AddTargetFeature(const ArgList &Args,
892 ArgStringList &CmdArgs,
893 OptSpecifier OnOpt,
894 OptSpecifier OffOpt,
895 StringRef FeatureName) {
896 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
897 CmdArgs.push_back("-target-feature");
898 if (A->getOption().matches(OnOpt))
899 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
900 else
901 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
902 }
903}
904
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000905void Clang::AddMIPSTargetArgs(const ArgList &Args,
906 ArgStringList &CmdArgs) const {
907 const Driver &D = getToolChain().getDriver();
908 StringRef CPUName;
909 StringRef ABIName;
910 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
911
912 CmdArgs.push_back("-target-cpu");
913 CmdArgs.push_back(CPUName.data());
914
915 CmdArgs.push_back("-target-abi");
916 CmdArgs.push_back(ABIName.data());
917
918 StringRef FloatABI = getMipsFloatABI(D, Args);
919
Eric Christopher0b26a612010-03-02 02:41:08 +0000920 if (FloatABI == "soft") {
921 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000922 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000923 CmdArgs.push_back("-mfloat-abi");
924 CmdArgs.push_back("soft");
925
926 // FIXME: Note, this is a hack. We need to pass the selected float
927 // mode to the MipsTargetInfoBase to define appropriate macros there.
928 // Now it is the only method.
929 CmdArgs.push_back("-target-feature");
930 CmdArgs.push_back("+soft-float");
931 }
932 else if (FloatABI == "single") {
933 // Restrict the use of hardware floating-point
934 // instructions to 32-bit operations.
935 CmdArgs.push_back("-target-feature");
936 CmdArgs.push_back("+single-float");
937 }
938 else {
939 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000940 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000941 CmdArgs.push_back("-mfloat-abi");
942 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000943 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000944
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000945 AddTargetFeature(Args, CmdArgs,
946 options::OPT_mips16, options::OPT_mno_mips16,
947 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000948 AddTargetFeature(Args, CmdArgs,
949 options::OPT_mdsp, options::OPT_mno_dsp,
950 "dsp");
951 AddTargetFeature(Args, CmdArgs,
952 options::OPT_mdspr2, options::OPT_mno_dspr2,
953 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000954
955 if (Arg *A = Args.getLastArg(options::OPT_G)) {
956 StringRef v = A->getValue(Args);
957 CmdArgs.push_back("-mllvm");
958 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
959 A->claim();
960 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000961}
962
Hal Finkel8eb59282012-06-11 22:35:19 +0000963/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
964static std::string getPPCTargetCPU(const ArgList &Args) {
965 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
966 StringRef CPUName = A->getValue(Args);
967
968 if (CPUName == "native") {
969 std::string CPU = llvm::sys::getHostCPUName();
970 if (!CPU.empty() && CPU != "generic")
971 return CPU;
972 else
973 return "";
974 }
975
976 return llvm::StringSwitch<const char *>(CPUName)
977 .Case("common", "generic")
978 .Case("440", "440")
979 .Case("440fp", "440")
980 .Case("450", "450")
981 .Case("601", "601")
982 .Case("602", "602")
983 .Case("603", "603")
984 .Case("603e", "603e")
985 .Case("603ev", "603ev")
986 .Case("604", "604")
987 .Case("604e", "604e")
988 .Case("620", "620")
989 .Case("G3", "g3")
990 .Case("7400", "7400")
991 .Case("G4", "g4")
992 .Case("7450", "7450")
993 .Case("G4+", "g4+")
994 .Case("750", "750")
995 .Case("970", "970")
996 .Case("G5", "g5")
997 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000998 .Case("e500mc", "e500mc")
999 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +00001000 .Case("power6", "pwr6")
1001 .Case("power7", "pwr7")
1002 .Case("powerpc", "ppc")
1003 .Case("powerpc64", "ppc64")
1004 .Default("");
1005 }
1006
1007 return "";
1008}
1009
1010void Clang::AddPPCTargetArgs(const ArgList &Args,
1011 ArgStringList &CmdArgs) const {
1012 std::string TargetCPUName = getPPCTargetCPU(Args);
1013
1014 // LLVM may default to generating code for the native CPU,
1015 // but, like gcc, we default to a more generic option for
1016 // each architecture. (except on Darwin)
1017 llvm::Triple Triple = getToolChain().getTriple();
1018 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1019 if (Triple.getArch() == llvm::Triple::ppc64)
1020 TargetCPUName = "ppc64";
1021 else
1022 TargetCPUName = "ppc";
1023 }
1024
1025 if (!TargetCPUName.empty()) {
1026 CmdArgs.push_back("-target-cpu");
1027 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1028 }
1029}
1030
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001031void Clang::AddSparcTargetArgs(const ArgList &Args,
1032 ArgStringList &CmdArgs) const {
1033 const Driver &D = getToolChain().getDriver();
1034
1035 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001036 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001037 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001038 }
1039
1040 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001041 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001042 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1043 options::OPT_mhard_float)) {
1044 if (A->getOption().matches(options::OPT_msoft_float))
1045 FloatABI = "soft";
1046 else if (A->getOption().matches(options::OPT_mhard_float))
1047 FloatABI = "hard";
1048 }
1049
1050 // If unspecified, choose the default based on the platform.
1051 if (FloatABI.empty()) {
1052 switch (getToolChain().getTriple().getOS()) {
1053 default:
1054 // Assume "soft", but warn the user we are guessing.
1055 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001056 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001057 break;
1058 }
1059 }
1060
1061 if (FloatABI == "soft") {
1062 // Floating point operations and argument passing are soft.
1063 //
1064 // FIXME: This changes CPP defines, we need -target-soft-float.
1065 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001066 CmdArgs.push_back("-target-feature");
1067 CmdArgs.push_back("+soft-float");
1068 } else {
1069 assert(FloatABI == "hard" && "Invalid float abi!");
1070 CmdArgs.push_back("-mhard-float");
1071 }
1072}
1073
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001074void Clang::AddX86TargetArgs(const ArgList &Args,
1075 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001076 if (!Args.hasFlag(options::OPT_mred_zone,
1077 options::OPT_mno_red_zone,
1078 true) ||
1079 Args.hasArg(options::OPT_mkernel) ||
1080 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001081 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001082
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001083 if (Args.hasFlag(options::OPT_msoft_float,
1084 options::OPT_mno_soft_float,
1085 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001086 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001087
Daniel Dunbare13ada62009-11-14 22:04:54 +00001088 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001089 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001090 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001091 // FIXME: Reject attempts to use -march=native unless the target matches
1092 // the host.
1093 //
1094 // FIXME: We should also incorporate the detected target features for use
1095 // with -native.
1096 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001097 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001098 CPUName = Args.MakeArgString(CPU);
1099 } else
1100 CPUName = A->getValue(Args);
1101 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001102
Daniel Dunbare13ada62009-11-14 22:04:54 +00001103 // Select the default CPU if none was given (or detection failed).
1104 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001105 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001106 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001108 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001110 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001111 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001112 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001113 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001114 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001115 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001116 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001117 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001118 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001119 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001120 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001121 } else if (getToolChain().getOS().startswith("bitrig")) {
1122 if (getToolChain().getArch() == llvm::Triple::x86_64)
1123 CPUName = "x86-64";
1124 else if (getToolChain().getArch() == llvm::Triple::x86)
1125 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001126 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001127 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001128 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001129 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001130 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001131 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001132 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001133 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001134 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001135 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001136 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001137 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001139 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001140 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001141 }
1142 }
1143
Daniel Dunbare13ada62009-11-14 22:04:54 +00001144 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001145 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001146 CmdArgs.push_back(CPUName);
1147 }
1148
Eli Friedmanad811f02011-07-02 00:34:19 +00001149 // The required algorithm here is slightly strange: the options are applied
1150 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1151 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1152 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1153 // former correctly, but not the latter; handle directly-overridden
1154 // attributes here.
1155 llvm::StringMap<unsigned> PrevFeature;
1156 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001157 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1158 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001159 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001160 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001161
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001162 // Skip over "-m".
1163 assert(Name.startswith("-m") && "Invalid feature name.");
1164 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001165
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001166 bool IsNegative = Name.startswith("no-");
1167 if (IsNegative)
1168 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001169
Eli Friedmanad811f02011-07-02 00:34:19 +00001170 unsigned& Prev = PrevFeature[Name];
1171 if (Prev)
1172 Features[Prev - 1] = 0;
1173 Prev = Features.size() + 1;
1174 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1175 }
1176 for (unsigned i = 0; i < Features.size(); i++) {
1177 if (Features[i]) {
1178 CmdArgs.push_back("-target-feature");
1179 CmdArgs.push_back(Features[i]);
1180 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001181 }
1182}
1183
Tony Linthicum76329bf2011-12-12 21:14:55 +00001184static Arg* getLastHexagonArchArg (const ArgList &Args)
1185{
1186 Arg * A = NULL;
1187
Sebastian Pop86500282012-01-13 20:37:10 +00001188 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1189 it != ie; ++it) {
1190 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001191 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1192 A = *it;
1193 A->claim();
1194 }
Sebastian Pop86500282012-01-13 20:37:10 +00001195 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1196 StringRef Value = (*it)->getValue(Args,0);
1197 if (Value.startswith("v")) {
1198 A = *it;
1199 A->claim();
1200 }
1201 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001202 }
1203 return A;
1204}
1205
Sebastian Pop86500282012-01-13 20:37:10 +00001206static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001207{
1208 Arg *A;
1209 llvm::StringRef WhichHexagon;
1210
Sebastian Pop86500282012-01-13 20:37:10 +00001211 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001212 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001213 WhichHexagon = A->getValue(Args);
1214 if (WhichHexagon == "")
1215 return "v4";
1216 else
1217 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001218 }
Sebastian Pop86500282012-01-13 20:37:10 +00001219 else
1220 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221}
1222
1223void Clang::AddHexagonTargetArgs(const ArgList &Args,
1224 ArgStringList &CmdArgs) const {
1225 llvm::Triple Triple = getToolChain().getTriple();
1226
1227 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001228 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001229 CmdArgs.push_back("-fno-signed-char");
1230 CmdArgs.push_back("-nobuiltininc");
1231
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001232 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001233 CmdArgs.push_back("-mqdsp6-compat");
1234
1235 if (Arg *A = Args.getLastArg(options::OPT_G,
1236 options::OPT_msmall_data_threshold_EQ)) {
1237 std::string SmallDataThreshold="-small-data-threshold=";
1238 SmallDataThreshold += A->getValue(Args);
1239 CmdArgs.push_back ("-mllvm");
1240 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1241 A->claim();
1242 }
1243
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001244 if (!Args.hasArg(options::OPT_fno_short_enums))
1245 CmdArgs.push_back("-fshort-enums");
1246 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1247 CmdArgs.push_back ("-mllvm");
1248 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1249 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001250 CmdArgs.push_back ("-mllvm");
1251 CmdArgs.push_back ("-machine-sink-split=0");
1252}
1253
Eric Christopher84fbdb42011-08-19 00:30:14 +00001254static bool
John McCall5fb5df92012-06-20 06:18:46 +00001255shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001256 const llvm::Triple &Triple) {
1257 // We use the zero-cost exception tables for Objective-C if the non-fragile
1258 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1259 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001260 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001261 return true;
1262
Bob Wilson6524dd32011-10-14 05:03:44 +00001263 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001264 return false;
1265
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001266 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001267 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001268 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001269}
1270
Anders Carlssone96ab552011-02-28 02:27:16 +00001271/// addExceptionArgs - Adds exception related arguments to the driver command
1272/// arguments. There's a master flag, -fexceptions and also language specific
1273/// flags to enable/disable C++ and Objective-C exceptions.
1274/// This makes it possible to for example disable C++ exceptions but enable
1275/// Objective-C exceptions.
1276static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1277 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001278 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001279 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001280 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001281 if (KernelOrKext) {
1282 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1283 // arguments now to avoid warnings about unused arguments.
1284 Args.ClaimAllArgs(options::OPT_fexceptions);
1285 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1286 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1287 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1288 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1289 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001290 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001291 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001292
1293 // Exceptions are enabled by default.
1294 bool ExceptionsEnabled = true;
1295
1296 // This keeps track of whether exceptions were explicitly turned on or off.
1297 bool DidHaveExplicitExceptionFlag = false;
1298
Rafael Espindola00a66572009-10-01 13:33:33 +00001299 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1300 options::OPT_fno_exceptions)) {
1301 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001302 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001303 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001304 ExceptionsEnabled = false;
1305
1306 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001307 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001308
Anders Carlssone96ab552011-02-28 02:27:16 +00001309 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001310
Anders Carlssone96ab552011-02-28 02:27:16 +00001311 // Exception tables and cleanups can be enabled with -fexceptions even if the
1312 // language itself doesn't support exceptions.
1313 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1314 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001315
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001316 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1317 // is not necessarily sensible, but follows GCC.
1318 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001319 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001320 options::OPT_fno_objc_exceptions,
1321 true)) {
1322 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001323
Eric Christopher84fbdb42011-08-19 00:30:14 +00001324 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001325 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001326 }
1327
1328 if (types::isCXX(InputType)) {
1329 bool CXXExceptionsEnabled = ExceptionsEnabled;
1330
Eric Christopher84fbdb42011-08-19 00:30:14 +00001331 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1332 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001333 options::OPT_fexceptions,
1334 options::OPT_fno_exceptions)) {
1335 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1336 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001337 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001338 CXXExceptionsEnabled = false;
1339 }
1340
1341 if (CXXExceptionsEnabled) {
1342 CmdArgs.push_back("-fcxx-exceptions");
1343
1344 ShouldUseExceptionTables = true;
1345 }
1346 }
1347
1348 if (ShouldUseExceptionTables)
1349 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001350}
1351
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001352static bool ShouldDisableCFI(const ArgList &Args,
1353 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001354 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001355 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001356 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001357 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001358 Default = Args.hasFlag(options::OPT_integrated_as,
1359 options::OPT_no_integrated_as,
1360 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001361 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001362 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1363 options::OPT_fno_dwarf2_cfi_asm,
1364 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001365}
1366
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001367static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1368 const ToolChain &TC) {
1369 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1370 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1371 options::OPT_no_integrated_as,
1372 IsIADefault);
1373 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1374 options::OPT_fno_dwarf_directory_asm,
1375 UseIntegratedAs);
1376 return !UseDwarfDirectory;
1377}
1378
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001379/// \brief Check whether the given input tree contains any compilation actions.
1380static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001381 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001382 return true;
1383
1384 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1385 if (ContainsCompileAction(*it))
1386 return true;
1387
1388 return false;
1389}
1390
1391/// \brief Check if -relax-all should be passed to the internal assembler.
1392/// This is done by default when compiling non-assembler source with -O0.
1393static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1394 bool RelaxDefault = true;
1395
1396 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1397 RelaxDefault = A->getOption().matches(options::OPT_O0);
1398
1399 if (RelaxDefault) {
1400 RelaxDefault = false;
1401 for (ActionList::const_iterator it = C.getActions().begin(),
1402 ie = C.getActions().end(); it != ie; ++it) {
1403 if (ContainsCompileAction(*it)) {
1404 RelaxDefault = true;
1405 break;
1406 }
1407 }
1408 }
1409
1410 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1411 RelaxDefault);
1412}
1413
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001414/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1415/// This needs to be called before we add the C run-time (malloc, etc).
1416static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001417 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001418 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001419 options::OPT_fno_address_sanitizer, false))
1420 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001421 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001422 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001423 if (!Args.hasArg(options::OPT_pie))
1424 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001425 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001426
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001427 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1428 llvm::sys::path::append(LibAsan, "lib", "linux",
1429 (Twine("libclang_rt.asan-") +
1430 TC.getArchName() + "-android.so"));
1431 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001432 } else {
1433 if (!Args.hasArg(options::OPT_shared)) {
1434 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1435 // resource directory.
1436 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1437 llvm::sys::path::append(LibAsan, "lib", "linux",
1438 (Twine("libclang_rt.asan-") +
1439 TC.getArchName() + ".a"));
1440 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1441 CmdArgs.push_back("-lpthread");
1442 CmdArgs.push_back("-ldl");
1443 CmdArgs.push_back("-export-dynamic");
1444 }
1445 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001446}
1447
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001448/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1449/// This needs to be called before we add the C run-time (malloc, etc).
1450static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1451 ArgStringList &CmdArgs) {
1452 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1453 options::OPT_fno_thread_sanitizer, false))
1454 return;
1455 if (!Args.hasArg(options::OPT_shared)) {
1456 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1457 // resource directory.
1458 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1459 llvm::sys::path::append(LibTsan, "lib", "linux",
1460 (Twine("libclang_rt.tsan-") +
1461 TC.getArchName() + ".a"));
1462 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1463 CmdArgs.push_back("-lpthread");
1464 CmdArgs.push_back("-ldl");
1465 CmdArgs.push_back("-export-dynamic");
1466 }
1467}
1468
Rafael Espindola224dd632011-12-14 21:02:23 +00001469static bool shouldUseFramePointer(const ArgList &Args,
1470 const llvm::Triple &Triple) {
1471 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1472 options::OPT_fomit_frame_pointer))
1473 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1474
Rafael Espindola00b29182011-12-14 21:50:24 +00001475 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001476 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1477 Triple.getArch() == llvm::Triple::x86) &&
1478 Triple.getOS() == llvm::Triple::Linux) {
1479 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1480 if (!A->getOption().matches(options::OPT_O0))
1481 return false;
1482 }
1483
1484 return true;
1485}
1486
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001487void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001488 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001489 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001490 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001491 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001492 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1493 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001494 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001495 ArgStringList CmdArgs;
1496
Daniel Dunbare521a892009-03-31 20:53:55 +00001497 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1498
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001499 // Invoke ourselves in -cc1 mode.
1500 //
1501 // FIXME: Implement custom jobs for internal actions.
1502 CmdArgs.push_back("-cc1");
1503
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001504 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001505 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001506 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001507 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001508
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001509 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001510 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001511
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001512 if (isa<AnalyzeJobAction>(JA)) {
1513 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1514 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001515 } else if (isa<MigrateJobAction>(JA)) {
1516 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001517 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001518 if (Output.getType() == types::TY_Dependencies)
1519 CmdArgs.push_back("-Eonly");
1520 else
1521 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001522 } else if (isa<AssembleJobAction>(JA)) {
1523 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001524
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001525 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001526 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001527
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001528 // When using an integrated assembler, translate -Wa, and -Xassembler
1529 // options.
1530 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1531 options::OPT_Xassembler),
1532 ie = Args.filtered_end(); it != ie; ++it) {
1533 const Arg *A = *it;
1534 A->claim();
1535
1536 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001537 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001538
1539 if (Value == "-force_cpusubtype_ALL") {
1540 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001541 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001542 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001543 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001544 CmdArgs.push_back("-mllvm");
1545 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001546 } else if (Value == "--noexecstack") {
1547 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001548 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001549 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001550 << A->getOption().getName() << Value;
1551 }
1552 }
1553 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001554
1555 // Also ignore explicit -force_cpusubtype_ALL option.
1556 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001557 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001558 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001559 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001560
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001561 if (JA.getType() == types::TY_Nothing)
1562 CmdArgs.push_back("-fsyntax-only");
1563 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001564 CmdArgs.push_back("-emit-pch");
1565 else
1566 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001567 } else {
1568 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001569
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001570 if (JA.getType() == types::TY_Nothing) {
1571 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001572 } else if (JA.getType() == types::TY_LLVM_IR ||
1573 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001574 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001575 } else if (JA.getType() == types::TY_LLVM_BC ||
1576 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001577 CmdArgs.push_back("-emit-llvm-bc");
1578 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001579 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001580 } else if (JA.getType() == types::TY_AST) {
1581 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001582 } else if (JA.getType() == types::TY_RewrittenObjC) {
1583 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001584 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001585 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1586 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001587 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001588 } else {
1589 assert(JA.getType() == types::TY_PP_Asm &&
1590 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001591 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001592 }
1593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001594 // The make clang go fast button.
1595 CmdArgs.push_back("-disable-free");
1596
John McCallbb79b5f2010-02-13 03:50:24 +00001597 // Disable the verification pass in -asserts builds.
1598#ifdef NDEBUG
1599 CmdArgs.push_back("-disable-llvm-verifier");
1600#endif
1601
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001602 // Set the main file name, so that debug info works even with
1603 // -save-temps.
1604 CmdArgs.push_back("-main-file-name");
1605 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1606
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001607 // Some flags which affect the language (via preprocessor
1608 // defines). See darwin::CC1::AddCPPArgs.
1609 if (Args.hasArg(options::OPT_static))
1610 CmdArgs.push_back("-static-define");
1611
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001612 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001613 // Enable region store model by default.
1614 CmdArgs.push_back("-analyzer-store=region");
1615
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001616 // Treat blocks as analysis entry points.
1617 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1618
Ted Kremenek49c79792011-03-24 00:28:47 +00001619 CmdArgs.push_back("-analyzer-eagerly-assume");
1620
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001621 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001622 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001623 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001624
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001625 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1626 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001627
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001628 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001629 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001630
1631 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001632
1633 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001634 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1635 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1636 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1637 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1638 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1639 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001640 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001641
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001642 // Set the output format. The default is plist, for (lame) historical
1643 // reasons.
1644 CmdArgs.push_back("-analyzer-output");
1645 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1646 CmdArgs.push_back(A->getValue(Args));
1647 else
1648 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001649
Ted Kremenekfe449a22010-03-22 22:32:05 +00001650 // Disable the presentation of standard compiler warnings when
1651 // using --analyze. We only want to show static analyzer diagnostics
1652 // or frontend errors.
1653 CmdArgs.push_back("-w");
1654
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001655 // Add -Xanalyzer arguments when running as analyzer.
1656 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001657 }
1658
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001659 CheckCodeGenerationOptions(D, Args);
1660
Daniel Dunbar44e71222009-04-29 18:32:25 +00001661 // Perform argument translation for LLVM backend. This
1662 // takes some care in reconciling with llvm-gcc. The
1663 // issue is that llvm-gcc translates these options based on
1664 // the values in cc1, whereas we are processing based on
1665 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001666
Daniel Dunbar44e71222009-04-29 18:32:25 +00001667 // This comes from the default translation the driver + cc1
1668 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001669
1670 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1671 options::OPT_fpic, options::OPT_fno_pic,
1672 options::OPT_fPIE, options::OPT_fno_PIE,
1673 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001674 bool PICDisabled = false;
1675 bool PICEnabled = false;
1676 bool PICForPIE = false;
1677 if (LastPICArg) {
1678 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1679 LastPICArg->getOption().matches(options::OPT_fpie));
1680 PICEnabled = (PICForPIE ||
1681 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1682 LastPICArg->getOption().matches(options::OPT_fpic));
1683 PICDisabled = !PICEnabled;
1684 }
1685 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1686 // PIC or PIE options above, if these show up, PIC is disabled.
Bob Wilson2afa0112012-09-29 23:52:58 +00001687 llvm::Triple Triple(TripleStr);
1688 if ((Args.hasArg(options::OPT_mkernel) ||
1689 Args.hasArg(options::OPT_fapple_kext)) &&
1690 (Triple.getOS() != llvm::Triple::IOS ||
1691 Triple.isOSVersionLT(6)))
Chandler Carruthc0c04552012-04-08 16:40:35 +00001692 PICDisabled = true;
1693 if (Args.hasArg(options::OPT_static))
1694 PICDisabled = true;
1695 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1696
1697 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001698 const char *Model = getToolChain().GetForcedPicModel();
1699 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001700 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001701 Model = "dynamic-no-pic";
1702 else if (PICDisabled)
1703 Model = "static";
1704 else if (PICEnabled)
1705 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001706 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001707 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001708 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001709 StringRef ModelStr = Model ? Model : "";
1710 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001711 CmdArgs.push_back("-mrelocation-model");
1712 CmdArgs.push_back(Model);
1713 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001714
Chandler Carruthc0c04552012-04-08 16:40:35 +00001715 // Infer the __PIC__ and __PIE__ values.
1716 if (ModelStr == "pic" && PICForPIE) {
1717 CmdArgs.push_back("-pie-level");
1718 CmdArgs.push_back((LastPICArg &&
1719 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1720 "2" : "1");
1721 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001722 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001723 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1724 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1725 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001726 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001727
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001728 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1729 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001730 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001731
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001732 // LLVM Code Generator Options.
1733
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001734 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1735 CmdArgs.push_back("-mregparm");
1736 CmdArgs.push_back(A->getValue(Args));
1737 }
1738
Roman Divacky65b88cd2011-03-01 17:40:53 +00001739 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1740 CmdArgs.push_back("-mrtd");
1741
Rafael Espindola224dd632011-12-14 21:02:23 +00001742 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001743 CmdArgs.push_back("-mdisable-fp-elim");
1744 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1745 options::OPT_fno_zero_initialized_in_bss))
1746 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001747 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1748 options::OPT_fno_strict_aliasing,
1749 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001750 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001751 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1752 false))
1753 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001754 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1755 options::OPT_fno_optimize_sibling_calls))
1756 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001757
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001758 // Handle various floating point optimization flags, mapping them to the
1759 // appropriate LLVM code generation flags. The pattern for all of these is to
1760 // default off the codegen optimizations, and if any flag enables them and no
1761 // flag disables them after the flag enabling them, enable the codegen
1762 // optimization. This is complicated by several "umbrella" flags.
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001764 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001765 options::OPT_ffinite_math_only,
1766 options::OPT_fno_finite_math_only,
1767 options::OPT_fhonor_infinities,
1768 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001769 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1770 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001771 A->getOption().getID() != options::OPT_fhonor_infinities)
1772 CmdArgs.push_back("-menable-no-infs");
1773 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001774 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001775 options::OPT_ffinite_math_only,
1776 options::OPT_fno_finite_math_only,
1777 options::OPT_fhonor_nans,
1778 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001779 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1780 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001781 A->getOption().getID() != options::OPT_fhonor_nans)
1782 CmdArgs.push_back("-menable-no-nans");
1783
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001784 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1785 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001786 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001787 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001788 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001789 options::OPT_fno_math_errno))
1790 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1791 if (MathErrno)
1792 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001793
1794 // There are several flags which require disabling very specific
1795 // optimizations. Any of these being disabled forces us to turn off the
1796 // entire set of LLVM optimizations, so collect them through all the flag
1797 // madness.
1798 bool AssociativeMath = false;
1799 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001800 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001801 options::OPT_funsafe_math_optimizations,
1802 options::OPT_fno_unsafe_math_optimizations,
1803 options::OPT_fassociative_math,
1804 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001805 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1806 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001807 A->getOption().getID() != options::OPT_fno_associative_math)
1808 AssociativeMath = true;
1809 bool ReciprocalMath = false;
1810 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001811 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001812 options::OPT_funsafe_math_optimizations,
1813 options::OPT_fno_unsafe_math_optimizations,
1814 options::OPT_freciprocal_math,
1815 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001816 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1817 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001818 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1819 ReciprocalMath = true;
1820 bool SignedZeros = true;
1821 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001822 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001823 options::OPT_funsafe_math_optimizations,
1824 options::OPT_fno_unsafe_math_optimizations,
1825 options::OPT_fsigned_zeros,
1826 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001827 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1828 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001829 A->getOption().getID() != options::OPT_fsigned_zeros)
1830 SignedZeros = false;
1831 bool TrappingMath = true;
1832 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001833 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001834 options::OPT_funsafe_math_optimizations,
1835 options::OPT_fno_unsafe_math_optimizations,
1836 options::OPT_ftrapping_math,
1837 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001838 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1839 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001840 A->getOption().getID() != options::OPT_ftrapping_math)
1841 TrappingMath = false;
1842 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1843 !TrappingMath)
1844 CmdArgs.push_back("-menable-unsafe-fp-math");
1845
Lang Hamesaa53b932012-07-06 00:59:19 +00001846
1847 // Validate and pass through -fp-contract option.
1848 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001849 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001850 options::OPT_ffp_contract)) {
1851 if (A->getOption().getID() == options::OPT_ffp_contract) {
1852 StringRef Val = A->getValue(Args);
1853 if (Val == "fast" || Val == "on" || Val == "off") {
1854 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1855 } else {
1856 D.Diag(diag::err_drv_unsupported_option_argument)
1857 << A->getOption().getName() << Val;
1858 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001859 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001860 // If fast-math is set then set the fp-contract mode to fast.
1861 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1862 }
1863 }
1864
Bob Wilson6a039162012-07-19 03:52:53 +00001865 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1866 // and if we find them, tell the frontend to provide the appropriate
1867 // preprocessor macros. This is distinct from enabling any optimizations as
1868 // these options induce language changes which must survive serialization
1869 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001870 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1871 if (A->getOption().matches(options::OPT_ffast_math))
1872 CmdArgs.push_back("-ffast-math");
1873 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1874 if (A->getOption().matches(options::OPT_ffinite_math_only))
1875 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001876
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001877 // Decide whether to use verbose asm. Verbose assembly is the default on
1878 // toolchains which have the integrated assembler on by default.
1879 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1880 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001881 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001882 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001883 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001884
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001885 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1886 CmdArgs.push_back("-mdebug-pass");
1887 CmdArgs.push_back("Structure");
1888 }
1889 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1890 CmdArgs.push_back("-mdebug-pass");
1891 CmdArgs.push_back("Arguments");
1892 }
1893
John McCall8517abc2010-02-19 02:45:38 +00001894 // Enable -mconstructor-aliases except on darwin, where we have to
1895 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001896 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001897 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001898
John McCall7ef5cb32011-03-18 02:56:14 +00001899 // Darwin's kernel doesn't support guard variables; just die if we
1900 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001901 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001902 CmdArgs.push_back("-fforbid-guard-variables");
1903
Douglas Gregordbe39272011-02-01 15:15:22 +00001904 if (Args.hasArg(options::OPT_mms_bitfields)) {
1905 CmdArgs.push_back("-mms-bitfields");
1906 }
John McCall8517abc2010-02-19 02:45:38 +00001907
Daniel Dunbar306945d2009-09-16 06:17:29 +00001908 // This is a coarse approximation of what llvm-gcc actually does, both
1909 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1910 // complicated ways.
1911 bool AsynchronousUnwindTables =
1912 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1913 options::OPT_fno_asynchronous_unwind_tables,
1914 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001915 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001916 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1917 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001918 CmdArgs.push_back("-munwind-tables");
1919
Rafael Espindola66aa0452012-06-19 01:26:10 +00001920 getToolChain().addClangTargetOptions(CmdArgs);
1921
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001922 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1923 CmdArgs.push_back("-mlimit-float-precision");
1924 CmdArgs.push_back(A->getValue(Args));
1925 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001926
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001927 // FIXME: Handle -mtune=.
1928 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001929
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001930 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001931 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001932 CmdArgs.push_back(A->getValue(Args));
1933 }
1934
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001935 // Add target specific cpu and features flags.
1936 switch(getToolChain().getTriple().getArch()) {
1937 default:
1938 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001939
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001940 case llvm::Triple::arm:
1941 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001942 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001943 break;
1944
Eric Christopher0b26a612010-03-02 02:41:08 +00001945 case llvm::Triple::mips:
1946 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001947 case llvm::Triple::mips64:
1948 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001949 AddMIPSTargetArgs(Args, CmdArgs);
1950 break;
1951
Hal Finkel8eb59282012-06-11 22:35:19 +00001952 case llvm::Triple::ppc:
1953 case llvm::Triple::ppc64:
1954 AddPPCTargetArgs(Args, CmdArgs);
1955 break;
1956
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001957 case llvm::Triple::sparc:
1958 AddSparcTargetArgs(Args, CmdArgs);
1959 break;
1960
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001961 case llvm::Triple::x86:
1962 case llvm::Triple::x86_64:
1963 AddX86TargetArgs(Args, CmdArgs);
1964 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001965
1966 case llvm::Triple::hexagon:
1967 AddHexagonTargetArgs(Args, CmdArgs);
1968 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001969 }
1970
Tony Linthicum76329bf2011-12-12 21:14:55 +00001971
1972
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001973 // Pass the linker version in use.
1974 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1975 CmdArgs.push_back("-target-linker-version");
1976 CmdArgs.push_back(A->getValue(Args));
1977 }
1978
Nick Lewycky75033772011-02-02 06:43:03 +00001979 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001980 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001981 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001982 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001983 CmdArgs.push_back("-momit-leaf-frame-pointer");
1984
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001985 // Explicitly error on some things we know we don't support and can't just
1986 // ignore.
1987 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001988 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1989 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001990 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001991 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001992 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001993 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1994 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001995 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001996 << Unsupported->getOption().getName();
1997 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001998 }
1999
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002000 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002001 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002002 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002003 CmdArgs.push_back("-header-include-file");
2004 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2005 D.CCPrintHeadersFilename : "-");
2006 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002007 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002008 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002009
Chad Rosierbe10f982011-08-02 17:58:04 +00002010 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002011 CmdArgs.push_back("-diagnostic-log-file");
2012 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2013 D.CCLogDiagnosticsFilename : "-");
2014 }
2015
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002016 // Use the last option from "-g" group. "-gline-tables-only" is
2017 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002018 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002019 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2020 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2021 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002022 } else if (!A->getOption().matches(options::OPT_g0) &&
2023 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002024 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002025 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002026 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002027
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002028 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2029 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2030
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002031 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2032 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2033
Chris Lattner3c77a352010-06-22 00:03:40 +00002034 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2035
Nick Lewycky207bce32011-04-21 23:44:07 +00002036 if (Args.hasArg(options::OPT_ftest_coverage) ||
2037 Args.hasArg(options::OPT_coverage))
2038 CmdArgs.push_back("-femit-coverage-notes");
2039 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2040 Args.hasArg(options::OPT_coverage))
2041 CmdArgs.push_back("-femit-coverage-data");
2042
Nick Lewycky480cb992011-05-04 20:46:58 +00002043 if (C.getArgs().hasArg(options::OPT_c) ||
2044 C.getArgs().hasArg(options::OPT_S)) {
2045 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002046 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002047 SmallString<128> absFilename(Output.getFilename());
2048 llvm::sys::fs::make_absolute(absFilename);
2049 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002050 }
2051 }
2052
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002053 // Pass options for controlling the default header search paths.
2054 if (Args.hasArg(options::OPT_nostdinc)) {
2055 CmdArgs.push_back("-nostdsysteminc");
2056 CmdArgs.push_back("-nobuiltininc");
2057 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002058 if (Args.hasArg(options::OPT_nostdlibinc))
2059 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002060 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2061 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2062 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002063
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002064 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002065 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002066 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002067
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002068 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2069
Ted Kremenekf7639e12012-03-06 20:06:33 +00002070 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002071 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002072 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002073 options::OPT_ccc_arcmt_modify,
2074 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002075 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002076 switch (A->getOption().getID()) {
2077 default:
2078 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002079 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002080 CmdArgs.push_back("-arcmt-check");
2081 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002082 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002083 CmdArgs.push_back("-arcmt-modify");
2084 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002085 case options::OPT_ccc_arcmt_migrate:
2086 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002087 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002088 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002089
2090 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2091 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002092 break;
John McCalld70fb982011-06-15 23:25:17 +00002093 }
2094 }
2095 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002096
Ted Kremenekf7639e12012-03-06 20:06:33 +00002097 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2098 if (ARCMTEnabled) {
2099 D.Diag(diag::err_drv_argument_not_allowed_with)
2100 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2101 }
2102 CmdArgs.push_back("-mt-migrate-directory");
2103 CmdArgs.push_back(A->getValue(Args));
2104
2105 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2106 options::OPT_objcmt_migrate_subscripting)) {
2107 // None specified, means enable them all.
2108 CmdArgs.push_back("-objcmt-migrate-literals");
2109 CmdArgs.push_back("-objcmt-migrate-subscripting");
2110 } else {
2111 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2112 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2113 }
2114 }
2115
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002116 // Add preprocessing options like -I, -D, etc. if we are using the
2117 // preprocessor.
2118 //
2119 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002120 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002121 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002122
Rafael Espindolaa7431922011-07-21 23:40:37 +00002123 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2124 // that "The compiler can only warn and ignore the option if not recognized".
2125 // When building with ccache, it will pass -D options to clang even on
2126 // preprocessed inputs and configure concludes that -fPIC is not supported.
2127 Args.ClaimAllArgs(options::OPT_D);
2128
Daniel Dunbar58f78332009-09-17 06:53:36 +00002129 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002130 // others.
2131 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002132 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002133 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002134 else if (A->getOption().matches(options::OPT_O) &&
2135 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002136 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002137 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002138 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002139 }
2140
Daniel Dunbar945577c2009-10-29 02:24:45 +00002141 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002142 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2143 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002144 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002145 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002146
2147 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2148 // (-ansi is equivalent to -std=c89).
2149 //
2150 // If a std is supplied, only add -trigraphs if it follows the
2151 // option.
2152 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2153 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002154 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002155 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002156 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002157 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002158 else
2159 Std->render(Args, CmdArgs);
2160
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002161 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2162 options::OPT_trigraphs))
2163 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002164 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002165 } else {
2166 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002167 //
2168 // FIXME: Clang doesn't correctly handle -std= when the input language
2169 // doesn't match. For the time being just ignore this for C++ inputs;
2170 // eventually we want to do all the standard defaulting here instead of
2171 // splitting it between the driver and clang -cc1.
2172 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002173 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2174 "-std=", /*Joined=*/true);
2175 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2176 CmdArgs.push_back("-std=c++11");
2177
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002178 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002179 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002180
Chandler Carruthb009b142011-04-23 06:30:43 +00002181 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2182 // '-fconst-strings'; this better indicates its actual behavior.
2183 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2184 false)) {
2185 // For perfect compatibility with GCC, we do this even in the presence of
2186 // '-w'. This flag names something other than a warning for GCC.
2187 CmdArgs.push_back("-fconst-strings");
2188 }
2189
Chandler Carruth61fbf622011-04-23 09:27:53 +00002190 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002191 // during C++ compilation, which it is by default. GCC keeps this define even
2192 // in the presence of '-w', match this behavior bug-for-bug.
2193 if (types::isCXX(InputType) &&
2194 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2195 true)) {
2196 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002197 }
2198
Chandler Carruthe0391482010-05-22 02:21:53 +00002199 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2200 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2201 if (Asm->getOption().matches(options::OPT_fasm))
2202 CmdArgs.push_back("-fgnu-keywords");
2203 else
2204 CmdArgs.push_back("-fno-gnu-keywords");
2205 }
2206
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002207 if (ShouldDisableCFI(Args, getToolChain()))
2208 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002209
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002210 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2211 CmdArgs.push_back("-fno-dwarf-directory-asm");
2212
Nick Lewyckyba743b72011-10-21 02:32:14 +00002213 if (const char *pwd = ::getenv("PWD")) {
2214 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2215 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002216 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002217 std::string CompDir = pwd;
2218 CmdArgs.push_back("-fdebug-compilation-dir");
2219 CmdArgs.push_back(Args.MakeArgString(CompDir));
2220 }
2221 }
2222
Richard Smith9a568822011-11-21 19:36:32 +00002223 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2224 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002225 CmdArgs.push_back("-ftemplate-depth");
2226 CmdArgs.push_back(A->getValue(Args));
2227 }
2228
Richard Smith9a568822011-11-21 19:36:32 +00002229 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2230 CmdArgs.push_back("-fconstexpr-depth");
2231 CmdArgs.push_back(A->getValue(Args));
2232 }
2233
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002234 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2235 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002236 if (A->getNumValues()) {
2237 StringRef bytes = A->getValue(Args);
2238 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2239 } else
2240 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002241 }
2242
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2244 options::OPT_fbounds_checking_EQ)) {
2245 if (A->getNumValues()) {
2246 StringRef val = A->getValue(Args);
2247 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2248 } else
2249 CmdArgs.push_back("-fbounds-checking=1");
2250 }
2251
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002252 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002253 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002254
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002255 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2256 CmdArgs.push_back("-fconstant-string-class");
2257 CmdArgs.push_back(A->getValue(Args));
2258 }
David Chisnall5778fce2009-08-31 16:41:57 +00002259
Chris Lattnere23003d2010-01-09 21:54:33 +00002260 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2261 CmdArgs.push_back("-ftabstop");
2262 CmdArgs.push_back(A->getValue(Args));
2263 }
2264
Chris Lattnerb35583d2010-04-07 20:49:23 +00002265 CmdArgs.push_back("-ferror-limit");
2266 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2267 CmdArgs.push_back(A->getValue(Args));
2268 else
2269 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002270
Chandler Carrutha77a7272010-05-06 04:55:18 +00002271 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2272 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002273 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002274 }
2275
2276 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2277 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002278 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002279 }
2280
Richard Smithf6f003a2011-12-16 19:06:07 +00002281 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2282 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2283 CmdArgs.push_back(A->getValue(Args));
2284 }
2285
Daniel Dunbar2c978472009-11-04 06:24:47 +00002286 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002287 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002288 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002289 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002290 } else {
2291 // If -fmessage-length=N was not specified, determine whether this is a
2292 // terminal and, if so, implicitly define -fmessage-length appropriately.
2293 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002294 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002295 }
2296
Daniel Dunbare357d562009-12-03 18:42:11 +00002297 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2298 CmdArgs.push_back("-fvisibility");
2299 CmdArgs.push_back(A->getValue(Args));
2300 }
2301
Douglas Gregor08329632010-06-15 17:05:35 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002303
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002304 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2305
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002306 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002307 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2308 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002309 CmdArgs.push_back("-ffreestanding");
2310
Daniel Dunbare357d562009-12-03 18:42:11 +00002311 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002312 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002313 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002314 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002315 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002316 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002317 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002318 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002319 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2320 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002321
2322 // Report and error for -faltivec on anything other then PowerPC.
2323 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2324 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2325 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2326 D.Diag(diag::err_drv_argument_only_allowed_with)
2327 << A->getAsString(Args) << "ppc/ppc64";
2328
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002329 if (getToolChain().SupportsProfiling())
2330 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002331
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002332 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2333 options::OPT_fno_address_sanitizer, false))
2334 CmdArgs.push_back("-faddress-sanitizer");
2335
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002336 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2337 options::OPT_fno_thread_sanitizer, false))
2338 CmdArgs.push_back("-fthread-sanitizer");
2339
Daniel Dunbar35621a92010-03-16 16:57:46 +00002340 // -flax-vector-conversions is default.
2341 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2342 options::OPT_fno_lax_vector_conversions))
2343 CmdArgs.push_back("-fno-lax-vector-conversions");
2344
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002345 if (Args.getLastArg(options::OPT_fapple_kext))
2346 CmdArgs.push_back("-fapple-kext");
2347
David Blaikie690f21e2012-06-14 18:55:27 +00002348 if (Args.hasFlag(options::OPT_frewrite_includes,
2349 options::OPT_fno_rewrite_includes, false))
2350 CmdArgs.push_back("-frewrite-includes");
2351
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002352 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002353 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002354 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002355 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2356 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002357
2358 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2359 CmdArgs.push_back("-ftrapv-handler");
2360 CmdArgs.push_back(A->getValue(Args));
2361 }
2362
Bob Wilson14adb362012-02-03 06:27:22 +00002363 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002364
Chandler Carruth6e501032011-03-27 00:04:55 +00002365 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2366 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2367 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2368 options::OPT_fno_wrapv)) {
2369 if (A->getOption().matches(options::OPT_fwrapv))
2370 CmdArgs.push_back("-fwrapv");
2371 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2372 options::OPT_fno_strict_overflow)) {
2373 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2374 CmdArgs.push_back("-fwrapv");
2375 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002376 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002377 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002378
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002379 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2380
Daniel Dunbar4930e332009-11-17 08:07:36 +00002381 // -stack-protector=0 is default.
2382 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002383 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2384 options::OPT_fstack_protector_all,
2385 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002386 if (A->getOption().matches(options::OPT_fstack_protector))
2387 StackProtectorLevel = 1;
2388 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2389 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002390 } else {
2391 StackProtectorLevel =
2392 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2393 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002394 if (StackProtectorLevel) {
2395 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002396 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002397 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002398
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002399 // --param ssp-buffer-size=
2400 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2401 ie = Args.filtered_end(); it != ie; ++it) {
2402 StringRef Str((*it)->getValue(Args));
2403 if (Str.startswith("ssp-buffer-size=")) {
2404 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002405 CmdArgs.push_back("-stack-protector-buffer-size");
2406 // FIXME: Verify the argument is a valid integer.
2407 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002408 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002409 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002410 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002411 }
2412
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002413 // Translate -mstackrealign
2414 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2415 false)) {
2416 CmdArgs.push_back("-backend-option");
2417 CmdArgs.push_back("-force-align-stack");
2418 }
2419 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2420 false)) {
2421 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2422 }
2423
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002424 if (Args.hasArg(options::OPT_mstack_alignment)) {
2425 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2426 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002427 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002428
Daniel Dunbard18049a2009-04-07 21:16:11 +00002429 // Forward -f options with positive and negative forms; we translate
2430 // these by hand.
2431
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002432 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002433 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002434 CmdArgs.push_back("-fapple-kext");
2435 if (!Args.hasArg(options::OPT_fbuiltin))
2436 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002437 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002438 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002439 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002440 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002441 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002442
Nuno Lopes13c88c72009-12-16 16:59:22 +00002443 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2444 options::OPT_fno_assume_sane_operator_new))
2445 CmdArgs.push_back("-fno-assume-sane-operator-new");
2446
Daniel Dunbar4930e332009-11-17 08:07:36 +00002447 // -fblocks=0 is default.
2448 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002449 getToolChain().IsBlocksDefault()) ||
2450 (Args.hasArg(options::OPT_fgnu_runtime) &&
2451 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2452 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002453 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002454
2455 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2456 !getToolChain().hasBlocksRuntime())
2457 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002458 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002459
Douglas Gregor226173a2012-01-18 15:19:58 +00002460 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2461 // users must also pass -fcxx-modules. The latter flag will disappear once the
2462 // modules implementation is solid for C++/Objective-C++ programs as well.
2463 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2464 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2465 options::OPT_fno_cxx_modules,
2466 false);
2467 if (AllowedInCXX || !types::isCXX(InputType))
2468 CmdArgs.push_back("-fmodules");
2469 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002470
John McCalldfea9982010-04-09 19:12:06 +00002471 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002472 if (Args.hasFlag(options::OPT_fno_access_control,
2473 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002474 false))
John McCall3155f572010-04-09 19:03:51 +00002475 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002476
Anders Carlssond470fef2010-11-21 00:09:52 +00002477 // -felide-constructors is the default.
2478 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2479 options::OPT_felide_constructors,
2480 false))
2481 CmdArgs.push_back("-fno-elide-constructors");
2482
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002483 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002484 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2485 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002486 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002487
Tony Linthicum76329bf2011-12-12 21:14:55 +00002488 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002489 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002490 options::OPT_fno_short_enums,
2491 getToolChain().getTriple().getArch() ==
2492 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002493 CmdArgs.push_back("-fshort-enums");
2494
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002495 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002496 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002497 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002498 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002499
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002500 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002501 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002502 options::OPT_fno_threadsafe_statics))
2503 CmdArgs.push_back("-fno-threadsafe-statics");
2504
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002505 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002506 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2507 options::OPT_fno_use_cxa_atexit,
2508 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002509 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002510 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2511 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002512 CmdArgs.push_back("-fno-use-cxa-atexit");
2513
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002514 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002515 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002516 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2517 CmdArgs.push_back("-fms-extensions");
2518
Chad Rosiered943242012-07-20 21:20:33 +00002519 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002520 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2521 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002522
Francois Pichet1b4f1632011-09-17 04:32:15 +00002523 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002524 if (Args.hasFlag(options::OPT_fms_compatibility,
2525 options::OPT_fno_ms_compatibility,
2526 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2527 Args.hasFlag(options::OPT_fms_extensions,
2528 options::OPT_fno_ms_extensions,
2529 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002530 CmdArgs.push_back("-fms-compatibility");
2531
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002532 // -fmsc-version=1300 is default.
2533 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2534 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2535 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002536 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002537 if (msc_ver.empty())
2538 CmdArgs.push_back("-fmsc-version=1300");
2539 else
2540 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2541 }
2542
2543
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002544 // -fborland-extensions=0 is default.
2545 if (Args.hasFlag(options::OPT_fborland_extensions,
2546 options::OPT_fno_borland_extensions, false))
2547 CmdArgs.push_back("-fborland-extensions");
2548
Francois Pichet02744872011-09-01 16:38:08 +00002549 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2550 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002551 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2552 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002553 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002554 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002555
Chandler Carruthe03aa552010-04-17 20:17:31 +00002556 // -fgnu-keywords default varies depending on language; only pass if
2557 // specified.
2558 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002559 options::OPT_fno_gnu_keywords))
2560 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002561
Rafael Espindola922a6242011-06-02 17:30:53 +00002562 if (Args.hasFlag(options::OPT_fgnu89_inline,
2563 options::OPT_fno_gnu89_inline,
2564 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002565 CmdArgs.push_back("-fgnu89-inline");
2566
Chad Rosier9c76d242012-03-15 22:31:42 +00002567 if (Args.hasArg(options::OPT_fno_inline))
2568 CmdArgs.push_back("-fno-inline");
2569
Chad Rosier64d6be92012-03-06 21:17:19 +00002570 if (Args.hasArg(options::OPT_fno_inline_functions))
2571 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002572
John McCall5fb5df92012-06-20 06:18:46 +00002573 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002574
John McCall5fb5df92012-06-20 06:18:46 +00002575 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2576 // legacy is the default.
2577 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002578 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2579 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002580 objcRuntime.isLegacyDispatchDefaultForArch(
2581 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002582 if (getToolChain().UseObjCMixedDispatch())
2583 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2584 else
2585 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2586 }
2587 }
2588
Nico Weber97bd94b2012-03-09 21:19:44 +00002589 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2590 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002591 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002592 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2593 }
2594
John McCall24fc0de2011-07-06 00:26:06 +00002595 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2596 // NOTE: This logic is duplicated in ToolChains.cpp.
2597 bool ARC = isObjCAutoRefCount(Args);
2598 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002599 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002600
John McCall24fc0de2011-07-06 00:26:06 +00002601 CmdArgs.push_back("-fobjc-arc");
2602
Chandler Carruth491db322011-11-04 07:34:47 +00002603 // FIXME: It seems like this entire block, and several around it should be
2604 // wrapped in isObjC, but for now we just use it here as this is where it
2605 // was being used previously.
2606 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2607 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2608 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2609 else
2610 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2611 }
2612
John McCall24fc0de2011-07-06 00:26:06 +00002613 // Allow the user to enable full exceptions code emission.
2614 // We define off for Objective-CC, on for Objective-C++.
2615 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2616 options::OPT_fno_objc_arc_exceptions,
2617 /*default*/ types::isCXX(InputType)))
2618 CmdArgs.push_back("-fobjc-arc-exceptions");
2619 }
2620
2621 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2622 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002623 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002624 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002625
John McCall24fc0de2011-07-06 00:26:06 +00002626 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2627 // takes precedence.
2628 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2629 if (!GCArg)
2630 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2631 if (GCArg) {
2632 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002633 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002634 << GCArg->getAsString(Args);
2635 } else if (getToolChain().SupportsObjCGC()) {
2636 GCArg->render(Args, CmdArgs);
2637 } else {
2638 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002639 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002640 << GCArg->getAsString(Args);
2641 }
2642 }
2643
John McCallb5f652e2011-06-22 00:53:57 +00002644 // Add exception args.
2645 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002646 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002647
2648 if (getToolChain().UseSjLjExceptions())
2649 CmdArgs.push_back("-fsjlj-exceptions");
2650
2651 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002652 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2653 options::OPT_fno_assume_sane_operator_new))
2654 CmdArgs.push_back("-fno-assume-sane-operator-new");
2655
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002656 // -fconstant-cfstrings is default, and may be subject to argument translation
2657 // on Darwin.
2658 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2659 options::OPT_fno_constant_cfstrings) ||
2660 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2661 options::OPT_mno_constant_cfstrings))
2662 CmdArgs.push_back("-fno-constant-cfstrings");
2663
John Thompsoned4e2952009-11-05 20:14:16 +00002664 // -fshort-wchar default varies depending on platform; only
2665 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002666 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2667 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002668
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002669 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2670 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002671 //
2672 // FIXME: This is gross; that translation should be pulled from the
2673 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002674 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002675 options::OPT_fno_pascal_strings,
2676 false) ||
2677 Args.hasFlag(options::OPT_mpascal_strings,
2678 options::OPT_mno_pascal_strings,
2679 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002680 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002681
Daniel Dunbar096ed292011-10-05 21:04:55 +00002682 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2683 // -fno-pack-struct doesn't apply to -fpack-struct=.
2684 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002685 std::string PackStructStr = "-fpack-struct=";
2686 PackStructStr += A->getValue(Args);
2687 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002688 } else if (Args.hasFlag(options::OPT_fpack_struct,
2689 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002690 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002691 }
2692
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002693 if (Args.hasArg(options::OPT_mkernel) ||
2694 Args.hasArg(options::OPT_fapple_kext)) {
2695 if (!Args.hasArg(options::OPT_fcommon))
2696 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002697 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002698 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002699
Daniel Dunbard18049a2009-04-07 21:16:11 +00002700 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002701 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002702 CmdArgs.push_back("-fno-common");
2703
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002704 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002705 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002706 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002707 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002708 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002709 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2710
Daniel Dunbar6358d682010-10-15 22:30:42 +00002711 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2712 if (!Args.hasFlag(options::OPT_ffor_scope,
2713 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002714 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002715 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2716
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002717 // -fcaret-diagnostics is default.
2718 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2719 options::OPT_fno_caret_diagnostics, true))
2720 CmdArgs.push_back("-fno-caret-diagnostics");
2721
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002722 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002723 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002724 options::OPT_fno_diagnostics_fixit_info))
2725 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002726
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002727 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002728 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002729 options::OPT_fno_diagnostics_show_option))
2730 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002731
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002732 if (const Arg *A =
2733 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2734 CmdArgs.push_back("-fdiagnostics-show-category");
2735 CmdArgs.push_back(A->getValue(Args));
2736 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002737
Douglas Gregor643c9222011-05-21 17:07:29 +00002738 if (const Arg *A =
2739 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2740 CmdArgs.push_back("-fdiagnostics-format");
2741 CmdArgs.push_back(A->getValue(Args));
2742 }
2743
Chandler Carruthb6766f02011-03-27 01:50:55 +00002744 if (Arg *A = Args.getLastArg(
2745 options::OPT_fdiagnostics_show_note_include_stack,
2746 options::OPT_fno_diagnostics_show_note_include_stack)) {
2747 if (A->getOption().matches(
2748 options::OPT_fdiagnostics_show_note_include_stack))
2749 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2750 else
2751 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2752 }
2753
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002754 // Color diagnostics are the default, unless the terminal doesn't support
2755 // them.
2756 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002757 options::OPT_fno_color_diagnostics,
2758 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002759 CmdArgs.push_back("-fcolor-diagnostics");
2760
Daniel Dunbardb097022009-06-08 21:13:54 +00002761 if (!Args.hasFlag(options::OPT_fshow_source_location,
2762 options::OPT_fno_show_source_location))
2763 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002764
Douglas Gregor643c9222011-05-21 17:07:29 +00002765 if (!Args.hasFlag(options::OPT_fshow_column,
2766 options::OPT_fno_show_column,
2767 true))
2768 CmdArgs.push_back("-fno-show-column");
2769
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002770 if (!Args.hasFlag(options::OPT_fspell_checking,
2771 options::OPT_fno_spell_checking))
2772 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002773
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002774
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002775 // Silently ignore -fasm-blocks for now.
2776 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2777 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002778
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002779 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2780 A->render(Args, CmdArgs);
2781
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002782 // -fdollars-in-identifiers default varies depending on platform and
2783 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002784 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002785 options::OPT_fno_dollars_in_identifiers)) {
2786 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002787 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002788 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002789 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002790 }
2791
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002792 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2793 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002794 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002795 options::OPT_fno_unit_at_a_time)) {
2796 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002797 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002798 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002799
Eli Friedman055c9702011-11-02 01:53:16 +00002800 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2801 options::OPT_fno_apple_pragma_pack, false))
2802 CmdArgs.push_back("-fapple-pragma-pack");
2803
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002804 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002805 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002806 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002807#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002808 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002809 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2810 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2811 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2812 CmdArgs.push_back("-fno-builtin-strcat");
2813 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2814 CmdArgs.push_back("-fno-builtin-strcpy");
2815 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002816#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002817
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002818 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002819 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002820 options::OPT_traditional_cpp)) {
2821 if (isa<PreprocessJobAction>(JA))
2822 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002823 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002824 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002825 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002826
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002827 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002828 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002829
2830 // Handle serialized diagnostics.
2831 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2832 CmdArgs.push_back("-serialize-diagnostic-file");
2833 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2834 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002835
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002836 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2837 CmdArgs.push_back("-fretain-comments-from-system-headers");
2838
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002839 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2840 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002841 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002842 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2843 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002844 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002845
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002846 // We translate this by hand to the -cc1 argument, since nightly test uses
2847 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002848 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002849 CmdArgs.push_back("-disable-llvm-optzns");
2850 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002851 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002852 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002853
Daniel Dunbard67a3222009-03-30 06:36:42 +00002854 if (Output.getType() == types::TY_Dependencies) {
2855 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002856 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002857 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002858 CmdArgs.push_back(Output.getFilename());
2859 } else {
2860 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002861 }
2862
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002863 for (InputInfoList::const_iterator
2864 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2865 const InputInfo &II = *it;
2866 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00002867 if (Args.hasArg(options::OPT_rewrite_objc))
2868 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2869 else
2870 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002871 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002872 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002873 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002874 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002875 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002876
Chris Lattnere9d7d782009-11-03 19:50:27 +00002877 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2878
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002879 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002880
2881 // Optionally embed the -cc1 level arguments into the debug info, for build
2882 // analysis.
2883 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002884 ArgStringList OriginalArgs;
2885 for (ArgList::const_iterator it = Args.begin(),
2886 ie = Args.end(); it != ie; ++it)
2887 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002888
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002889 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002890 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002891 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002892 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002893 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002894 }
2895 CmdArgs.push_back("-dwarf-debug-flags");
2896 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2897 }
2898
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002899 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002900
Roman Divacky178e01602011-02-10 16:52:03 +00002901 if (Arg *A = Args.getLastArg(options::OPT_pg))
2902 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002903 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002904 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002905
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002906 // Claim some arguments which clang supports automatically.
2907
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002908 // -fpch-preprocess is used with gcc to add a special marker in the output to
2909 // include the PCH file. Clang's PTH solution is completely transparent, so we
2910 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002911 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002912
Daniel Dunbar17731772009-03-23 19:03:36 +00002913 // Claim some arguments which clang doesn't support, but we don't
2914 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002915 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2916 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002917
Rafael Espindolad95a8122011-03-01 05:25:27 +00002918 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002919 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002920 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002921}
2922
Jim Grosbach576452b2012-02-10 20:37:10 +00002923void ClangAs::AddARMTargetArgs(const ArgList &Args,
2924 ArgStringList &CmdArgs) const {
2925 const Driver &D = getToolChain().getDriver();
2926 llvm::Triple Triple = getToolChain().getTriple();
2927
2928 // Set the CPU based on -march= and -mcpu=.
2929 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002930 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002931
2932 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002933 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002934 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002935
2936 // Honor -mfpmath=.
2937 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002938 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002939}
2940
John McCall5fb5df92012-06-20 06:18:46 +00002941/// Add options related to the Objective-C runtime/ABI.
2942///
2943/// Returns true if the runtime is non-fragile.
2944ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2945 ArgStringList &cmdArgs,
2946 RewriteKind rewriteKind) const {
2947 // Look for the controlling runtime option.
2948 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2949 options::OPT_fgnu_runtime,
2950 options::OPT_fobjc_runtime_EQ);
2951
2952 // Just forward -fobjc-runtime= to the frontend. This supercedes
2953 // options about fragility.
2954 if (runtimeArg &&
2955 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2956 ObjCRuntime runtime;
2957 StringRef value = runtimeArg->getValue(args);
2958 if (runtime.tryParse(value)) {
2959 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2960 << value;
2961 }
2962
2963 runtimeArg->render(args, cmdArgs);
2964 return runtime;
2965 }
2966
2967 // Otherwise, we'll need the ABI "version". Version numbers are
2968 // slightly confusing for historical reasons:
2969 // 1 - Traditional "fragile" ABI
2970 // 2 - Non-fragile ABI, version 1
2971 // 3 - Non-fragile ABI, version 2
2972 unsigned objcABIVersion = 1;
2973 // If -fobjc-abi-version= is present, use that to set the version.
2974 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2975 StringRef value = abiArg->getValue(args);
2976 if (value == "1")
2977 objcABIVersion = 1;
2978 else if (value == "2")
2979 objcABIVersion = 2;
2980 else if (value == "3")
2981 objcABIVersion = 3;
2982 else
2983 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2984 << value;
2985 } else {
2986 // Otherwise, determine if we are using the non-fragile ABI.
2987 bool nonFragileABIIsDefault =
2988 (rewriteKind == RK_NonFragile ||
2989 (rewriteKind == RK_None &&
2990 getToolChain().IsObjCNonFragileABIDefault()));
2991 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2992 options::OPT_fno_objc_nonfragile_abi,
2993 nonFragileABIIsDefault)) {
2994 // Determine the non-fragile ABI version to use.
2995#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2996 unsigned nonFragileABIVersion = 1;
2997#else
2998 unsigned nonFragileABIVersion = 2;
2999#endif
3000
3001 if (Arg *abiArg = args.getLastArg(
3002 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
3003 StringRef value = abiArg->getValue(args);
3004 if (value == "1")
3005 nonFragileABIVersion = 1;
3006 else if (value == "2")
3007 nonFragileABIVersion = 2;
3008 else
3009 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3010 << value;
3011 }
3012
3013 objcABIVersion = 1 + nonFragileABIVersion;
3014 } else {
3015 objcABIVersion = 1;
3016 }
3017 }
3018
3019 // We don't actually care about the ABI version other than whether
3020 // it's non-fragile.
3021 bool isNonFragile = objcABIVersion != 1;
3022
3023 // If we have no runtime argument, ask the toolchain for its default runtime.
3024 // However, the rewriter only really supports the Mac runtime, so assume that.
3025 ObjCRuntime runtime;
3026 if (!runtimeArg) {
3027 switch (rewriteKind) {
3028 case RK_None:
3029 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3030 break;
3031 case RK_Fragile:
3032 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3033 break;
3034 case RK_NonFragile:
3035 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3036 break;
3037 }
3038
3039 // -fnext-runtime
3040 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3041 // On Darwin, make this use the default behavior for the toolchain.
3042 if (getToolChain().getTriple().isOSDarwin()) {
3043 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3044
3045 // Otherwise, build for a generic macosx port.
3046 } else {
3047 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3048 }
3049
3050 // -fgnu-runtime
3051 } else {
3052 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003053 // Legacy behaviour is to target the gnustep runtime if we are i
3054 // non-fragile mode or the GCC runtime in fragile mode.
3055 if (isNonFragile)
3056 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3057 else
3058 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003059 }
3060
3061 cmdArgs.push_back(args.MakeArgString(
3062 "-fobjc-runtime=" + runtime.getAsString()));
3063 return runtime;
3064}
3065
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003066void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003067 const InputInfo &Output,
3068 const InputInfoList &Inputs,
3069 const ArgList &Args,
3070 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003071 ArgStringList CmdArgs;
3072
3073 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3074 const InputInfo &Input = Inputs[0];
3075
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003076 // Don't warn about "clang -w -c foo.s"
3077 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003078 // and "clang -emit-llvm -c foo.s"
3079 Args.ClaimAllArgs(options::OPT_emit_llvm);
3080 // and "clang -use-gold-plugin -c foo.s"
3081 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003082
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003083 // Invoke ourselves in -cc1as mode.
3084 //
3085 // FIXME: Implement custom jobs for internal actions.
3086 CmdArgs.push_back("-cc1as");
3087
3088 // Add the "effective" target triple.
3089 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003090 std::string TripleStr =
3091 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003092 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3093
3094 // Set the output mode, we currently only expect to be used as a real
3095 // assembler.
3096 CmdArgs.push_back("-filetype");
3097 CmdArgs.push_back("obj");
3098
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003099 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003100 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003101
Jim Grosbach576452b2012-02-10 20:37:10 +00003102 // Add target specific cpu and features flags.
3103 switch(getToolChain().getTriple().getArch()) {
3104 default:
3105 break;
3106
3107 case llvm::Triple::arm:
3108 case llvm::Triple::thumb:
3109 AddARMTargetArgs(Args, CmdArgs);
3110 break;
3111 }
3112
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003113 // Ignore explicit -force_cpusubtype_ALL option.
3114 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003115
Eric Christopherfc3ee562012-01-10 00:38:01 +00003116 // Determine the original source input.
3117 const Action *SourceAction = &JA;
3118 while (SourceAction->getKind() != Action::InputClass) {
3119 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3120 SourceAction = SourceAction->getInputs()[0];
3121 }
3122
3123 // Forward -g, assuming we are dealing with an actual assembly file.
3124 if (SourceAction->getType() == types::TY_Asm ||
3125 SourceAction->getType() == types::TY_PP_Asm) {
3126 Args.ClaimAllArgs(options::OPT_g_Group);
3127 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3128 if (!A->getOption().matches(options::OPT_g0))
3129 CmdArgs.push_back("-g");
3130 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003131
3132 // Optionally embed the -cc1as level arguments into the debug info, for build
3133 // analysis.
3134 if (getToolChain().UseDwarfDebugFlags()) {
3135 ArgStringList OriginalArgs;
3136 for (ArgList::const_iterator it = Args.begin(),
3137 ie = Args.end(); it != ie; ++it)
3138 (*it)->render(Args, OriginalArgs);
3139
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003140 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003141 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3142 Flags += Exec;
3143 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3144 Flags += " ";
3145 Flags += OriginalArgs[i];
3146 }
3147 CmdArgs.push_back("-dwarf-debug-flags");
3148 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3149 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003150
3151 // FIXME: Add -static support, once we have it.
3152
3153 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3154 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003155 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003156
3157 assert(Output.isFilename() && "Unexpected lipo output.");
3158 CmdArgs.push_back("-o");
3159 CmdArgs.push_back(Output.getFilename());
3160
Daniel Dunbarb440f562010-08-02 02:38:21 +00003161 assert(Input.isFilename() && "Invalid input.");
3162 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003163
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003164 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003165 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003166}
3167
Daniel Dunbara3246a02009-03-18 08:07:30 +00003168void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003169 const InputInfo &Output,
3170 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003171 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003172 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003173 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003174 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003175
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003176 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003177 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003178 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003179 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003180 // Don't forward any -g arguments to assembly steps.
3181 if (isa<AssembleJobAction>(JA) &&
3182 A->getOption().matches(options::OPT_g_Group))
3183 continue;
3184
Daniel Dunbar2da02722009-03-19 07:55:12 +00003185 // It is unfortunate that we have to claim here, as this means
3186 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003187 // platforms using a generic gcc, even if we are just using gcc
3188 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003189 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003190 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003191 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003192 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003193
Daniel Dunbar4e295052010-01-25 22:35:08 +00003194 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003195
3196 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003197 llvm::Triple::ArchType Arch = getToolChain().getArch();
Bob Wilson6524dd32011-10-14 05:03:44 +00003198 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003199 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003200
3201 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003202 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003203 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003204 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003205 CmdArgs.push_back("ppc64");
3206 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003207 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003208 }
3209
Daniel Dunbar5716d872009-05-02 21:41:52 +00003210 // Try to force gcc to match the tool chain we want, if we recognize
3211 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003212 //
3213 // FIXME: The triple class should directly provide the information we want
3214 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003215 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003216 CmdArgs.push_back("-m32");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003217 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::x86_64)
Daniel Dunbar5716d872009-05-02 21:41:52 +00003218 CmdArgs.push_back("-m64");
3219
Daniel Dunbarb440f562010-08-02 02:38:21 +00003220 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003221 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003222 CmdArgs.push_back(Output.getFilename());
3223 } else {
3224 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003225 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003226 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003227
Tony Linthicum76329bf2011-12-12 21:14:55 +00003228 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3229 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003230
3231 // Only pass -x if gcc will understand it; otherwise hope gcc
3232 // understands the suffix correctly. The main use case this would go
3233 // wrong in is for linker inputs if they happened to have an odd
3234 // suffix; really the only way to get this to happen is a command
3235 // like '-x foobar a.c' which will treat a.c like a linker input.
3236 //
3237 // FIXME: For the linker case specifically, can we safely convert
3238 // inputs into '-Wl,' options?
3239 for (InputInfoList::const_iterator
3240 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3241 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003242
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003243 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003244 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3245 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003246 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003247 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003248 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003249 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003250 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003251
Daniel Dunbara3246a02009-03-18 08:07:30 +00003252 if (types::canTypeBeUserSpecified(II.getType())) {
3253 CmdArgs.push_back("-x");
3254 CmdArgs.push_back(types::getTypeName(II.getType()));
3255 }
3256
Daniel Dunbarb440f562010-08-02 02:38:21 +00003257 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003258 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003259 else {
3260 const Arg &A = II.getInputArg();
3261
3262 // Reverse translate some rewritten options.
3263 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3264 CmdArgs.push_back("-lstdc++");
3265 continue;
3266 }
3267
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003268 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003269 A.render(Args, CmdArgs);
3270 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003271 }
3272
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003273 const std::string customGCCName = D.getCCCGenericGCCName();
3274 const char *GCCName;
3275 if (!customGCCName.empty())
3276 GCCName = customGCCName.c_str();
3277 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003278 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003279 } else
3280 GCCName = "gcc";
3281
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003282 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003283 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003284 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003285}
3286
Daniel Dunbar4e295052010-01-25 22:35:08 +00003287void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3288 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003289 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003290}
3291
Daniel Dunbar4e295052010-01-25 22:35:08 +00003292void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3293 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003294 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003295}
3296
Daniel Dunbar4e295052010-01-25 22:35:08 +00003297void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3298 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003299 const Driver &D = getToolChain().getDriver();
3300
Daniel Dunbar4e295052010-01-25 22:35:08 +00003301 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003302 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3303 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003304 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003305 else {
3306 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003308 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003309
Daniel Dunbar4e295052010-01-25 22:35:08 +00003310 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003311 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003312}
3313
Daniel Dunbar4e295052010-01-25 22:35:08 +00003314void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3315 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003316 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003317}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003318
Daniel Dunbar4e295052010-01-25 22:35:08 +00003319void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3320 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003321 // The types are (hopefully) good enough.
3322}
3323
Tony Linthicum76329bf2011-12-12 21:14:55 +00003324// Hexagon tools start.
3325void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3326 ArgStringList &CmdArgs) const {
3327
3328}
3329void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3330 const InputInfo &Output,
3331 const InputInfoList &Inputs,
3332 const ArgList &Args,
3333 const char *LinkingOutput) const {
3334
3335 const Driver &D = getToolChain().getDriver();
3336 ArgStringList CmdArgs;
3337
3338 std::string MarchString = "-march=";
3339 MarchString += getHexagonTargetCPU(Args);
3340 CmdArgs.push_back(Args.MakeArgString(MarchString));
3341
3342 RenderExtraToolArgs(JA, CmdArgs);
3343
3344 if (Output.isFilename()) {
3345 CmdArgs.push_back("-o");
3346 CmdArgs.push_back(Output.getFilename());
3347 } else {
3348 assert(Output.isNothing() && "Unexpected output");
3349 CmdArgs.push_back("-fsyntax-only");
3350 }
3351
3352
3353 // Only pass -x if gcc will understand it; otherwise hope gcc
3354 // understands the suffix correctly. The main use case this would go
3355 // wrong in is for linker inputs if they happened to have an odd
3356 // suffix; really the only way to get this to happen is a command
3357 // like '-x foobar a.c' which will treat a.c like a linker input.
3358 //
3359 // FIXME: For the linker case specifically, can we safely convert
3360 // inputs into '-Wl,' options?
3361 for (InputInfoList::const_iterator
3362 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3363 const InputInfo &II = *it;
3364
3365 // Don't try to pass LLVM or AST inputs to a generic gcc.
3366 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3367 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3368 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3369 << getToolChain().getTripleString();
3370 else if (II.getType() == types::TY_AST)
3371 D.Diag(clang::diag::err_drv_no_ast_support)
3372 << getToolChain().getTripleString();
3373
3374 if (II.isFilename())
3375 CmdArgs.push_back(II.getFilename());
3376 else
3377 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3378 II.getInputArg().render(Args, CmdArgs);
3379 }
3380
3381 const char *GCCName = "hexagon-as";
3382 const char *Exec =
3383 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3384 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3385
3386}
3387void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3388 ArgStringList &CmdArgs) const {
3389 // The types are (hopefully) good enough.
3390}
3391
3392void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3393 const InputInfo &Output,
3394 const InputInfoList &Inputs,
3395 const ArgList &Args,
3396 const char *LinkingOutput) const {
3397
3398 const Driver &D = getToolChain().getDriver();
3399 ArgStringList CmdArgs;
3400
3401 for (ArgList::const_iterator
3402 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3403 Arg *A = *it;
3404 if (A->getOption().hasForwardToGCC()) {
3405 // Don't forward any -g arguments to assembly steps.
3406 if (isa<AssembleJobAction>(JA) &&
3407 A->getOption().matches(options::OPT_g_Group))
3408 continue;
3409
3410 // It is unfortunate that we have to claim here, as this means
3411 // we will basically never report anything interesting for
3412 // platforms using a generic gcc, even if we are just using gcc
3413 // to get to the assembler.
3414 A->claim();
3415 A->render(Args, CmdArgs);
3416 }
3417 }
3418
3419 RenderExtraToolArgs(JA, CmdArgs);
3420
3421 // Add Arch Information
3422 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003423 if ((A = getLastHexagonArchArg(Args))) {
3424 if (A->getOption().matches(options::OPT_m_Joined))
3425 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003426 else
Sebastian Pop86500282012-01-13 20:37:10 +00003427 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003428 }
Sebastian Pop86500282012-01-13 20:37:10 +00003429 else {
3430 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3431 }
3432
Tony Linthicum76329bf2011-12-12 21:14:55 +00003433 CmdArgs.push_back("-mqdsp6-compat");
3434
3435 const char *GCCName;
3436 if (C.getDriver().CCCIsCXX)
3437 GCCName = "hexagon-g++";
3438 else
3439 GCCName = "hexagon-gcc";
3440 const char *Exec =
3441 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3442
3443 if (Output.isFilename()) {
3444 CmdArgs.push_back("-o");
3445 CmdArgs.push_back(Output.getFilename());
3446 }
3447
3448 for (InputInfoList::const_iterator
3449 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3450 const InputInfo &II = *it;
3451
3452 // Don't try to pass LLVM or AST inputs to a generic gcc.
3453 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3454 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3455 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3456 << getToolChain().getTripleString();
3457 else if (II.getType() == types::TY_AST)
3458 D.Diag(clang::diag::err_drv_no_ast_support)
3459 << getToolChain().getTripleString();
3460
3461 if (II.isFilename())
3462 CmdArgs.push_back(II.getFilename());
3463 else
3464 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3465 II.getInputArg().render(Args, CmdArgs);
3466 }
3467 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3468
3469}
3470// Hexagon tools end.
3471
3472
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003473const char *darwin::CC1::getCC1Name(types::ID Type) const {
3474 switch (Type) {
3475 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003476 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003477 case types::TY_Asm:
3478 case types::TY_C: case types::TY_CHeader:
3479 case types::TY_PP_C: case types::TY_PP_CHeader:
3480 return "cc1";
3481 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003482 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3483 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003484 return "cc1obj";
3485 case types::TY_CXX: case types::TY_CXXHeader:
3486 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3487 return "cc1plus";
3488 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003489 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3490 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003491 return "cc1objplus";
3492 }
3493}
3494
David Blaikie68e081d2011-12-20 02:48:34 +00003495void darwin::CC1::anchor() {}
3496
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003497const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003498 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003499 return Args.MakeArgString(
3500 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003501}
3502
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003503const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003504 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003505 const char *Str = getBaseInputName(Args, Inputs);
3506
Chris Lattner906bb902011-01-16 08:14:11 +00003507 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003508 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003509
3510 return Str;
3511}
3512
3513const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003514darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003515 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003516 // FIXME: Think about this more.
3517 std::string Res;
3518
3519 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3520 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003521 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003522 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003523 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003524 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003525 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003526}
3527
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003528void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003529 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003530 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003531
3532 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003533 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003534
Bob Wilson7ecbd322012-02-07 01:17:55 +00003535 // Erase both -fmodule-cache-path and its argument.
3536 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3537 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003538 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003539 continue;
3540 }
3541
Bob Wilson7ecbd322012-02-07 01:17:55 +00003542 // Remove unsupported -f options.
3543 if (Option.startswith("-f")) {
3544 // Remove -f/-fno- to reduce the number of cases.
3545 if (Option.startswith("-fno-"))
3546 Option = Option.substr(5);
3547 else
3548 Option = Option.substr(2);
3549 RemoveOption = llvm::StringSwitch<bool>(Option)
3550 .Case("altivec", true)
3551 .Case("modules", true)
3552 .Case("diagnostics-show-note-include-stack", true)
3553 .Default(false);
3554 }
3555
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003556 // Handle machine specific options.
3557 if (Option.startswith("-m")) {
3558 RemoveOption = llvm::StringSwitch<bool>(Option)
3559 .Case("-mthumb", true)
3560 .Case("-mno-thumb", true)
3561 .Case("-mno-fused-madd", true)
3562 .Case("-mlong-branch", true)
3563 .Case("-mlongcall", true)
3564 .Case("-mcpu=G4", true)
3565 .Case("-mcpu=G5", true)
3566 .Default(false);
3567 }
3568
3569 // Handle warning options.
3570 if (Option.startswith("-W")) {
3571 // Remove -W/-Wno- to reduce the number of cases.
3572 if (Option.startswith("-Wno-"))
3573 Option = Option.substr(5);
3574 else
3575 Option = Option.substr(2);
3576
3577 RemoveOption = llvm::StringSwitch<bool>(Option)
3578 .Case("address-of-temporary", true)
3579 .Case("ambiguous-member-template", true)
3580 .Case("analyzer-incompatible-plugin", true)
3581 .Case("array-bounds", true)
3582 .Case("array-bounds-pointer-arithmetic", true)
3583 .Case("bind-to-temporary-copy", true)
3584 .Case("bitwise-op-parentheses", true)
3585 .Case("bool-conversions", true)
3586 .Case("builtin-macro-redefined", true)
3587 .Case("c++-hex-floats", true)
3588 .Case("c++0x-compat", true)
3589 .Case("c++0x-extensions", true)
3590 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003591 .Case("c++11-compat", true)
3592 .Case("c++11-extensions", true)
3593 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003594 .Case("conditional-uninitialized", true)
3595 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003596 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003597 .Case("CFString-literal", true)
3598 .Case("constant-logical-operand", true)
3599 .Case("custom-atomic-properties", true)
3600 .Case("default-arg-special-member", true)
3601 .Case("delegating-ctor-cycles", true)
3602 .Case("delete-non-virtual-dtor", true)
3603 .Case("deprecated-implementations", true)
3604 .Case("deprecated-writable-strings", true)
3605 .Case("distributed-object-modifiers", true)
3606 .Case("duplicate-method-arg", true)
3607 .Case("dynamic-class-memaccess", true)
3608 .Case("enum-compare", true)
3609 .Case("exit-time-destructors", true)
3610 .Case("gnu", true)
3611 .Case("gnu-designator", true)
3612 .Case("header-hygiene", true)
3613 .Case("idiomatic-parentheses", true)
3614 .Case("ignored-qualifiers", true)
3615 .Case("implicit-atomic-properties", true)
3616 .Case("incompatible-pointer-types", true)
3617 .Case("incomplete-implementation", true)
Ted Kremenekb4762412012-10-09 19:29:46 +00003618 .Case("int-conversion", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003619 .Case("initializer-overrides", true)
3620 .Case("invalid-noreturn", true)
3621 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003622 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003623 .Case("literal-conversion", true)
3624 .Case("literal-range", true)
3625 .Case("local-type-template-args", true)
3626 .Case("logical-op-parentheses", true)
3627 .Case("method-signatures", true)
3628 .Case("microsoft", true)
3629 .Case("mismatched-tags", true)
3630 .Case("missing-method-return-type", true)
3631 .Case("non-pod-varargs", true)
3632 .Case("nonfragile-abi2", true)
3633 .Case("null-arithmetic", true)
3634 .Case("null-dereference", true)
3635 .Case("out-of-line-declaration", true)
3636 .Case("overriding-method-mismatch", true)
3637 .Case("readonly-setter-attrs", true)
3638 .Case("return-stack-address", true)
3639 .Case("self-assign", true)
3640 .Case("semicolon-before-method-body", true)
3641 .Case("sentinel", true)
3642 .Case("shift-overflow", true)
3643 .Case("shift-sign-overflow", true)
3644 .Case("sign-conversion", true)
3645 .Case("sizeof-array-argument", true)
3646 .Case("sizeof-pointer-memaccess", true)
3647 .Case("string-compare", true)
3648 .Case("super-class-method-mismatch", true)
3649 .Case("tautological-compare", true)
3650 .Case("typedef-redefinition", true)
3651 .Case("typename-missing", true)
3652 .Case("undefined-reinterpret-cast", true)
3653 .Case("unknown-warning-option", true)
3654 .Case("unnamed-type-template-args", true)
3655 .Case("unneeded-internal-declaration", true)
3656 .Case("unneeded-member-function", true)
3657 .Case("unused-comparison", true)
3658 .Case("unused-exception-parameter", true)
3659 .Case("unused-member-function", true)
3660 .Case("unused-result", true)
3661 .Case("vector-conversions", true)
3662 .Case("vla", true)
3663 .Case("used-but-marked-unused", true)
3664 .Case("weak-vtables", true)
3665 .Default(false);
3666 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003667 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003668 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003669 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003670 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003671 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003672 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003673 }
3674}
3675
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003676void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003677 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003678 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003679
3680 CheckCodeGenerationOptions(D, Args);
3681
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003682 // Derived from cc1 spec.
Bob Wilson2afa0112012-09-29 23:52:58 +00003683 if ((!Args.hasArg(options::OPT_mkernel) ||
3684 (getDarwinToolChain().isTargetIPhoneOS() &&
3685 !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
3686 !Args.hasArg(options::OPT_static) &&
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003687 !Args.hasArg(options::OPT_mdynamic_no_pic))
3688 CmdArgs.push_back("-fPIC");
3689
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003690 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3691 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3692 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3693 CmdArgs.push_back("-fno-builtin-strcat");
3694 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3695 CmdArgs.push_back("-fno-builtin-strcpy");
3696 }
3697
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003698 if (Args.hasArg(options::OPT_g_Flag) &&
3699 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3700 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3701}
3702
3703void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3704 const InputInfoList &Inputs,
3705 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003706 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003707
3708 // Derived from cc1_options spec.
3709 if (Args.hasArg(options::OPT_fast) ||
3710 Args.hasArg(options::OPT_fastf) ||
3711 Args.hasArg(options::OPT_fastcp))
3712 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003713
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003714 if (Arg *A = Args.getLastArg(options::OPT_pg))
3715 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003716 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003717 << A->getAsString(Args) << "-fomit-frame-pointer";
3718
3719 AddCC1Args(Args, CmdArgs);
3720
3721 if (!Args.hasArg(options::OPT_Q))
3722 CmdArgs.push_back("-quiet");
3723
3724 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003725 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003726
3727 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3728
3729 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3730 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3731
3732 // FIXME: The goal is to use the user provided -o if that is our
3733 // final output, otherwise to drive from the original input
3734 // name. Find a clean way to go about this.
3735 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3736 Args.hasArg(options::OPT_o)) {
3737 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3738 CmdArgs.push_back("-auxbase-strip");
3739 CmdArgs.push_back(OutputOpt->getValue(Args));
3740 } else {
3741 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003742 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003743 }
3744
3745 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3746
3747 Args.AddAllArgs(CmdArgs, options::OPT_O);
3748 // FIXME: -Wall is getting some special treatment. Investigate.
3749 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3750 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003751 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003752 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003753 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3754 // Honor -std-default.
3755 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3756 "-std=", /*Joined=*/true);
3757 }
3758
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003759 if (Args.hasArg(options::OPT_v))
3760 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003761 if (Args.hasArg(options::OPT_pg) &&
3762 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003763 CmdArgs.push_back("-p");
3764 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003765
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003766 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003767 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3768 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3769 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3770 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3771 //
3772 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003773 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3774 options::OPT_fsyntax_only),
3775 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003776 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3777 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3778 (*it)->claim();
3779 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003780 }
3781 }
3782 } else
3783 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003784
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003785 // Claim Clang only -f options, they aren't worth warning about.
3786 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3787
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003788 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3789 if (Args.hasArg(options::OPT_Qn))
3790 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003791
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003792 // FIXME: This isn't correct.
3793 //Args.AddLastArg(CmdArgs, options::OPT__help)
3794 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3795
3796 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3797
3798 // FIXME: Still don't get what is happening here. Investigate.
3799 Args.AddAllArgs(CmdArgs, options::OPT__param);
3800
3801 if (Args.hasArg(options::OPT_fmudflap) ||
3802 Args.hasArg(options::OPT_fmudflapth)) {
3803 CmdArgs.push_back("-fno-builtin");
3804 CmdArgs.push_back("-fno-merge-constants");
3805 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003806
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003807 if (Args.hasArg(options::OPT_coverage)) {
3808 CmdArgs.push_back("-fprofile-arcs");
3809 CmdArgs.push_back("-ftest-coverage");
3810 }
3811
3812 if (types::isCXX(Inputs[0].getType()))
3813 CmdArgs.push_back("-D__private_extern__=extern");
3814}
3815
3816void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3817 const InputInfoList &Inputs,
3818 const ArgStringList &OutputArgs) const {
3819 // Derived from cpp_options
3820 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003821
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003822 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3823
3824 AddCC1Args(Args, CmdArgs);
3825
3826 // NOTE: The code below has some commonality with cpp_options, but
3827 // in classic gcc style ends up sending things in different
3828 // orders. This may be a good merge candidate once we drop pedantic
3829 // compatibility.
3830
3831 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003832 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003833 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003834 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3835 // Honor -std-default.
3836 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3837 "-std=", /*Joined=*/true);
3838 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003839 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3840 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003841
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003842 // The driver treats -fsyntax-only specially.
3843 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3844
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003845 // Claim Clang only -f options, they aren't worth warning about.
3846 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3847
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003848 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3849 !Args.hasArg(options::OPT_fno_working_directory))
3850 CmdArgs.push_back("-fworking-directory");
3851
3852 Args.AddAllArgs(CmdArgs, options::OPT_O);
3853 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3854 if (Args.hasArg(options::OPT_save_temps))
3855 CmdArgs.push_back("-fpch-preprocess");
3856}
3857
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003858void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003859 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003860 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003861 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003862
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003863 CheckPreprocessingOptions(D, Args);
3864
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003865 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003866 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3867 Args.AddLastArg(CmdArgs, options::OPT_C);
3868 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003869 if (!Args.hasArg(options::OPT_Q))
3870 CmdArgs.push_back("-quiet");
3871 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003872 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003873 Args.AddLastArg(CmdArgs, options::OPT_v);
3874 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3875 Args.AddLastArg(CmdArgs, options::OPT_P);
3876
3877 // FIXME: Handle %I properly.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00003878 if (getToolChain().getArch() == llvm::Triple::x86_64) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003879 CmdArgs.push_back("-imultilib");
3880 CmdArgs.push_back("x86_64");
3881 }
3882
3883 if (Args.hasArg(options::OPT_MD)) {
3884 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003885 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003886 }
3887
3888 if (Args.hasArg(options::OPT_MMD)) {
3889 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003890 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003891 }
3892
3893 Args.AddLastArg(CmdArgs, options::OPT_M);
3894 Args.AddLastArg(CmdArgs, options::OPT_MM);
3895 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3896 Args.AddLastArg(CmdArgs, options::OPT_MG);
3897 Args.AddLastArg(CmdArgs, options::OPT_MP);
3898 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3899 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3900 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3901 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3902 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3903 CmdArgs.push_back("-MQ");
3904 CmdArgs.push_back(OutputOpt->getValue(Args));
3905 }
3906 }
3907
3908 Args.AddLastArg(CmdArgs, options::OPT_remap);
3909 if (Args.hasArg(options::OPT_g3))
3910 CmdArgs.push_back("-dD");
3911 Args.AddLastArg(CmdArgs, options::OPT_H);
3912
3913 AddCPPArgs(Args, CmdArgs);
3914
3915 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3916 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3917
3918 for (InputInfoList::const_iterator
3919 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3920 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003921
Daniel Dunbarb440f562010-08-02 02:38:21 +00003922 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003923 }
3924
3925 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3926 options::OPT_Xpreprocessor);
3927
3928 if (Args.hasArg(options::OPT_fmudflap)) {
3929 CmdArgs.push_back("-D_MUDFLAP");
3930 CmdArgs.push_back("-include");
3931 CmdArgs.push_back("mf-runtime.h");
3932 }
3933
3934 if (Args.hasArg(options::OPT_fmudflapth)) {
3935 CmdArgs.push_back("-D_MUDFLAP");
3936 CmdArgs.push_back("-D_MUDFLAPTH");
3937 CmdArgs.push_back("-include");
3938 CmdArgs.push_back("mf-runtime.h");
3939 }
3940}
3941
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003942void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003943 ArgStringList &CmdArgs) const {
3944 // Derived from cpp spec.
3945
3946 if (Args.hasArg(options::OPT_static)) {
3947 // The gcc spec is broken here, it refers to dynamic but
3948 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003949
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003950 // if (!Args.hasArg(arglist.parser.dynamicOption))
3951 CmdArgs.push_back("-D__STATIC__");
3952 } else
3953 CmdArgs.push_back("-D__DYNAMIC__");
3954
3955 if (Args.hasArg(options::OPT_pthread))
3956 CmdArgs.push_back("-D_REENTRANT");
3957}
3958
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003959void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003960 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003961 const InputInfoList &Inputs,
3962 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003963 const char *LinkingOutput) const {
3964 ArgStringList CmdArgs;
3965
3966 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3967
3968 CmdArgs.push_back("-E");
3969
3970 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003971 Args.hasArg(options::OPT_traditional_cpp))
3972 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003973
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003974 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003975 assert(Output.isFilename() && "Unexpected CC1 output.");
3976 OutputArgs.push_back("-o");
3977 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003978
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003979 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003980 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3981 } else {
3982 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3983 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3984 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003985
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003986 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3987
Chad Rosierc31e48d2011-09-08 00:38:00 +00003988 RemoveCC1UnsupportedArgs(CmdArgs);
3989
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003990 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003991 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003992 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003993 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003994}
3995
3996void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003997 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003998 const InputInfoList &Inputs,
3999 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004000 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004001 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004002 ArgStringList CmdArgs;
4003
4004 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
4005
Bob Wilson0090df22012-04-01 23:03:29 +00004006 // Silence warning about unused --serialize-diagnostics
4007 Args.ClaimAllArgs(options::OPT__serialize_diags);
4008
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004009 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00004010 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004011 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004012 << A->getAsString(Args) << "-E";
4013
Daniel Dunbar24e52992010-06-07 23:28:45 +00004014 if (JA.getType() == types::TY_LLVM_IR ||
4015 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004016 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00004017 else if (JA.getType() == types::TY_LLVM_BC ||
4018 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004019 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004020 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004021 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004022 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004023 else if (JA.getType() != types::TY_PP_Asm &&
4024 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004025 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004026 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004027
4028 ArgStringList OutputArgs;
4029 if (Output.getType() != types::TY_PCH) {
4030 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004031 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004032 OutputArgs.push_back("/dev/null");
4033 else
4034 OutputArgs.push_back(Output.getFilename());
4035 }
4036
4037 // There is no need for this level of compatibility, but it makes
4038 // diffing easier.
4039 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4040 Args.hasArg(options::OPT_S));
4041
4042 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004043 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004044 if (OutputArgsEarly) {
4045 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4046 } else {
4047 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4048 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4049 }
4050 } else {
4051 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004052
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004053 for (InputInfoList::const_iterator
4054 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4055 const InputInfo &II = *it;
4056
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004057 // Reject AST inputs.
4058 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004059 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004060 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004061 return;
4062 }
4063
Daniel Dunbarb440f562010-08-02 02:38:21 +00004064 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004065 }
4066
4067 if (OutputArgsEarly) {
4068 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4069 } else {
4070 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4071 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4072 }
4073 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004074
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004075 if (Output.getType() == types::TY_PCH) {
4076 assert(Output.isFilename() && "Invalid PCH output.");
4077
4078 CmdArgs.push_back("-o");
4079 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4080 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004081 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004082 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004083 C.addTempFile(TmpPath);
4084 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004085
Eric Christopher84fbdb42011-08-19 00:30:14 +00004086 // If we're emitting a pch file with the last 4 characters of ".pth"
4087 // and falling back to llvm-gcc we want to use ".gch" instead.
4088 std::string OutputFile(Output.getFilename());
4089 size_t loc = OutputFile.rfind(".pth");
4090 if (loc != std::string::npos)
4091 OutputFile.replace(loc, 4, ".gch");
4092 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4093 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004094 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004095
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004096 RemoveCC1UnsupportedArgs(CmdArgs);
4097
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004098 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004099 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004100 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004101 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004102}
4103
Daniel Dunbarbe220842009-03-20 16:06:39 +00004104void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004105 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004106 const InputInfoList &Inputs,
4107 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004108 const char *LinkingOutput) const {
4109 ArgStringList CmdArgs;
4110
4111 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4112 const InputInfo &Input = Inputs[0];
4113
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004114 // Determine the original source input.
4115 const Action *SourceAction = &JA;
4116 while (SourceAction->getKind() != Action::InputClass) {
4117 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4118 SourceAction = SourceAction->getInputs()[0];
4119 }
4120
4121 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004122 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004123 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004124 if (Args.hasArg(options::OPT_gstabs))
4125 CmdArgs.push_back("--gstabs");
4126 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004127 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004128 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004129
Daniel Dunbarbe220842009-03-20 16:06:39 +00004130 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004131 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004132
Daniel Dunbar6d484762010-07-22 01:47:22 +00004133 // Use -force_cpusubtype_ALL on x86 by default.
4134 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4135 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004136 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4137 CmdArgs.push_back("-force_cpusubtype_ALL");
4138
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004139 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
Bob Wilson2afa0112012-09-29 23:52:58 +00004140 (((Args.hasArg(options::OPT_mkernel) ||
4141 Args.hasArg(options::OPT_fapple_kext)) &&
4142 (!getDarwinToolChain().isTargetIPhoneOS() ||
4143 getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) ||
4144 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004145 CmdArgs.push_back("-static");
4146
Daniel Dunbarbe220842009-03-20 16:06:39 +00004147 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4148 options::OPT_Xassembler);
4149
4150 assert(Output.isFilename() && "Unexpected lipo output.");
4151 CmdArgs.push_back("-o");
4152 CmdArgs.push_back(Output.getFilename());
4153
Daniel Dunbarb440f562010-08-02 02:38:21 +00004154 assert(Input.isFilename() && "Invalid input.");
4155 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004156
4157 // asm_final spec is empty.
4158
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004159 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004160 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004161 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004162}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004163
David Blaikie68e081d2011-12-20 02:48:34 +00004164void darwin::DarwinTool::anchor() {}
4165
Daniel Dunbare9ded432009-09-09 18:36:20 +00004166void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4167 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004168 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004169
Daniel Dunbarc1964212009-03-26 16:23:12 +00004170 // Derived from darwin_arch spec.
4171 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004172 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004173
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004174 // FIXME: Is this needed anymore?
4175 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004176 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004177}
4178
Bill Wendling3b2000f2012-10-02 18:02:50 +00004179bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
4180 // We only need to generate a temp path for LTO if we aren't compiling object
4181 // files. When compiling source files, we run 'dsymutil' after linking. We
4182 // don't run 'dsymutil' when compiling object files.
4183 for (InputInfoList::const_iterator
4184 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it)
4185 if (it->getType() != types::TY_Object)
4186 return true;
4187
4188 return false;
4189}
4190
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004191void darwin::Link::AddLinkArgs(Compilation &C,
4192 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00004193 ArgStringList &CmdArgs,
4194 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004195 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004196 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004197
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004198 unsigned Version[3] = { 0, 0, 0 };
4199 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4200 bool HadExtra;
4201 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4202 Version[1], Version[2], HadExtra) ||
4203 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004204 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004205 << A->getAsString(Args);
4206 }
4207
4208 // Newer linkers support -demangle, pass it if supported and not disabled by
4209 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004210 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004211 // Don't pass -demangle to ld_classic.
4212 //
4213 // FIXME: This is a temporary workaround, ld should be handling this.
4214 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4215 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004216 if (getToolChain().getArch() == llvm::Triple::x86) {
4217 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4218 options::OPT_Wl_COMMA),
4219 ie = Args.filtered_end(); it != ie; ++it) {
4220 const Arg *A = *it;
4221 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004222 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004223 UsesLdClassic = true;
4224 }
4225 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004226 if (!UsesLdClassic)
4227 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004228 }
4229
Daniel Dunbaref889c72011-06-21 20:55:11 +00004230 // If we are using LTO, then automatically create a temporary file path for
4231 // the linker to use, so that it's lifetime will extend past a possible
4232 // dsymutil step.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004233 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004234 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004235 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004236 C.addTempFile(TmpPath);
4237 CmdArgs.push_back("-object_path_lto");
4238 CmdArgs.push_back(TmpPath);
4239 }
4240
Daniel Dunbarc1964212009-03-26 16:23:12 +00004241 // Derived from the "link" spec.
4242 Args.AddAllArgs(CmdArgs, options::OPT_static);
4243 if (!Args.hasArg(options::OPT_static))
4244 CmdArgs.push_back("-dynamic");
4245 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4246 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4247 // here. How do we wish to handle such things?
4248 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004249
Daniel Dunbarc1964212009-03-26 16:23:12 +00004250 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004251 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004252 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004253 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004254
4255 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4256 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4257 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4258
4259 Arg *A;
4260 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4261 (A = Args.getLastArg(options::OPT_current__version)) ||
4262 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004263 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004264 << A->getAsString(Args) << "-dynamiclib";
4265
4266 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4267 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4268 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4269 } else {
4270 CmdArgs.push_back("-dylib");
4271
4272 Arg *A;
4273 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4274 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4275 (A = Args.getLastArg(options::OPT_client__name)) ||
4276 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4277 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4278 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004279 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004280 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004281
Daniel Dunbarc1964212009-03-26 16:23:12 +00004282 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4283 "-dylib_compatibility_version");
4284 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4285 "-dylib_current_version");
4286
Daniel Dunbara48823f2010-01-22 02:04:52 +00004287 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004288
4289 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4290 "-dylib_install_name");
4291 }
4292
4293 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4294 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4295 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004296 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004297 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004298 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4299 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4300 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4301 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4302 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4303 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004304 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004305 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4306 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4307 Args.AddAllArgs(CmdArgs, options::OPT_init);
4308
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004309 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004310 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004311
4312 // If we had an explicit -mios-simulator-version-min argument, honor that,
4313 // otherwise use the traditional deployment targets. We can't just check the
4314 // is-sim attribute because existing code follows this path, and the linker
4315 // may not handle the argument.
4316 //
4317 // FIXME: We may be able to remove this, once we can verify no one depends on
4318 // it.
4319 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4320 CmdArgs.push_back("-ios_simulator_version_min");
4321 else if (DarwinTC.isTargetIPhoneOS())
4322 CmdArgs.push_back("-iphoneos_version_min");
4323 else
4324 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004325 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004326
Daniel Dunbarc1964212009-03-26 16:23:12 +00004327 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4328 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4329 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4330 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4331 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004332
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004333 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4334 options::OPT_fno_pie,
4335 options::OPT_fno_PIE)) {
4336 if (A->getOption().matches(options::OPT_fpie) ||
4337 A->getOption().matches(options::OPT_fPIE))
4338 CmdArgs.push_back("-pie");
4339 else
4340 CmdArgs.push_back("-no_pie");
4341 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004342
4343 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4344 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4345 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4346 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4347 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4348 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4349 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4350 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4351 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4352 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4353 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4354 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4355 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4356 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4357 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4358 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004359
Daniel Dunbar84384642011-05-02 21:03:47 +00004360 // Give --sysroot= preference, over the Apple specific behavior to also use
4361 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004362 StringRef sysroot = C.getSysRoot();
4363 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004364 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004365 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004366 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4367 CmdArgs.push_back("-syslibroot");
4368 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004369 }
4370
Daniel Dunbarc1964212009-03-26 16:23:12 +00004371 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4372 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4373 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4374 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4375 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004376 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004377 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4378 Args.AddAllArgs(CmdArgs, options::OPT_y);
4379 Args.AddLastArg(CmdArgs, options::OPT_w);
4380 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4381 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4382 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4383 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4384 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4385 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4386 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4387 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4388 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4389 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4390 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4391 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4392}
4393
4394void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004395 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004396 const InputInfoList &Inputs,
4397 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004398 const char *LinkingOutput) const {
4399 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004400
Daniel Dunbarc1964212009-03-26 16:23:12 +00004401 // The logic here is derived from gcc's behavior; most of which
4402 // comes from specs (starting with link_command). Consult gcc for
4403 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004404 ArgStringList CmdArgs;
4405
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004406 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4407 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4408 options::OPT_ccc_arcmt_migrate)) {
4409 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4410 (*I)->claim();
4411 const char *Exec =
4412 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4413 CmdArgs.push_back(Output.getFilename());
4414 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4415 return;
4416 }
4417
Daniel Dunbarc1964212009-03-26 16:23:12 +00004418 // I'm not sure why this particular decomposition exists in gcc, but
4419 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00004420 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004421
Daniel Dunbarc1964212009-03-26 16:23:12 +00004422 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4423 Args.AddAllArgs(CmdArgs, options::OPT_s);
4424 Args.AddAllArgs(CmdArgs, options::OPT_t);
4425 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4426 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004427 Args.AddLastArg(CmdArgs, options::OPT_e);
4428 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4429 Args.AddAllArgs(CmdArgs, options::OPT_r);
4430
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004431 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4432 // members of static archive libraries which implement Objective-C classes or
4433 // categories.
4434 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4435 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004436
Daniel Dunbarc1964212009-03-26 16:23:12 +00004437 CmdArgs.push_back("-o");
4438 CmdArgs.push_back(Output.getFilename());
4439
Chad Rosier06fd3c62012-05-16 23:45:12 +00004440 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004441 !Args.hasArg(options::OPT_nostartfiles)) {
4442 // Derived from startfile spec.
4443 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004444 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004445 if (getDarwinToolChain().isTargetIOSSimulator()) {
4446 // The simulator doesn't have a versioned crt1 file.
4447 CmdArgs.push_back("-ldylib1.o");
4448 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004449 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4450 CmdArgs.push_back("-ldylib1.o");
4451 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004452 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004453 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004454 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004455 CmdArgs.push_back("-ldylib1.10.5.o");
4456 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004457 } else {
4458 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004459 if (!Args.hasArg(options::OPT_static)) {
4460 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004461 if (getDarwinToolChain().isTargetIOSSimulator()) {
4462 // The simulator doesn't have a versioned crt1 file.
4463 CmdArgs.push_back("-lbundle1.o");
4464 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004465 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4466 CmdArgs.push_back("-lbundle1.o");
4467 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004468 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004469 CmdArgs.push_back("-lbundle1.o");
4470 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004471 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004472 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004473 if (Args.hasArg(options::OPT_pg) &&
4474 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004475 if (Args.hasArg(options::OPT_static) ||
4476 Args.hasArg(options::OPT_object) ||
4477 Args.hasArg(options::OPT_preload)) {
4478 CmdArgs.push_back("-lgcrt0.o");
4479 } else {
4480 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004481
Daniel Dunbarc1964212009-03-26 16:23:12 +00004482 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004483 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004484 // By default on OS X 10.8 and later, we don't link with a crt1.o
4485 // file and the linker knows to use _main as the entry point. But,
4486 // when compiling with -pg, we need to link with the gcrt1.o file,
4487 // so pass the -no_new_main option to tell the linker to use the
4488 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004489 if (getDarwinToolChain().isTargetMacOS() &&
4490 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4491 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004492 } else {
4493 if (Args.hasArg(options::OPT_static) ||
4494 Args.hasArg(options::OPT_object) ||
4495 Args.hasArg(options::OPT_preload)) {
4496 CmdArgs.push_back("-lcrt0.o");
4497 } else {
4498 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004499 if (getDarwinToolChain().isTargetIOSSimulator()) {
4500 // The simulator doesn't have a versioned crt1 file.
4501 CmdArgs.push_back("-lcrt1.o");
4502 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004503 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4504 CmdArgs.push_back("-lcrt1.o");
Bob Wilson2afa0112012-09-29 23:52:58 +00004505 else if (getDarwinToolChain().isIPhoneOSVersionLT(6, 0))
Daniel Dunbar83608032010-01-27 00:56:56 +00004506 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004507 } else {
4508 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4509 CmdArgs.push_back("-lcrt1.o");
4510 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4511 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004512 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004513 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004514
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004515 // darwin_crt2 spec is empty.
4516 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004517 }
4518 }
4519 }
4520 }
4521
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004522 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4523 Args.hasArg(options::OPT_shared_libgcc) &&
4524 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004525 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004526 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004527 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004528 }
4529 }
4530
4531 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004532
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004533 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4534 // symbols may appear. Mark all of them as dynamic_lookup.
4535 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4536 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4537 options::OPT_fno_address_sanitizer, false)) {
4538 if (Args.hasArg(options::OPT_dynamiclib) ||
4539 Args.hasArg(options::OPT_bundle)) {
4540 CmdArgs.push_back("-undefined");
4541 CmdArgs.push_back("dynamic_lookup");
4542 }
4543 }
4544
Daniel Dunbarc1964212009-03-26 16:23:12 +00004545 if (Args.hasArg(options::OPT_fopenmp))
4546 // This is more complicated in gcc...
4547 CmdArgs.push_back("-lgomp");
4548
Douglas Gregor9295df02012-05-15 21:00:27 +00004549 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4550
Bob Wilson16d93952012-05-15 18:57:39 +00004551 if (isObjCRuntimeLinked(Args) &&
4552 !Args.hasArg(options::OPT_nostdlib) &&
4553 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004554 // Avoid linking compatibility stubs on i386 mac.
4555 if (!getDarwinToolChain().isTargetMacOS() ||
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004556 getDarwinToolChain().getArch() != llvm::Triple::x86) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004557 // If we don't have ARC or subscripting runtime support, link in the
4558 // runtime stubs. We have to do this *before* adding any of the normal
4559 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004560 ObjCRuntime runtime =
4561 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004562 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004563 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004564 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004565 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004566 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004567 CmdArgs.push_back("-framework");
4568 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004569 // Link libobj.
4570 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004571 }
John McCall31168b02011-06-15 23:02:42 +00004572
Daniel Dunbarc1964212009-03-26 16:23:12 +00004573 if (LinkingOutput) {
4574 CmdArgs.push_back("-arch_multiple");
4575 CmdArgs.push_back("-final_output");
4576 CmdArgs.push_back(LinkingOutput);
4577 }
4578
Daniel Dunbarc1964212009-03-26 16:23:12 +00004579 if (Args.hasArg(options::OPT_fnested_functions))
4580 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004581
Daniel Dunbarc1964212009-03-26 16:23:12 +00004582 if (!Args.hasArg(options::OPT_nostdlib) &&
4583 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004584 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004585 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004586
Daniel Dunbarc1964212009-03-26 16:23:12 +00004587 // link_ssp spec is empty.
4588
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004589 // Let the tool chain choose which runtime library to link.
4590 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004591 }
4592
Chad Rosier06fd3c62012-05-16 23:45:12 +00004593 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004594 !Args.hasArg(options::OPT_nostartfiles)) {
4595 // endfile_spec is empty.
4596 }
4597
4598 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4599 Args.AddAllArgs(CmdArgs, options::OPT_F);
4600
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004601 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004602 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004603 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004604}
4605
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004606void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004607 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004608 const InputInfoList &Inputs,
4609 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004610 const char *LinkingOutput) const {
4611 ArgStringList CmdArgs;
4612
4613 CmdArgs.push_back("-create");
4614 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004615
4616 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004617 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004618
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004619 for (InputInfoList::const_iterator
4620 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4621 const InputInfo &II = *it;
4622 assert(II.isFilename() && "Unexpected lipo input.");
4623 CmdArgs.push_back(II.getFilename());
4624 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004625 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004626 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004627 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004628}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004629
Daniel Dunbar88299622010-06-04 18:28:36 +00004630void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004631 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004632 const InputInfoList &Inputs,
4633 const ArgList &Args,
4634 const char *LinkingOutput) const {
4635 ArgStringList CmdArgs;
4636
Daniel Dunbareb86b042011-05-09 17:23:16 +00004637 CmdArgs.push_back("-o");
4638 CmdArgs.push_back(Output.getFilename());
4639
Daniel Dunbar88299622010-06-04 18:28:36 +00004640 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4641 const InputInfo &Input = Inputs[0];
4642 assert(Input.isFilename() && "Unexpected dsymutil input.");
4643 CmdArgs.push_back(Input.getFilename());
4644
Daniel Dunbar88299622010-06-04 18:28:36 +00004645 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004646 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004647 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004648}
4649
Eric Christopher551ef452011-08-23 17:56:55 +00004650void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4651 const InputInfo &Output,
4652 const InputInfoList &Inputs,
4653 const ArgList &Args,
4654 const char *LinkingOutput) const {
4655 ArgStringList CmdArgs;
4656 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004657 CmdArgs.push_back("--debug-info");
4658 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004659 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004660
4661 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4662 const InputInfo &Input = Inputs[0];
4663 assert(Input.isFilename() && "Unexpected verify input");
4664
4665 // Grabbing the output of the earlier dsymutil run.
4666 CmdArgs.push_back(Input.getFilename());
4667
4668 const char *Exec =
4669 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4670 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4671}
4672
David Chisnallf571cde2012-02-15 13:39:01 +00004673void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4674 const InputInfo &Output,
4675 const InputInfoList &Inputs,
4676 const ArgList &Args,
4677 const char *LinkingOutput) const {
4678 ArgStringList CmdArgs;
4679
4680 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4681 options::OPT_Xassembler);
4682
4683 CmdArgs.push_back("-o");
4684 CmdArgs.push_back(Output.getFilename());
4685
4686 for (InputInfoList::const_iterator
4687 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4688 const InputInfo &II = *it;
4689 CmdArgs.push_back(II.getFilename());
4690 }
4691
4692 const char *Exec =
4693 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4694 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4695}
4696
4697
4698void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4699 const InputInfo &Output,
4700 const InputInfoList &Inputs,
4701 const ArgList &Args,
4702 const char *LinkingOutput) const {
4703 // FIXME: Find a real GCC, don't hard-code versions here
4704 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4705 const llvm::Triple &T = getToolChain().getTriple();
4706 std::string LibPath = "/usr/lib/";
4707 llvm::Triple::ArchType Arch = T.getArch();
4708 switch (Arch) {
4709 case llvm::Triple::x86:
4710 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4711 T.getOSName()).str() + "/4.5.2/";
4712 break;
4713 case llvm::Triple::x86_64:
4714 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4715 T.getOSName()).str();
4716 GCCLibPath += "/4.5.2/amd64/";
4717 LibPath += "amd64/";
4718 break;
4719 default:
4720 assert(0 && "Unsupported architecture");
4721 }
4722
4723 ArgStringList CmdArgs;
4724
David Chisnall272a0712012-02-29 15:06:12 +00004725 // Demangle C++ names in errors
4726 CmdArgs.push_back("-C");
4727
David Chisnallf571cde2012-02-15 13:39:01 +00004728 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4729 (!Args.hasArg(options::OPT_shared))) {
4730 CmdArgs.push_back("-e");
4731 CmdArgs.push_back("_start");
4732 }
4733
4734 if (Args.hasArg(options::OPT_static)) {
4735 CmdArgs.push_back("-Bstatic");
4736 CmdArgs.push_back("-dn");
4737 } else {
4738 CmdArgs.push_back("-Bdynamic");
4739 if (Args.hasArg(options::OPT_shared)) {
4740 CmdArgs.push_back("-shared");
4741 } else {
4742 CmdArgs.push_back("--dynamic-linker");
4743 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4744 }
4745 }
4746
4747 if (Output.isFilename()) {
4748 CmdArgs.push_back("-o");
4749 CmdArgs.push_back(Output.getFilename());
4750 } else {
4751 assert(Output.isNothing() && "Invalid output.");
4752 }
4753
4754 if (!Args.hasArg(options::OPT_nostdlib) &&
4755 !Args.hasArg(options::OPT_nostartfiles)) {
4756 if (!Args.hasArg(options::OPT_shared)) {
4757 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4758 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004759 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004760 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4761 } else {
4762 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004763 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4764 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004765 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004766 if (getToolChain().getDriver().CCCIsCXX)
4767 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004768 }
4769
4770 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4771
4772 Args.AddAllArgs(CmdArgs, options::OPT_L);
4773 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4774 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004775 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004776
4777 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4778
4779 if (!Args.hasArg(options::OPT_nostdlib) &&
4780 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004781 if (getToolChain().getDriver().CCCIsCXX)
4782 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004783 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004784 if (!Args.hasArg(options::OPT_shared)) {
4785 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004786 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004787 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004788 }
David Chisnallf571cde2012-02-15 13:39:01 +00004789 }
4790
4791 if (!Args.hasArg(options::OPT_nostdlib) &&
4792 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004793 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004794 }
David Chisnall96de9932012-02-16 16:00:47 +00004795 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004796
4797 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4798
4799 const char *Exec =
4800 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4801 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4802}
4803
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004804void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004805 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004806 const InputInfoList &Inputs,
4807 const ArgList &Args,
4808 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004809 ArgStringList CmdArgs;
4810
4811 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4812 options::OPT_Xassembler);
4813
4814 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004815 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004816
4817 for (InputInfoList::const_iterator
4818 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4819 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004820 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004821 }
4822
4823 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004824 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004825 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004826}
4827
4828void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004829 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004830 const InputInfoList &Inputs,
4831 const ArgList &Args,
4832 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004833 ArgStringList CmdArgs;
4834
4835 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004836 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004837 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004838 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004839 }
4840
4841 if (Args.hasArg(options::OPT_static)) {
4842 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004843 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004844 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004845// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004846 CmdArgs.push_back("-Bdynamic");
4847 if (Args.hasArg(options::OPT_shared)) {
4848 CmdArgs.push_back("-shared");
4849 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004850 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004851 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4852 }
4853 }
4854
Daniel Dunbarb440f562010-08-02 02:38:21 +00004855 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004856 CmdArgs.push_back("-o");
4857 CmdArgs.push_back(Output.getFilename());
4858 } else {
4859 assert(Output.isNothing() && "Invalid output.");
4860 }
4861
4862 if (!Args.hasArg(options::OPT_nostdlib) &&
4863 !Args.hasArg(options::OPT_nostartfiles)) {
4864 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004865 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004866 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004867 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004868 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004869 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004870 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004871 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004872 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004873 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004874 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004875 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004876 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004877 }
4878
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004879 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4880 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004881 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004882
4883 Args.AddAllArgs(CmdArgs, options::OPT_L);
4884 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4885 Args.AddAllArgs(CmdArgs, options::OPT_e);
4886
Daniel Dunbar54423b22010-09-17 00:24:54 +00004887 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004888
4889 if (!Args.hasArg(options::OPT_nostdlib) &&
4890 !Args.hasArg(options::OPT_nodefaultlibs)) {
4891 // FIXME: For some reason GCC passes -lgcc before adding
4892 // the default system libraries. Just mimic this for now.
4893 CmdArgs.push_back("-lgcc");
4894
4895 if (Args.hasArg(options::OPT_pthread))
4896 CmdArgs.push_back("-pthread");
4897 if (!Args.hasArg(options::OPT_shared))
4898 CmdArgs.push_back("-lc");
4899 CmdArgs.push_back("-lgcc");
4900 }
4901
4902 if (!Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nostartfiles)) {
4904 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004905 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004906 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004907 }
4908
Bill Wendling08760582011-06-27 19:15:03 +00004909 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004910
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004911 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004912 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004913 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004914}
4915
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004916void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004917 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004918 const InputInfoList &Inputs,
4919 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004920 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004921 ArgStringList CmdArgs;
4922
4923 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4924 options::OPT_Xassembler);
4925
4926 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004927 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004928
4929 for (InputInfoList::const_iterator
4930 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4931 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004932 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004933 }
4934
4935 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004936 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004937 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004938}
4939
4940void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004941 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004942 const InputInfoList &Inputs,
4943 const ArgList &Args,
4944 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004945 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004946 ArgStringList CmdArgs;
4947
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004948 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004949 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004950 CmdArgs.push_back("-e");
4951 CmdArgs.push_back("__start");
4952 }
4953
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004954 if (Args.hasArg(options::OPT_static)) {
4955 CmdArgs.push_back("-Bstatic");
4956 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004957 if (Args.hasArg(options::OPT_rdynamic))
4958 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004959 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004960 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004961 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004962 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004963 } else {
4964 CmdArgs.push_back("-dynamic-linker");
4965 CmdArgs.push_back("/usr/libexec/ld.so");
4966 }
4967 }
4968
Daniel Dunbarb440f562010-08-02 02:38:21 +00004969 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004970 CmdArgs.push_back("-o");
4971 CmdArgs.push_back(Output.getFilename());
4972 } else {
4973 assert(Output.isNothing() && "Invalid output.");
4974 }
4975
4976 if (!Args.hasArg(options::OPT_nostdlib) &&
4977 !Args.hasArg(options::OPT_nostartfiles)) {
4978 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004979 if (Args.hasArg(options::OPT_pg))
4980 CmdArgs.push_back(Args.MakeArgString(
4981 getToolChain().GetFilePath("gcrt0.o")));
4982 else
4983 CmdArgs.push_back(Args.MakeArgString(
4984 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004985 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004986 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004987 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004988 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004989 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004990 }
4991 }
4992
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004993 std::string Triple = getToolChain().getTripleString();
4994 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004995 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004996 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004997 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004998
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004999 Args.AddAllArgs(CmdArgs, options::OPT_L);
5000 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5001 Args.AddAllArgs(CmdArgs, options::OPT_e);
5002
Daniel Dunbar54423b22010-09-17 00:24:54 +00005003 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005004
5005 if (!Args.hasArg(options::OPT_nostdlib) &&
5006 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005007 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005008 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00005009 if (Args.hasArg(options::OPT_pg))
5010 CmdArgs.push_back("-lm_p");
5011 else
5012 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00005013 }
5014
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005015 // FIXME: For some reason GCC passes -lgcc before adding
5016 // the default system libraries. Just mimic this for now.
5017 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005018
Eric Christopher17674ec2012-09-13 06:32:34 +00005019 if (Args.hasArg(options::OPT_pthread)) {
5020 if (!Args.hasArg(options::OPT_shared) &&
5021 Args.hasArg(options::OPT_pg))
5022 CmdArgs.push_back("-lpthread_p");
5023 else
5024 CmdArgs.push_back("-lpthread");
5025 }
5026
Chandler Carruth45661652011-12-17 22:32:42 +00005027 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00005028 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00005029 CmdArgs.push_back("-lc_p");
5030 else
5031 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005032 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005033
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005034 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005035 }
5036
5037 if (!Args.hasArg(options::OPT_nostdlib) &&
5038 !Args.hasArg(options::OPT_nostartfiles)) {
5039 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005040 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005041 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005042 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005043 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005044 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005045 }
5046
5047 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005048 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005049 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005050}
Ed Schoutene33194b2009-04-02 19:13:12 +00005051
Eli Friedman9fa28852012-08-08 23:57:20 +00005052void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5053 const InputInfo &Output,
5054 const InputInfoList &Inputs,
5055 const ArgList &Args,
5056 const char *LinkingOutput) const {
5057 ArgStringList CmdArgs;
5058
5059 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5060 options::OPT_Xassembler);
5061
5062 CmdArgs.push_back("-o");
5063 CmdArgs.push_back(Output.getFilename());
5064
5065 for (InputInfoList::const_iterator
5066 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5067 const InputInfo &II = *it;
5068 CmdArgs.push_back(II.getFilename());
5069 }
5070
5071 const char *Exec =
5072 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5073 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5074}
5075
5076void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5077 const InputInfo &Output,
5078 const InputInfoList &Inputs,
5079 const ArgList &Args,
5080 const char *LinkingOutput) const {
5081 const Driver &D = getToolChain().getDriver();
5082 ArgStringList CmdArgs;
5083
5084 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5085 (!Args.hasArg(options::OPT_shared))) {
5086 CmdArgs.push_back("-e");
5087 CmdArgs.push_back("__start");
5088 }
5089
5090 if (Args.hasArg(options::OPT_static)) {
5091 CmdArgs.push_back("-Bstatic");
5092 } else {
5093 if (Args.hasArg(options::OPT_rdynamic))
5094 CmdArgs.push_back("-export-dynamic");
5095 CmdArgs.push_back("--eh-frame-hdr");
5096 CmdArgs.push_back("-Bdynamic");
5097 if (Args.hasArg(options::OPT_shared)) {
5098 CmdArgs.push_back("-shared");
5099 } else {
5100 CmdArgs.push_back("-dynamic-linker");
5101 CmdArgs.push_back("/usr/libexec/ld.so");
5102 }
5103 }
5104
5105 if (Output.isFilename()) {
5106 CmdArgs.push_back("-o");
5107 CmdArgs.push_back(Output.getFilename());
5108 } else {
5109 assert(Output.isNothing() && "Invalid output.");
5110 }
5111
5112 if (!Args.hasArg(options::OPT_nostdlib) &&
5113 !Args.hasArg(options::OPT_nostartfiles)) {
5114 if (!Args.hasArg(options::OPT_shared)) {
5115 if (Args.hasArg(options::OPT_pg))
5116 CmdArgs.push_back(Args.MakeArgString(
5117 getToolChain().GetFilePath("gcrt0.o")));
5118 else
5119 CmdArgs.push_back(Args.MakeArgString(
5120 getToolChain().GetFilePath("crt0.o")));
5121 CmdArgs.push_back(Args.MakeArgString(
5122 getToolChain().GetFilePath("crtbegin.o")));
5123 } else {
5124 CmdArgs.push_back(Args.MakeArgString(
5125 getToolChain().GetFilePath("crtbeginS.o")));
5126 }
5127 }
5128
5129 Args.AddAllArgs(CmdArgs, options::OPT_L);
5130 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5131 Args.AddAllArgs(CmdArgs, options::OPT_e);
5132
5133 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5134
5135 if (!Args.hasArg(options::OPT_nostdlib) &&
5136 !Args.hasArg(options::OPT_nodefaultlibs)) {
5137 if (D.CCCIsCXX) {
5138 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5139 if (Args.hasArg(options::OPT_pg))
5140 CmdArgs.push_back("-lm_p");
5141 else
5142 CmdArgs.push_back("-lm");
5143 }
5144
5145 if (Args.hasArg(options::OPT_pthread))
5146 CmdArgs.push_back("-lpthread");
5147 if (!Args.hasArg(options::OPT_shared)) {
5148 if (Args.hasArg(options::OPT_pg))
5149 CmdArgs.push_back("-lc_p");
5150 else
5151 CmdArgs.push_back("-lc");
5152 }
5153
5154 std::string myarch = "-lclang_rt.";
5155 const llvm::Triple &T = getToolChain().getTriple();
5156 llvm::Triple::ArchType Arch = T.getArch();
5157 switch (Arch) {
5158 case llvm::Triple::arm:
5159 myarch += ("arm");
5160 break;
5161 case llvm::Triple::x86:
5162 myarch += ("i386");
5163 break;
5164 case llvm::Triple::x86_64:
5165 myarch += ("amd64");
5166 break;
5167 default:
5168 assert(0 && "Unsupported architecture");
5169 }
5170 CmdArgs.push_back(Args.MakeArgString(myarch));
5171 }
5172
5173 if (!Args.hasArg(options::OPT_nostdlib) &&
5174 !Args.hasArg(options::OPT_nostartfiles)) {
5175 if (!Args.hasArg(options::OPT_shared))
5176 CmdArgs.push_back(Args.MakeArgString(
5177 getToolChain().GetFilePath("crtend.o")));
5178 else
5179 CmdArgs.push_back(Args.MakeArgString(
5180 getToolChain().GetFilePath("crtendS.o")));
5181 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005182
5183 const char *Exec =
5184 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5185 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005186}
5187
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005188void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005189 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005190 const InputInfoList &Inputs,
5191 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005192 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005193 ArgStringList CmdArgs;
5194
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005195 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5196 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005197 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005198 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005199 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005200 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005201 else if (getToolChain().getArch() == llvm::Triple::mips ||
5202 getToolChain().getArch() == llvm::Triple::mipsel ||
5203 getToolChain().getArch() == llvm::Triple::mips64 ||
5204 getToolChain().getArch() == llvm::Triple::mips64el) {
5205 StringRef CPUName;
5206 StringRef ABIName;
5207 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005208
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005209 CmdArgs.push_back("-march");
5210 CmdArgs.push_back(CPUName.data());
5211
5212 // Convert ABI name to the GNU tools acceptable variant.
5213 if (ABIName == "o32")
5214 ABIName = "32";
5215 else if (ABIName == "n64")
5216 ABIName = "64";
5217
5218 CmdArgs.push_back("-mabi");
5219 CmdArgs.push_back(ABIName.data());
5220
5221 if (getToolChain().getArch() == llvm::Triple::mips ||
5222 getToolChain().getArch() == llvm::Triple::mips64)
5223 CmdArgs.push_back("-EB");
5224 else
5225 CmdArgs.push_back("-EL");
5226
5227 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5228 options::OPT_fpic, options::OPT_fno_pic,
5229 options::OPT_fPIE, options::OPT_fno_PIE,
5230 options::OPT_fpie, options::OPT_fno_pie);
5231 if (LastPICArg &&
5232 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5233 LastPICArg->getOption().matches(options::OPT_fpic) ||
5234 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5235 LastPICArg->getOption().matches(options::OPT_fpie))) {
5236 CmdArgs.push_back("-KPIC");
5237 }
5238 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005239
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005240 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5241 options::OPT_Xassembler);
5242
5243 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005244 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005245
5246 for (InputInfoList::const_iterator
5247 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5248 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005249 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005250 }
5251
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005252 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005253 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005254 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005255}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005256
5257void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005258 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005259 const InputInfoList &Inputs,
5260 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005261 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005262 const toolchains::FreeBSD& ToolChain =
5263 static_cast<const toolchains::FreeBSD&>(getToolChain());
5264 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005265 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005266
5267 // Silence warning for "clang -g foo.o -o foo"
5268 Args.ClaimAllArgs(options::OPT_g_Group);
5269 // and "clang -emit-llvm foo.o -o foo"
5270 Args.ClaimAllArgs(options::OPT_emit_llvm);
5271 // and for "clang -w foo.o -o foo". Other warning options are already
5272 // handled somewhere else.
5273 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005274
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005275 if (!D.SysRoot.empty())
5276 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5277
Roman Divackyafe2f232012-08-28 15:09:03 +00005278 if (Args.hasArg(options::OPT_pie))
5279 CmdArgs.push_back("-pie");
5280
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005281 if (Args.hasArg(options::OPT_static)) {
5282 CmdArgs.push_back("-Bstatic");
5283 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005284 if (Args.hasArg(options::OPT_rdynamic))
5285 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005286 CmdArgs.push_back("--eh-frame-hdr");
5287 if (Args.hasArg(options::OPT_shared)) {
5288 CmdArgs.push_back("-Bshareable");
5289 } else {
5290 CmdArgs.push_back("-dynamic-linker");
5291 CmdArgs.push_back("/libexec/ld-elf.so.1");
5292 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005293 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5294 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005295 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5296 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5297 CmdArgs.push_back("--hash-style=both");
5298 }
5299 }
5300 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005301 }
5302
5303 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5304 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005305 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005306 CmdArgs.push_back("-m");
5307 CmdArgs.push_back("elf_i386_fbsd");
5308 }
5309
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005310 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00005311 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005312 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005313 }
5314
Daniel Dunbarb440f562010-08-02 02:38:21 +00005315 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005316 CmdArgs.push_back("-o");
5317 CmdArgs.push_back(Output.getFilename());
5318 } else {
5319 assert(Output.isNothing() && "Invalid output.");
5320 }
5321
5322 if (!Args.hasArg(options::OPT_nostdlib) &&
5323 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005324 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005325 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005326 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005327 crt1 = "gcrt1.o";
5328 else if (Args.hasArg(options::OPT_pie))
5329 crt1 = "Scrt1.o";
5330 else
5331 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005332 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005333 if (crt1)
5334 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5335
5336 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5337
5338 const char *crtbegin = NULL;
5339 if (Args.hasArg(options::OPT_static))
5340 crtbegin = "crtbeginT.o";
5341 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5342 crtbegin = "crtbeginS.o";
5343 else
5344 crtbegin = "crtbegin.o";
5345
5346 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005347 }
5348
5349 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005350 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005351 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5352 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005353 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005354 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5355 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005356 Args.AddAllArgs(CmdArgs, options::OPT_s);
5357 Args.AddAllArgs(CmdArgs, options::OPT_t);
5358 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5359 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005360
Roman Divackyafe2f232012-08-28 15:09:03 +00005361 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005362
5363 if (!Args.hasArg(options::OPT_nostdlib) &&
5364 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005365 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005366 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005367 if (Args.hasArg(options::OPT_pg))
5368 CmdArgs.push_back("-lm_p");
5369 else
5370 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005371 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005372 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5373 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005374 if (Args.hasArg(options::OPT_pg))
5375 CmdArgs.push_back("-lgcc_p");
5376 else
5377 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005378 if (Args.hasArg(options::OPT_static)) {
5379 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005380 } else if (Args.hasArg(options::OPT_pg)) {
5381 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005382 } else {
5383 CmdArgs.push_back("--as-needed");
5384 CmdArgs.push_back("-lgcc_s");
5385 CmdArgs.push_back("--no-as-needed");
5386 }
5387
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005388 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005389 if (Args.hasArg(options::OPT_pg))
5390 CmdArgs.push_back("-lpthread_p");
5391 else
5392 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005393 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005394
Roman Divacky66f22762011-02-10 16:59:40 +00005395 if (Args.hasArg(options::OPT_pg)) {
5396 if (Args.hasArg(options::OPT_shared))
5397 CmdArgs.push_back("-lc");
5398 else
5399 CmdArgs.push_back("-lc_p");
5400 CmdArgs.push_back("-lgcc_p");
5401 } else {
5402 CmdArgs.push_back("-lc");
5403 CmdArgs.push_back("-lgcc");
5404 }
5405
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005406 if (Args.hasArg(options::OPT_static)) {
5407 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005408 } else if (Args.hasArg(options::OPT_pg)) {
5409 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005410 } else {
5411 CmdArgs.push_back("--as-needed");
5412 CmdArgs.push_back("-lgcc_s");
5413 CmdArgs.push_back("--no-as-needed");
5414 }
5415 }
5416
5417 if (!Args.hasArg(options::OPT_nostdlib) &&
5418 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005419 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005420 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005421 else
5422 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005423 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005424 }
5425
Roman Divackyafe2f232012-08-28 15:09:03 +00005426 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005427
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005428 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005429 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005430 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005431}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005432
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005433void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5434 const InputInfo &Output,
5435 const InputInfoList &Inputs,
5436 const ArgList &Args,
5437 const char *LinkingOutput) const {
5438 ArgStringList CmdArgs;
5439
5440 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5441 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005442 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005443 CmdArgs.push_back("--32");
5444
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005445 // Set byte order explicitly
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005446 if (getToolChain().getArch() == llvm::Triple::mips)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005447 CmdArgs.push_back("-EB");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00005448 else if (getToolChain().getArch() == llvm::Triple::mipsel)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005449 CmdArgs.push_back("-EL");
5450
5451 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5452 options::OPT_Xassembler);
5453
5454 CmdArgs.push_back("-o");
5455 CmdArgs.push_back(Output.getFilename());
5456
5457 for (InputInfoList::const_iterator
5458 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5459 const InputInfo &II = *it;
5460 CmdArgs.push_back(II.getFilename());
5461 }
5462
David Chisnallddbd68f2011-09-27 22:03:18 +00005463 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005464 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5465}
5466
5467void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5468 const InputInfo &Output,
5469 const InputInfoList &Inputs,
5470 const ArgList &Args,
5471 const char *LinkingOutput) const {
5472 const Driver &D = getToolChain().getDriver();
5473 ArgStringList CmdArgs;
5474
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005475 if (!D.SysRoot.empty())
5476 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5477
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005478 if (Args.hasArg(options::OPT_static)) {
5479 CmdArgs.push_back("-Bstatic");
5480 } else {
5481 if (Args.hasArg(options::OPT_rdynamic))
5482 CmdArgs.push_back("-export-dynamic");
5483 CmdArgs.push_back("--eh-frame-hdr");
5484 if (Args.hasArg(options::OPT_shared)) {
5485 CmdArgs.push_back("-Bshareable");
5486 } else {
5487 CmdArgs.push_back("-dynamic-linker");
5488 CmdArgs.push_back("/libexec/ld.elf_so");
5489 }
5490 }
5491
5492 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5493 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005494 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005495 CmdArgs.push_back("-m");
5496 CmdArgs.push_back("elf_i386");
5497 }
5498
5499 if (Output.isFilename()) {
5500 CmdArgs.push_back("-o");
5501 CmdArgs.push_back(Output.getFilename());
5502 } else {
5503 assert(Output.isNothing() && "Invalid output.");
5504 }
5505
5506 if (!Args.hasArg(options::OPT_nostdlib) &&
5507 !Args.hasArg(options::OPT_nostartfiles)) {
5508 if (!Args.hasArg(options::OPT_shared)) {
5509 CmdArgs.push_back(Args.MakeArgString(
5510 getToolChain().GetFilePath("crt0.o")));
5511 CmdArgs.push_back(Args.MakeArgString(
5512 getToolChain().GetFilePath("crti.o")));
5513 CmdArgs.push_back(Args.MakeArgString(
5514 getToolChain().GetFilePath("crtbegin.o")));
5515 } else {
5516 CmdArgs.push_back(Args.MakeArgString(
5517 getToolChain().GetFilePath("crti.o")));
5518 CmdArgs.push_back(Args.MakeArgString(
5519 getToolChain().GetFilePath("crtbeginS.o")));
5520 }
5521 }
5522
5523 Args.AddAllArgs(CmdArgs, options::OPT_L);
5524 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5525 Args.AddAllArgs(CmdArgs, options::OPT_e);
5526 Args.AddAllArgs(CmdArgs, options::OPT_s);
5527 Args.AddAllArgs(CmdArgs, options::OPT_t);
5528 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5529 Args.AddAllArgs(CmdArgs, options::OPT_r);
5530
5531 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5532
5533 if (!Args.hasArg(options::OPT_nostdlib) &&
5534 !Args.hasArg(options::OPT_nodefaultlibs)) {
5535 if (D.CCCIsCXX) {
5536 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5537 CmdArgs.push_back("-lm");
5538 }
5539 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5540 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005541 if (Args.hasArg(options::OPT_static)) {
5542 CmdArgs.push_back("-lgcc_eh");
5543 } else {
5544 CmdArgs.push_back("--as-needed");
5545 CmdArgs.push_back("-lgcc_s");
5546 CmdArgs.push_back("--no-as-needed");
5547 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005548 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005549
5550 if (Args.hasArg(options::OPT_pthread))
5551 CmdArgs.push_back("-lpthread");
5552 CmdArgs.push_back("-lc");
5553
5554 CmdArgs.push_back("-lgcc");
5555 if (Args.hasArg(options::OPT_static)) {
5556 CmdArgs.push_back("-lgcc_eh");
5557 } else {
5558 CmdArgs.push_back("--as-needed");
5559 CmdArgs.push_back("-lgcc_s");
5560 CmdArgs.push_back("--no-as-needed");
5561 }
5562 }
5563
5564 if (!Args.hasArg(options::OPT_nostdlib) &&
5565 !Args.hasArg(options::OPT_nostartfiles)) {
5566 if (!Args.hasArg(options::OPT_shared))
5567 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5568 "crtend.o")));
5569 else
5570 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5571 "crtendS.o")));
5572 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5573 "crtn.o")));
5574 }
5575
Bill Wendling08760582011-06-27 19:15:03 +00005576 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005577
David Chisnallddbd68f2011-09-27 22:03:18 +00005578 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005579 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5580}
5581
Rafael Espindola92b00932010-08-10 00:25:48 +00005582void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5583 const InputInfo &Output,
5584 const InputInfoList &Inputs,
5585 const ArgList &Args,
5586 const char *LinkingOutput) const {
5587 ArgStringList CmdArgs;
5588
5589 // Add --32/--64 to make sure we get the format we want.
5590 // This is incomplete
5591 if (getToolChain().getArch() == llvm::Triple::x86) {
5592 CmdArgs.push_back("--32");
5593 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5594 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005595 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5596 CmdArgs.push_back("-a32");
5597 CmdArgs.push_back("-mppc");
5598 CmdArgs.push_back("-many");
5599 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5600 CmdArgs.push_back("-a64");
5601 CmdArgs.push_back("-mppc64");
5602 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005603 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005604 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005605 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5606 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005607
5608 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5609 getToolChain().getTriple());
5610 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005611
5612 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5613 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5614 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005615 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5616 getToolChain().getArch() == llvm::Triple::mipsel ||
5617 getToolChain().getArch() == llvm::Triple::mips64 ||
5618 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005619 StringRef CPUName;
5620 StringRef ABIName;
5621 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005622
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005623 CmdArgs.push_back("-march");
5624 CmdArgs.push_back(CPUName.data());
5625
5626 // Convert ABI name to the GNU tools acceptable variant.
5627 if (ABIName == "o32")
5628 ABIName = "32";
5629 else if (ABIName == "n64")
5630 ABIName = "64";
5631
5632 CmdArgs.push_back("-mabi");
5633 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005634
5635 if (getToolChain().getArch() == llvm::Triple::mips ||
5636 getToolChain().getArch() == llvm::Triple::mips64)
5637 CmdArgs.push_back("-EB");
5638 else
5639 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005640
5641 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5642 options::OPT_fpic, options::OPT_fno_pic,
5643 options::OPT_fPIE, options::OPT_fno_PIE,
5644 options::OPT_fpie, options::OPT_fno_pie);
5645 if (LastPICArg &&
5646 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5647 LastPICArg->getOption().matches(options::OPT_fpic) ||
5648 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5649 LastPICArg->getOption().matches(options::OPT_fpie))) {
5650 CmdArgs.push_back("-KPIC");
5651 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005652 }
5653
5654 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5655 options::OPT_Xassembler);
5656
5657 CmdArgs.push_back("-o");
5658 CmdArgs.push_back(Output.getFilename());
5659
5660 for (InputInfoList::const_iterator
5661 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5662 const InputInfo &II = *it;
5663 CmdArgs.push_back(II.getFilename());
5664 }
5665
5666 const char *Exec =
5667 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5668 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5669}
5670
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005671static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5672 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005673 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005674 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005675 Args.hasArg(options::OPT_static_libgcc);
5676 if (!D.CCCIsCXX)
5677 CmdArgs.push_back("-lgcc");
5678
5679 if (StaticLibgcc) {
5680 if (D.CCCIsCXX)
5681 CmdArgs.push_back("-lgcc");
5682 } else {
5683 if (!D.CCCIsCXX)
5684 CmdArgs.push_back("--as-needed");
5685 CmdArgs.push_back("-lgcc_s");
5686 if (!D.CCCIsCXX)
5687 CmdArgs.push_back("--no-as-needed");
5688 }
5689
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005690 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005691 CmdArgs.push_back("-lgcc_eh");
5692 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5693 CmdArgs.push_back("-lgcc");
5694}
5695
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005696void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5697 const InputInfo &Output,
5698 const InputInfoList &Inputs,
5699 const ArgList &Args,
5700 const char *LinkingOutput) const {
5701 const toolchains::Linux& ToolChain =
5702 static_cast<const toolchains::Linux&>(getToolChain());
5703 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005704 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005705 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005706
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005707 ArgStringList CmdArgs;
5708
Rafael Espindolad1002f62010-11-15 18:28:16 +00005709 // Silence warning for "clang -g foo.o -o foo"
5710 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005711 // and "clang -emit-llvm foo.o -o foo"
5712 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005713 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005714 // handled somewhere else.
5715 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005716
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005717 if (!D.SysRoot.empty())
5718 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005719
Rafael Espindolad47ac232010-11-17 22:26:15 +00005720 if (Args.hasArg(options::OPT_pie))
5721 CmdArgs.push_back("-pie");
5722
Rafael Espindola1c76c592010-11-07 22:57:16 +00005723 if (Args.hasArg(options::OPT_rdynamic))
5724 CmdArgs.push_back("-export-dynamic");
5725
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005726 if (Args.hasArg(options::OPT_s))
5727 CmdArgs.push_back("-s");
5728
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005729 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5730 e = ToolChain.ExtraOpts.end();
5731 i != e; ++i)
5732 CmdArgs.push_back(i->c_str());
5733
5734 if (!Args.hasArg(options::OPT_static)) {
5735 CmdArgs.push_back("--eh-frame-hdr");
5736 }
5737
5738 CmdArgs.push_back("-m");
5739 if (ToolChain.getArch() == llvm::Triple::x86)
5740 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005741 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005742 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005743 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005744 else if (ToolChain.getArch() == llvm::Triple::ppc)
5745 CmdArgs.push_back("elf32ppclinux");
5746 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5747 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005748 else if (ToolChain.getArch() == llvm::Triple::mips)
5749 CmdArgs.push_back("elf32btsmip");
5750 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5751 CmdArgs.push_back("elf32ltsmip");
5752 else if (ToolChain.getArch() == llvm::Triple::mips64)
5753 CmdArgs.push_back("elf64btsmip");
5754 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5755 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005756 else
5757 CmdArgs.push_back("elf_x86_64");
5758
5759 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005760 if (ToolChain.getArch() == llvm::Triple::arm
5761 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005762 CmdArgs.push_back("-Bstatic");
5763 else
5764 CmdArgs.push_back("-static");
5765 } else if (Args.hasArg(options::OPT_shared)) {
5766 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005767 if ((ToolChain.getArch() == llvm::Triple::arm
5768 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5769 CmdArgs.push_back("-Bsymbolic");
5770 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005771 }
5772
5773 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005774 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005775 (!Args.hasArg(options::OPT_static) &&
5776 !Args.hasArg(options::OPT_shared))) {
5777 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005778 if (isAndroid)
5779 CmdArgs.push_back("/system/bin/linker");
5780 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005781 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005782 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005783 ToolChain.getArch() == llvm::Triple::thumb) {
5784 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5785 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5786 else
5787 CmdArgs.push_back("/lib/ld-linux.so.3");
5788 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005789 else if (ToolChain.getArch() == llvm::Triple::mips ||
5790 ToolChain.getArch() == llvm::Triple::mipsel)
5791 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005792 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5793 ToolChain.getArch() == llvm::Triple::mips64el)
5794 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005795 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005796 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005797 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005798 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005799 else
5800 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5801 }
5802
5803 CmdArgs.push_back("-o");
5804 CmdArgs.push_back(Output.getFilename());
5805
Rafael Espindola81937ec2010-12-01 01:52:43 +00005806 if (!Args.hasArg(options::OPT_nostdlib) &&
5807 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005808 if (!isAndroid) {
5809 const char *crt1 = NULL;
5810 if (!Args.hasArg(options::OPT_shared)){
5811 if (Args.hasArg(options::OPT_pie))
5812 crt1 = "Scrt1.o";
5813 else
5814 crt1 = "crt1.o";
5815 }
5816 if (crt1)
5817 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005818
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005819 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5820 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005821
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005822 const char *crtbegin;
5823 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005824 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005825 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005826 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005827 else if (Args.hasArg(options::OPT_pie))
5828 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005829 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005830 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00005832
5833 // Add crtfastmath.o if available and fast math is enabled.
5834 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005835 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005836
5837 Args.AddAllArgs(CmdArgs, options::OPT_L);
5838
5839 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5840
Roman Divackyee8188a2011-03-01 17:53:14 +00005841 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5842 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005843 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005844
Rafael Espindola9446d762012-04-09 23:53:34 +00005845 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5846 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5847 // forward.
5848 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5849 CmdArgs.push_back("-plugin");
5850 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5851 CmdArgs.push_back(Args.MakeArgString(Plugin));
5852 }
5853
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005854 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5855 CmdArgs.push_back("--no-demangle");
5856
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005857 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5858
Chandler Carruth94a32012012-05-14 18:31:18 +00005859 if (D.CCCIsCXX &&
5860 !Args.hasArg(options::OPT_nostdlib) &&
5861 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005862 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5863 !Args.hasArg(options::OPT_static);
5864 if (OnlyLibstdcxxStatic)
5865 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005866 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005867 if (OnlyLibstdcxxStatic)
5868 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005869 CmdArgs.push_back("-lm");
5870 }
5871
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005872 // Call this before we add the C run-time.
5873 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005874 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005875
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005876 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005877 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5878 if (Args.hasArg(options::OPT_static))
5879 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005880
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005881 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005882
Chandler Carruth94a32012012-05-14 18:31:18 +00005883 if (Args.hasArg(options::OPT_pthread) ||
5884 Args.hasArg(options::OPT_pthreads))
5885 CmdArgs.push_back("-lpthread");
5886
5887 CmdArgs.push_back("-lc");
5888
5889 if (Args.hasArg(options::OPT_static))
5890 CmdArgs.push_back("--end-group");
5891 else
5892 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5893 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005894
Rafael Espindola81937ec2010-12-01 01:52:43 +00005895 if (!Args.hasArg(options::OPT_nostartfiles)) {
5896 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005897 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005898 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005899 else if (Args.hasArg(options::OPT_pie))
5900 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005901 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005902 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005903
Rafael Espindola81937ec2010-12-01 01:52:43 +00005904 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005905 if (!isAndroid)
5906 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005907 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005908 }
5909
Bill Wendling08760582011-06-27 19:15:03 +00005910 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005911
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005912 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5913}
Rafael Espindola92b00932010-08-10 00:25:48 +00005914
Chris Lattner3e2ee142010-07-07 16:01:42 +00005915void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005916 const InputInfo &Output,
5917 const InputInfoList &Inputs,
5918 const ArgList &Args,
5919 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005920 ArgStringList CmdArgs;
5921
5922 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5923 options::OPT_Xassembler);
5924
5925 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005926 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005927
5928 for (InputInfoList::const_iterator
5929 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5930 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005931 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005932 }
5933
5934 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005935 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005936 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005937}
5938
5939void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005940 const InputInfo &Output,
5941 const InputInfoList &Inputs,
5942 const ArgList &Args,
5943 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005944 const Driver &D = getToolChain().getDriver();
5945 ArgStringList CmdArgs;
5946
Daniel Dunbarb440f562010-08-02 02:38:21 +00005947 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005948 CmdArgs.push_back("-o");
5949 CmdArgs.push_back(Output.getFilename());
5950 } else {
5951 assert(Output.isNothing() && "Invalid output.");
5952 }
5953
5954 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005955 !Args.hasArg(options::OPT_nostartfiles)) {
5956 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5957 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5958 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5959 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5960 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005961
5962 Args.AddAllArgs(CmdArgs, options::OPT_L);
5963 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5964 Args.AddAllArgs(CmdArgs, options::OPT_e);
5965
Daniel Dunbar54423b22010-09-17 00:24:54 +00005966 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005967
Eli Friedman83de5132011-12-08 23:54:21 +00005968 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5969
Chris Lattner3e2ee142010-07-07 16:01:42 +00005970 if (!Args.hasArg(options::OPT_nostdlib) &&
5971 !Args.hasArg(options::OPT_nodefaultlibs)) {
5972 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005973 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005974 CmdArgs.push_back("-lm");
5975 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005976 }
5977
5978 if (!Args.hasArg(options::OPT_nostdlib) &&
5979 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005980 if (Args.hasArg(options::OPT_pthread))
5981 CmdArgs.push_back("-lpthread");
5982 CmdArgs.push_back("-lc");
5983 CmdArgs.push_back("-lCompilerRT-Generic");
5984 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5985 CmdArgs.push_back(
5986 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005987 }
5988
Eli Friedman83de5132011-12-08 23:54:21 +00005989 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005990 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005991}
5992
Daniel Dunbarcc912342009-05-02 18:28:39 +00005993/// DragonFly Tools
5994
5995// For now, DragonFly Assemble does just about the same as for
5996// FreeBSD, but this may change soon.
5997void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005998 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005999 const InputInfoList &Inputs,
6000 const ArgList &Args,
6001 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006002 ArgStringList CmdArgs;
6003
6004 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6005 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006006 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00006007 CmdArgs.push_back("--32");
6008
6009 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6010 options::OPT_Xassembler);
6011
6012 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006013 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006014
6015 for (InputInfoList::const_iterator
6016 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6017 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00006018 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00006019 }
6020
6021 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006022 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006023 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006024}
6025
6026void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006027 const InputInfo &Output,
6028 const InputInfoList &Inputs,
6029 const ArgList &Args,
6030 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006031 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00006032 ArgStringList CmdArgs;
6033
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006034 if (!D.SysRoot.empty())
6035 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6036
Daniel Dunbarcc912342009-05-02 18:28:39 +00006037 if (Args.hasArg(options::OPT_static)) {
6038 CmdArgs.push_back("-Bstatic");
6039 } else {
6040 if (Args.hasArg(options::OPT_shared))
6041 CmdArgs.push_back("-Bshareable");
6042 else {
6043 CmdArgs.push_back("-dynamic-linker");
6044 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6045 }
6046 }
6047
6048 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6049 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006050 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006051 CmdArgs.push_back("-m");
6052 CmdArgs.push_back("elf_i386");
6053 }
6054
Daniel Dunbarb440f562010-08-02 02:38:21 +00006055 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006056 CmdArgs.push_back("-o");
6057 CmdArgs.push_back(Output.getFilename());
6058 } else {
6059 assert(Output.isNothing() && "Invalid output.");
6060 }
6061
6062 if (!Args.hasArg(options::OPT_nostdlib) &&
6063 !Args.hasArg(options::OPT_nostartfiles)) {
6064 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006065 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006066 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006067 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006068 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006069 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006070 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006071 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006072 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006073 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006074 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006075 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006076 }
6077 }
6078
6079 Args.AddAllArgs(CmdArgs, options::OPT_L);
6080 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6081 Args.AddAllArgs(CmdArgs, options::OPT_e);
6082
Daniel Dunbar54423b22010-09-17 00:24:54 +00006083 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006084
6085 if (!Args.hasArg(options::OPT_nostdlib) &&
6086 !Args.hasArg(options::OPT_nodefaultlibs)) {
6087 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6088 // rpaths
6089 CmdArgs.push_back("-L/usr/lib/gcc41");
6090
6091 if (!Args.hasArg(options::OPT_static)) {
6092 CmdArgs.push_back("-rpath");
6093 CmdArgs.push_back("/usr/lib/gcc41");
6094
6095 CmdArgs.push_back("-rpath-link");
6096 CmdArgs.push_back("/usr/lib/gcc41");
6097
6098 CmdArgs.push_back("-rpath");
6099 CmdArgs.push_back("/usr/lib");
6100
6101 CmdArgs.push_back("-rpath-link");
6102 CmdArgs.push_back("/usr/lib");
6103 }
6104
Rafael Espindola38360b32010-07-20 12:59:03 +00006105 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006106 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006107 CmdArgs.push_back("-lm");
6108 }
6109
Daniel Dunbarcc912342009-05-02 18:28:39 +00006110 if (Args.hasArg(options::OPT_shared)) {
6111 CmdArgs.push_back("-lgcc_pic");
6112 } else {
6113 CmdArgs.push_back("-lgcc");
6114 }
6115
6116
6117 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006118 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006119
6120 if (!Args.hasArg(options::OPT_nolibc)) {
6121 CmdArgs.push_back("-lc");
6122 }
6123
6124 if (Args.hasArg(options::OPT_shared)) {
6125 CmdArgs.push_back("-lgcc_pic");
6126 } else {
6127 CmdArgs.push_back("-lgcc");
6128 }
6129 }
6130
6131 if (!Args.hasArg(options::OPT_nostdlib) &&
6132 !Args.hasArg(options::OPT_nostartfiles)) {
6133 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006134 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006135 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006136 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006137 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006138 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006139 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006140 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006141 }
6142
Bill Wendling08760582011-06-27 19:15:03 +00006143 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006144
Daniel Dunbarcc912342009-05-02 18:28:39 +00006145 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006146 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006147 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006148}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006149
6150void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6151 const InputInfo &Output,
6152 const InputInfoList &Inputs,
6153 const ArgList &Args,
6154 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006155 ArgStringList CmdArgs;
6156
6157 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006158 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6159 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006160 } else {
6161 assert(Output.isNothing() && "Invalid output.");
6162 }
6163
6164 if (!Args.hasArg(options::OPT_nostdlib) &&
6165 !Args.hasArg(options::OPT_nostartfiles)) {
6166 CmdArgs.push_back("-defaultlib:libcmt");
6167 }
6168
6169 CmdArgs.push_back("-nologo");
6170
Michael J. Spencere2f49362012-06-18 16:56:04 +00006171 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6172
6173 // Add filenames immediately.
6174 for (InputInfoList::const_iterator
6175 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6176 if (it->isFilename())
6177 CmdArgs.push_back(it->getFilename());
6178 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006179
6180 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006181 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006182 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6183}