blob: 3d1c9f4e8cf09d38bf25169ab2ccc8ffe4eb0546 [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")
Chad Rosier9ac84512011-10-07 17:48:56 +0000449 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000450}
451
Benjamin Kramer09811c72012-06-26 22:20:06 +0000452/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511}
512
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000513// FIXME: Move to target hook.
514static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000519 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000522 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 return true;
524 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000525 }
526}
527
Chad Rosiercfbfc582012-04-04 20:51:35 +0000528// Handle -mfpu=.
529//
530// FIXME: Centralize feature selection, defaulting shouldn't be also in the
531// frontend target.
532static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567}
568
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000569// Handle -mfpmath=.
570static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000571 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000578
Silviu Baranga157f7c62012-09-13 15:06:00 +0000579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp" &&
580 CPU != "cortex-a15")
Chad Rosier45619cb2012-04-04 22:13:40 +0000581 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
582
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000583 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
584 FPMath == "vfp4") {
585 CmdArgs.push_back("-target-feature");
586 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000587
588 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000589 } else
590 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
591}
592
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000593// Select the float ABI as determined by -msoft-float, -mhard-float, and
594// -mfloat-abi=.
595static StringRef getARMFloatABI(const Driver &D,
596 const ArgList &Args,
597 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000598 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000599 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
600 options::OPT_mhard_float,
601 options::OPT_mfloat_abi_EQ)) {
602 if (A->getOption().matches(options::OPT_msoft_float))
603 FloatABI = "soft";
604 else if (A->getOption().matches(options::OPT_mhard_float))
605 FloatABI = "hard";
606 else {
607 FloatABI = A->getValue(Args);
608 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000609 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000610 << A->getAsString(Args);
611 FloatABI = "soft";
612 }
613 }
614 }
615
616 // If unspecified, choose the default based on the platform.
617 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000618 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000619 case llvm::Triple::Darwin:
620 case llvm::Triple::MacOSX:
621 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000622 // Darwin defaults to "softfp" for v6 and v7.
623 //
624 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000625 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000626 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000627 if (StringRef(ArchName).startswith("v6") ||
628 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000629 FloatABI = "softfp";
630 else
631 FloatABI = "soft";
632 break;
633 }
634
635 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000636 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000637 case llvm::Triple::GNUEABIHF:
638 FloatABI = "hard";
639 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000640 case llvm::Triple::GNUEABI:
641 FloatABI = "softfp";
642 break;
643 case llvm::Triple::EABI:
644 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
645 FloatABI = "softfp";
646 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000647 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000648 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000649 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000650 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000651 FloatABI = "softfp";
652 else
653 FloatABI = "soft";
654 break;
655 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 default:
657 // Assume "soft", but warn the user we are guessing.
658 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000659 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000660 break;
661 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 }
663 }
664
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000665 return FloatABI;
666}
667
668
669void Clang::AddARMTargetArgs(const ArgList &Args,
670 ArgStringList &CmdArgs,
671 bool KernelOrKext) const {
672 const Driver &D = getToolChain().getDriver();
673 llvm::Triple Triple = getToolChain().getTriple();
674
675 // Select the ABI to use.
676 //
677 // FIXME: Support -meabi.
678 const char *ABIName = 0;
679 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
680 ABIName = A->getValue(Args);
681 } else {
682 // Select the default based on the platform.
683 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000684 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000685 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000686 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000687 ABIName = "aapcs-linux";
688 break;
689 case llvm::Triple::EABI:
690 ABIName = "aapcs";
691 break;
692 default:
693 ABIName = "apcs-gnu";
694 }
695 }
696 CmdArgs.push_back("-target-abi");
697 CmdArgs.push_back(ABIName);
698
699 // Set the CPU based on -march= and -mcpu=.
700 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000701 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000702
703 // Determine floating point ABI from the options & target defaults.
704 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000705 if (FloatABI == "soft") {
706 // Floating point operations and argument passing are soft.
707 //
708 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000709 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000710 CmdArgs.push_back("-mfloat-abi");
711 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000712 } else if (FloatABI == "softfp") {
713 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000714 CmdArgs.push_back("-mfloat-abi");
715 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000716 } else {
717 // Floating point operations and argument passing are hard.
718 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000719 CmdArgs.push_back("-mfloat-abi");
720 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000721 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000722
723 // Set appropriate target features for floating point mode.
724 //
725 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
726 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
727 // stripped out by the ARM target.
728
729 // Use software floating point operations?
730 if (FloatABI == "soft") {
731 CmdArgs.push_back("-target-feature");
732 CmdArgs.push_back("+soft-float");
733 }
734
735 // Use software floating point argument passing?
736 if (FloatABI != "hard") {
737 CmdArgs.push_back("-target-feature");
738 CmdArgs.push_back("+soft-float-abi");
739 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000740
741 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000742 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000743 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000744
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000745 // Honor -mfpmath=.
746 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000747 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000748
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000749 // Setting -msoft-float effectively disables NEON because of the GCC
750 // implementation, although the same isn't true of VFP or VFP3.
751 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000752 CmdArgs.push_back("-target-feature");
753 CmdArgs.push_back("-neon");
754 }
755
756 // Kernel code has more strict alignment requirements.
757 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000758 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000759 CmdArgs.push_back("-arm-long-calls");
760
Daniel Dunbar12100e22011-03-22 16:48:17 +0000761 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000762 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000763
764 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000765 CmdArgs.push_back("-backend-option");
766 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000767 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000768
769 // Setting -mno-global-merge disables the codegen global merge pass. Setting
770 // -mglobal-merge has no effect as the pass is enabled by default.
771 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
772 options::OPT_mno_global_merge)) {
773 if (A->getOption().matches(options::OPT_mno_global_merge))
774 CmdArgs.push_back("-mno-global-merge");
775 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000776
Chad Rosierc14ded72012-05-16 21:19:55 +0000777 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000778 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000779}
780
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000781// Translate MIPS CPU name alias option to CPU name.
782static StringRef getMipsCPUFromAlias(const Arg &A) {
783 if (A.getOption().matches(options::OPT_mips32))
784 return "mips32";
785 if (A.getOption().matches(options::OPT_mips32r2))
786 return "mips32r2";
787 if (A.getOption().matches(options::OPT_mips64))
788 return "mips64";
789 if (A.getOption().matches(options::OPT_mips64r2))
790 return "mips64r2";
791 llvm_unreachable("Unexpected option");
792 return "";
793}
794
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000795// Get CPU and ABI names. They are not independent
796// so we have to calculate them together.
797static void getMipsCPUAndABI(const ArgList &Args,
798 const ToolChain &TC,
799 StringRef &CPUName,
800 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000801 const char *DefMips32CPU = "mips32";
802 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000803
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000804 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyan2efe53e2012-09-21 20:19:32 +0000805 options::OPT_mcpu_EQ,
806 options::OPT_mips_CPUs_Group)) {
807 if (A->getOption().matches(options::OPT_mips_CPUs_Group))
808 CPUName = getMipsCPUFromAlias(*A);
809 else
810 CPUName = A->getValue(Args);
811 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000812
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000813 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000814 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000815
816 // Setup default CPU and ABI names.
817 if (CPUName.empty() && ABIName.empty()) {
818 switch (TC.getTriple().getArch()) {
819 default:
820 llvm_unreachable("Unexpected triple arch name");
821 case llvm::Triple::mips:
822 case llvm::Triple::mipsel:
823 CPUName = DefMips32CPU;
824 break;
825 case llvm::Triple::mips64:
826 case llvm::Triple::mips64el:
827 CPUName = DefMips64CPU;
828 break;
829 }
830 }
831
832 if (!ABIName.empty()) {
833 // Deduce CPU name from ABI name.
834 CPUName = llvm::StringSwitch<const char *>(ABIName)
835 .Cases("o32", "eabi", DefMips32CPU)
836 .Cases("n32", "n64", DefMips64CPU)
837 .Default("");
838 }
839 else if (!CPUName.empty()) {
840 // Deduce ABI name from CPU name.
841 ABIName = llvm::StringSwitch<const char *>(CPUName)
842 .Cases("mips32", "mips32r2", "o32")
843 .Cases("mips64", "mips64r2", "n64")
844 .Default("");
845 }
846
847 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000848}
849
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000850// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
851// and -mfloat-abi=.
852static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000853 // Select the float ABI as determined by -msoft-float, -mhard-float,
854 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000855 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000856 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000857 options::OPT_mhard_float,
858 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000859 if (A->getOption().matches(options::OPT_msoft_float))
860 FloatABI = "soft";
861 else if (A->getOption().matches(options::OPT_mhard_float))
862 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000863 else {
864 FloatABI = A->getValue(Args);
865 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000866 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000867 FloatABI = "hard";
868 }
869 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000870 }
871
872 // If unspecified, choose the default based on the platform.
873 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000874 // Assume "hard", because it's a default value used by gcc.
875 // When we start to recognize specific target MIPS processors,
876 // we will be able to select the default more correctly.
877 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000878 }
879
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000880 return FloatABI;
881}
882
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000883static void AddTargetFeature(const ArgList &Args,
884 ArgStringList &CmdArgs,
885 OptSpecifier OnOpt,
886 OptSpecifier OffOpt,
887 StringRef FeatureName) {
888 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
889 CmdArgs.push_back("-target-feature");
890 if (A->getOption().matches(OnOpt))
891 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
892 else
893 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
894 }
895}
896
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000897void Clang::AddMIPSTargetArgs(const ArgList &Args,
898 ArgStringList &CmdArgs) const {
899 const Driver &D = getToolChain().getDriver();
900 StringRef CPUName;
901 StringRef ABIName;
902 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
903
904 CmdArgs.push_back("-target-cpu");
905 CmdArgs.push_back(CPUName.data());
906
907 CmdArgs.push_back("-target-abi");
908 CmdArgs.push_back(ABIName.data());
909
910 StringRef FloatABI = getMipsFloatABI(D, Args);
911
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 if (FloatABI == "soft") {
913 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000914 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000915 CmdArgs.push_back("-mfloat-abi");
916 CmdArgs.push_back("soft");
917
918 // FIXME: Note, this is a hack. We need to pass the selected float
919 // mode to the MipsTargetInfoBase to define appropriate macros there.
920 // Now it is the only method.
921 CmdArgs.push_back("-target-feature");
922 CmdArgs.push_back("+soft-float");
923 }
924 else if (FloatABI == "single") {
925 // Restrict the use of hardware floating-point
926 // instructions to 32-bit operations.
927 CmdArgs.push_back("-target-feature");
928 CmdArgs.push_back("+single-float");
929 }
930 else {
931 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000932 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000933 CmdArgs.push_back("-mfloat-abi");
934 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000935 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000936
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000937 AddTargetFeature(Args, CmdArgs,
938 options::OPT_mips16, options::OPT_mno_mips16,
939 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000940 AddTargetFeature(Args, CmdArgs,
941 options::OPT_mdsp, options::OPT_mno_dsp,
942 "dsp");
943 AddTargetFeature(Args, CmdArgs,
944 options::OPT_mdspr2, options::OPT_mno_dspr2,
945 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000946
947 if (Arg *A = Args.getLastArg(options::OPT_G)) {
948 StringRef v = A->getValue(Args);
949 CmdArgs.push_back("-mllvm");
950 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
951 A->claim();
952 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000953}
954
Hal Finkel8eb59282012-06-11 22:35:19 +0000955/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
956static std::string getPPCTargetCPU(const ArgList &Args) {
957 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
958 StringRef CPUName = A->getValue(Args);
959
960 if (CPUName == "native") {
961 std::string CPU = llvm::sys::getHostCPUName();
962 if (!CPU.empty() && CPU != "generic")
963 return CPU;
964 else
965 return "";
966 }
967
968 return llvm::StringSwitch<const char *>(CPUName)
969 .Case("common", "generic")
970 .Case("440", "440")
971 .Case("440fp", "440")
972 .Case("450", "450")
973 .Case("601", "601")
974 .Case("602", "602")
975 .Case("603", "603")
976 .Case("603e", "603e")
977 .Case("603ev", "603ev")
978 .Case("604", "604")
979 .Case("604e", "604e")
980 .Case("620", "620")
981 .Case("G3", "g3")
982 .Case("7400", "7400")
983 .Case("G4", "g4")
984 .Case("7450", "7450")
985 .Case("G4+", "g4+")
986 .Case("750", "750")
987 .Case("970", "970")
988 .Case("G5", "g5")
989 .Case("a2", "a2")
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000990 .Case("e500mc", "e500mc")
991 .Case("e5500", "e5500")
Hal Finkel8eb59282012-06-11 22:35:19 +0000992 .Case("power6", "pwr6")
993 .Case("power7", "pwr7")
994 .Case("powerpc", "ppc")
995 .Case("powerpc64", "ppc64")
996 .Default("");
997 }
998
999 return "";
1000}
1001
1002void Clang::AddPPCTargetArgs(const ArgList &Args,
1003 ArgStringList &CmdArgs) const {
1004 std::string TargetCPUName = getPPCTargetCPU(Args);
1005
1006 // LLVM may default to generating code for the native CPU,
1007 // but, like gcc, we default to a more generic option for
1008 // each architecture. (except on Darwin)
1009 llvm::Triple Triple = getToolChain().getTriple();
1010 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1011 if (Triple.getArch() == llvm::Triple::ppc64)
1012 TargetCPUName = "ppc64";
1013 else
1014 TargetCPUName = "ppc";
1015 }
1016
1017 if (!TargetCPUName.empty()) {
1018 CmdArgs.push_back("-target-cpu");
1019 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1020 }
1021}
1022
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001023void Clang::AddSparcTargetArgs(const ArgList &Args,
1024 ArgStringList &CmdArgs) const {
1025 const Driver &D = getToolChain().getDriver();
1026
1027 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001028 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001029 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001030 }
1031
1032 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001033 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001034 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1035 options::OPT_mhard_float)) {
1036 if (A->getOption().matches(options::OPT_msoft_float))
1037 FloatABI = "soft";
1038 else if (A->getOption().matches(options::OPT_mhard_float))
1039 FloatABI = "hard";
1040 }
1041
1042 // If unspecified, choose the default based on the platform.
1043 if (FloatABI.empty()) {
1044 switch (getToolChain().getTriple().getOS()) {
1045 default:
1046 // Assume "soft", but warn the user we are guessing.
1047 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001048 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001049 break;
1050 }
1051 }
1052
1053 if (FloatABI == "soft") {
1054 // Floating point operations and argument passing are soft.
1055 //
1056 // FIXME: This changes CPP defines, we need -target-soft-float.
1057 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001058 CmdArgs.push_back("-target-feature");
1059 CmdArgs.push_back("+soft-float");
1060 } else {
1061 assert(FloatABI == "hard" && "Invalid float abi!");
1062 CmdArgs.push_back("-mhard-float");
1063 }
1064}
1065
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001066void Clang::AddX86TargetArgs(const ArgList &Args,
1067 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001068 if (!Args.hasFlag(options::OPT_mred_zone,
1069 options::OPT_mno_red_zone,
1070 true) ||
1071 Args.hasArg(options::OPT_mkernel) ||
1072 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001073 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001074
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001075 if (Args.hasFlag(options::OPT_msoft_float,
1076 options::OPT_mno_soft_float,
1077 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001078 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001079
Daniel Dunbare13ada62009-11-14 22:04:54 +00001080 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001081 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001082 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001083 // FIXME: Reject attempts to use -march=native unless the target matches
1084 // the host.
1085 //
1086 // FIXME: We should also incorporate the detected target features for use
1087 // with -native.
1088 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001089 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001090 CPUName = Args.MakeArgString(CPU);
1091 } else
1092 CPUName = A->getValue(Args);
1093 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001094
Daniel Dunbare13ada62009-11-14 22:04:54 +00001095 // Select the default CPU if none was given (or detection failed).
1096 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001097 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001098 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001099 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001100 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001101 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001102 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001103 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001104 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001105 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001106 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001107 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001108 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001110 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001111 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001112 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001113 } else if (getToolChain().getOS().startswith("bitrig")) {
1114 if (getToolChain().getArch() == llvm::Triple::x86_64)
1115 CPUName = "x86-64";
1116 else if (getToolChain().getArch() == llvm::Triple::x86)
1117 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001118 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001119 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001120 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001121 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001122 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001123 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001124 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001125 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001126 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001127 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001128 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001129 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001130 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001131 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001132 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001133 }
1134 }
1135
Daniel Dunbare13ada62009-11-14 22:04:54 +00001136 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001137 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001138 CmdArgs.push_back(CPUName);
1139 }
1140
Eli Friedmanad811f02011-07-02 00:34:19 +00001141 // The required algorithm here is slightly strange: the options are applied
1142 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1143 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1144 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1145 // former correctly, but not the latter; handle directly-overridden
1146 // attributes here.
1147 llvm::StringMap<unsigned> PrevFeature;
1148 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001149 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1150 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001151 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001152 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001153
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001154 // Skip over "-m".
1155 assert(Name.startswith("-m") && "Invalid feature name.");
1156 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001157
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001158 bool IsNegative = Name.startswith("no-");
1159 if (IsNegative)
1160 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001161
Eli Friedmanad811f02011-07-02 00:34:19 +00001162 unsigned& Prev = PrevFeature[Name];
1163 if (Prev)
1164 Features[Prev - 1] = 0;
1165 Prev = Features.size() + 1;
1166 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1167 }
1168 for (unsigned i = 0; i < Features.size(); i++) {
1169 if (Features[i]) {
1170 CmdArgs.push_back("-target-feature");
1171 CmdArgs.push_back(Features[i]);
1172 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001173 }
1174}
1175
Tony Linthicum76329bf2011-12-12 21:14:55 +00001176static Arg* getLastHexagonArchArg (const ArgList &Args)
1177{
1178 Arg * A = NULL;
1179
Sebastian Pop86500282012-01-13 20:37:10 +00001180 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1181 it != ie; ++it) {
1182 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001183 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1184 A = *it;
1185 A->claim();
1186 }
Sebastian Pop86500282012-01-13 20:37:10 +00001187 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1188 StringRef Value = (*it)->getValue(Args,0);
1189 if (Value.startswith("v")) {
1190 A = *it;
1191 A->claim();
1192 }
1193 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001194 }
1195 return A;
1196}
1197
Sebastian Pop86500282012-01-13 20:37:10 +00001198static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001199{
1200 Arg *A;
1201 llvm::StringRef WhichHexagon;
1202
Sebastian Pop86500282012-01-13 20:37:10 +00001203 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001204 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001205 WhichHexagon = A->getValue(Args);
1206 if (WhichHexagon == "")
1207 return "v4";
1208 else
1209 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001210 }
Sebastian Pop86500282012-01-13 20:37:10 +00001211 else
1212 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001213}
1214
1215void Clang::AddHexagonTargetArgs(const ArgList &Args,
1216 ArgStringList &CmdArgs) const {
1217 llvm::Triple Triple = getToolChain().getTriple();
1218
1219 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001220 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221 CmdArgs.push_back("-fno-signed-char");
1222 CmdArgs.push_back("-nobuiltininc");
1223
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001224 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001225 CmdArgs.push_back("-mqdsp6-compat");
1226
1227 if (Arg *A = Args.getLastArg(options::OPT_G,
1228 options::OPT_msmall_data_threshold_EQ)) {
1229 std::string SmallDataThreshold="-small-data-threshold=";
1230 SmallDataThreshold += A->getValue(Args);
1231 CmdArgs.push_back ("-mllvm");
1232 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1233 A->claim();
1234 }
1235
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001236 if (!Args.hasArg(options::OPT_fno_short_enums))
1237 CmdArgs.push_back("-fshort-enums");
1238 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1239 CmdArgs.push_back ("-mllvm");
1240 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1241 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001242 CmdArgs.push_back ("-mllvm");
1243 CmdArgs.push_back ("-machine-sink-split=0");
1244}
1245
Eric Christopher84fbdb42011-08-19 00:30:14 +00001246static bool
John McCall5fb5df92012-06-20 06:18:46 +00001247shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001248 const llvm::Triple &Triple) {
1249 // We use the zero-cost exception tables for Objective-C if the non-fragile
1250 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1251 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001252 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001253 return true;
1254
Bob Wilson6524dd32011-10-14 05:03:44 +00001255 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001256 return false;
1257
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001258 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001259 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001260 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001261}
1262
Anders Carlssone96ab552011-02-28 02:27:16 +00001263/// addExceptionArgs - Adds exception related arguments to the driver command
1264/// arguments. There's a master flag, -fexceptions and also language specific
1265/// flags to enable/disable C++ and Objective-C exceptions.
1266/// This makes it possible to for example disable C++ exceptions but enable
1267/// Objective-C exceptions.
1268static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1269 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001270 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001271 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001272 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001273 if (KernelOrKext) {
1274 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1275 // arguments now to avoid warnings about unused arguments.
1276 Args.ClaimAllArgs(options::OPT_fexceptions);
1277 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1278 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1279 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1280 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1281 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001282 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001283 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001284
1285 // Exceptions are enabled by default.
1286 bool ExceptionsEnabled = true;
1287
1288 // This keeps track of whether exceptions were explicitly turned on or off.
1289 bool DidHaveExplicitExceptionFlag = false;
1290
Rafael Espindola00a66572009-10-01 13:33:33 +00001291 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1292 options::OPT_fno_exceptions)) {
1293 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001294 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001295 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001296 ExceptionsEnabled = false;
1297
1298 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001299 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001300
Anders Carlssone96ab552011-02-28 02:27:16 +00001301 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001302
Anders Carlssone96ab552011-02-28 02:27:16 +00001303 // Exception tables and cleanups can be enabled with -fexceptions even if the
1304 // language itself doesn't support exceptions.
1305 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1306 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001307
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001308 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1309 // is not necessarily sensible, but follows GCC.
1310 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001311 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001312 options::OPT_fno_objc_exceptions,
1313 true)) {
1314 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001315
Eric Christopher84fbdb42011-08-19 00:30:14 +00001316 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001317 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001318 }
1319
1320 if (types::isCXX(InputType)) {
1321 bool CXXExceptionsEnabled = ExceptionsEnabled;
1322
Eric Christopher84fbdb42011-08-19 00:30:14 +00001323 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1324 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001325 options::OPT_fexceptions,
1326 options::OPT_fno_exceptions)) {
1327 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1328 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001329 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001330 CXXExceptionsEnabled = false;
1331 }
1332
1333 if (CXXExceptionsEnabled) {
1334 CmdArgs.push_back("-fcxx-exceptions");
1335
1336 ShouldUseExceptionTables = true;
1337 }
1338 }
1339
1340 if (ShouldUseExceptionTables)
1341 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001342}
1343
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001344static bool ShouldDisableCFI(const ArgList &Args,
1345 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001346 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001347 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001348 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001349 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001350 Default = Args.hasFlag(options::OPT_integrated_as,
1351 options::OPT_no_integrated_as,
1352 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001353 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001354 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1355 options::OPT_fno_dwarf2_cfi_asm,
1356 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001357}
1358
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001359static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1360 const ToolChain &TC) {
1361 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1362 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1363 options::OPT_no_integrated_as,
1364 IsIADefault);
1365 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1366 options::OPT_fno_dwarf_directory_asm,
1367 UseIntegratedAs);
1368 return !UseDwarfDirectory;
1369}
1370
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001371/// \brief Check whether the given input tree contains any compilation actions.
1372static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001373 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001374 return true;
1375
1376 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1377 if (ContainsCompileAction(*it))
1378 return true;
1379
1380 return false;
1381}
1382
1383/// \brief Check if -relax-all should be passed to the internal assembler.
1384/// This is done by default when compiling non-assembler source with -O0.
1385static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1386 bool RelaxDefault = true;
1387
1388 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1389 RelaxDefault = A->getOption().matches(options::OPT_O0);
1390
1391 if (RelaxDefault) {
1392 RelaxDefault = false;
1393 for (ActionList::const_iterator it = C.getActions().begin(),
1394 ie = C.getActions().end(); it != ie; ++it) {
1395 if (ContainsCompileAction(*it)) {
1396 RelaxDefault = true;
1397 break;
1398 }
1399 }
1400 }
1401
1402 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1403 RelaxDefault);
1404}
1405
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001406/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1407/// This needs to be called before we add the C run-time (malloc, etc).
1408static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001409 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001410 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001411 options::OPT_fno_address_sanitizer, false))
1412 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001413 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001414 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001415 if (!Args.hasArg(options::OPT_pie))
1416 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001417 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001418
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001419 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1420 llvm::sys::path::append(LibAsan, "lib", "linux",
1421 (Twine("libclang_rt.asan-") +
1422 TC.getArchName() + "-android.so"));
1423 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001424 } else {
1425 if (!Args.hasArg(options::OPT_shared)) {
1426 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1427 // resource directory.
1428 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1429 llvm::sys::path::append(LibAsan, "lib", "linux",
1430 (Twine("libclang_rt.asan-") +
1431 TC.getArchName() + ".a"));
1432 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1433 CmdArgs.push_back("-lpthread");
1434 CmdArgs.push_back("-ldl");
1435 CmdArgs.push_back("-export-dynamic");
1436 }
1437 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001438}
1439
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001440/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1441/// This needs to be called before we add the C run-time (malloc, etc).
1442static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1443 ArgStringList &CmdArgs) {
1444 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1445 options::OPT_fno_thread_sanitizer, false))
1446 return;
1447 if (!Args.hasArg(options::OPT_shared)) {
1448 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1449 // resource directory.
1450 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1451 llvm::sys::path::append(LibTsan, "lib", "linux",
1452 (Twine("libclang_rt.tsan-") +
1453 TC.getArchName() + ".a"));
1454 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1455 CmdArgs.push_back("-lpthread");
1456 CmdArgs.push_back("-ldl");
1457 CmdArgs.push_back("-export-dynamic");
1458 }
1459}
1460
Rafael Espindola224dd632011-12-14 21:02:23 +00001461static bool shouldUseFramePointer(const ArgList &Args,
1462 const llvm::Triple &Triple) {
1463 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1464 options::OPT_fomit_frame_pointer))
1465 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1466
Rafael Espindola00b29182011-12-14 21:50:24 +00001467 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001468 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1469 Triple.getArch() == llvm::Triple::x86) &&
1470 Triple.getOS() == llvm::Triple::Linux) {
1471 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1472 if (!A->getOption().matches(options::OPT_O0))
1473 return false;
1474 }
1475
1476 return true;
1477}
1478
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001479void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001480 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001481 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001482 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001483 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001484 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1485 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001486 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001487 ArgStringList CmdArgs;
1488
Daniel Dunbare521a892009-03-31 20:53:55 +00001489 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1490
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001491 // Invoke ourselves in -cc1 mode.
1492 //
1493 // FIXME: Implement custom jobs for internal actions.
1494 CmdArgs.push_back("-cc1");
1495
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001496 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001497 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001498 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001499 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001500
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001501 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001502 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001503
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001504 if (isa<AnalyzeJobAction>(JA)) {
1505 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1506 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001507 } else if (isa<MigrateJobAction>(JA)) {
1508 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001509 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001510 if (Output.getType() == types::TY_Dependencies)
1511 CmdArgs.push_back("-Eonly");
1512 else
1513 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001514 } else if (isa<AssembleJobAction>(JA)) {
1515 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001516
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001517 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001518 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001519
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001520 // When using an integrated assembler, translate -Wa, and -Xassembler
1521 // options.
1522 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1523 options::OPT_Xassembler),
1524 ie = Args.filtered_end(); it != ie; ++it) {
1525 const Arg *A = *it;
1526 A->claim();
1527
1528 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001529 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001530
1531 if (Value == "-force_cpusubtype_ALL") {
1532 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001533 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001534 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001535 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001536 CmdArgs.push_back("-mllvm");
1537 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001538 } else if (Value == "--noexecstack") {
1539 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001540 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001541 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001542 << A->getOption().getName() << Value;
1543 }
1544 }
1545 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001546
1547 // Also ignore explicit -force_cpusubtype_ALL option.
1548 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001549 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001550 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001551 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001552
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001553 if (JA.getType() == types::TY_Nothing)
1554 CmdArgs.push_back("-fsyntax-only");
1555 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001556 CmdArgs.push_back("-emit-pch");
1557 else
1558 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001559 } else {
1560 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001561
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001562 if (JA.getType() == types::TY_Nothing) {
1563 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001564 } else if (JA.getType() == types::TY_LLVM_IR ||
1565 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001566 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001567 } else if (JA.getType() == types::TY_LLVM_BC ||
1568 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001569 CmdArgs.push_back("-emit-llvm-bc");
1570 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001571 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001572 } else if (JA.getType() == types::TY_AST) {
1573 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001574 } else if (JA.getType() == types::TY_RewrittenObjC) {
1575 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001576 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001577 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1578 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001579 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001580 } else {
1581 assert(JA.getType() == types::TY_PP_Asm &&
1582 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001584 }
1585
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001586 // The make clang go fast button.
1587 CmdArgs.push_back("-disable-free");
1588
John McCallbb79b5f2010-02-13 03:50:24 +00001589 // Disable the verification pass in -asserts builds.
1590#ifdef NDEBUG
1591 CmdArgs.push_back("-disable-llvm-verifier");
1592#endif
1593
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001594 // Set the main file name, so that debug info works even with
1595 // -save-temps.
1596 CmdArgs.push_back("-main-file-name");
1597 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1598
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001599 // Some flags which affect the language (via preprocessor
1600 // defines). See darwin::CC1::AddCPPArgs.
1601 if (Args.hasArg(options::OPT_static))
1602 CmdArgs.push_back("-static-define");
1603
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001604 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001605 // Enable region store model by default.
1606 CmdArgs.push_back("-analyzer-store=region");
1607
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001608 // Treat blocks as analysis entry points.
1609 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1610
Ted Kremenek49c79792011-03-24 00:28:47 +00001611 CmdArgs.push_back("-analyzer-eagerly-assume");
1612
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001613 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001614 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001615 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001616
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001617 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1618 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001619
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001620 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001621 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001622
1623 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001624
1625 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1627 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1628 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1629 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1630 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1631 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001632 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001633
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001634 // Set the output format. The default is plist, for (lame) historical
1635 // reasons.
1636 CmdArgs.push_back("-analyzer-output");
1637 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1638 CmdArgs.push_back(A->getValue(Args));
1639 else
1640 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001641
Ted Kremenekfe449a22010-03-22 22:32:05 +00001642 // Disable the presentation of standard compiler warnings when
1643 // using --analyze. We only want to show static analyzer diagnostics
1644 // or frontend errors.
1645 CmdArgs.push_back("-w");
1646
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001647 // Add -Xanalyzer arguments when running as analyzer.
1648 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001649 }
1650
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001651 CheckCodeGenerationOptions(D, Args);
1652
Daniel Dunbar44e71222009-04-29 18:32:25 +00001653 // Perform argument translation for LLVM backend. This
1654 // takes some care in reconciling with llvm-gcc. The
1655 // issue is that llvm-gcc translates these options based on
1656 // the values in cc1, whereas we are processing based on
1657 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001658
Daniel Dunbar44e71222009-04-29 18:32:25 +00001659 // This comes from the default translation the driver + cc1
1660 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001661
1662 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1663 options::OPT_fpic, options::OPT_fno_pic,
1664 options::OPT_fPIE, options::OPT_fno_PIE,
1665 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001666 bool PICDisabled = false;
1667 bool PICEnabled = false;
1668 bool PICForPIE = false;
1669 if (LastPICArg) {
1670 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1671 LastPICArg->getOption().matches(options::OPT_fpie));
1672 PICEnabled = (PICForPIE ||
1673 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1674 LastPICArg->getOption().matches(options::OPT_fpic));
1675 PICDisabled = !PICEnabled;
1676 }
1677 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1678 // PIC or PIE options above, if these show up, PIC is disabled.
1679 if (Args.hasArg(options::OPT_mkernel))
1680 PICDisabled = true;
1681 if (Args.hasArg(options::OPT_static))
1682 PICDisabled = true;
1683 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1684
1685 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001686 const char *Model = getToolChain().GetForcedPicModel();
1687 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001688 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001689 Model = "dynamic-no-pic";
1690 else if (PICDisabled)
1691 Model = "static";
1692 else if (PICEnabled)
1693 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001694 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001695 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001696 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001697 StringRef ModelStr = Model ? Model : "";
1698 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001699 CmdArgs.push_back("-mrelocation-model");
1700 CmdArgs.push_back(Model);
1701 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001702
Chandler Carruthc0c04552012-04-08 16:40:35 +00001703 // Infer the __PIC__ and __PIE__ values.
1704 if (ModelStr == "pic" && PICForPIE) {
1705 CmdArgs.push_back("-pie-level");
1706 CmdArgs.push_back((LastPICArg &&
1707 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1708 "2" : "1");
1709 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001710 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001711 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1712 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1713 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001714 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001715
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001716 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1717 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001718 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001719
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001720 // LLVM Code Generator Options.
1721
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001722 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1723 CmdArgs.push_back("-mregparm");
1724 CmdArgs.push_back(A->getValue(Args));
1725 }
1726
Roman Divacky65b88cd2011-03-01 17:40:53 +00001727 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1728 CmdArgs.push_back("-mrtd");
1729
Rafael Espindola224dd632011-12-14 21:02:23 +00001730 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001731 CmdArgs.push_back("-mdisable-fp-elim");
1732 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1733 options::OPT_fno_zero_initialized_in_bss))
1734 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001735 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1736 options::OPT_fno_strict_aliasing,
1737 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001738 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001739 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1740 false))
1741 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001742 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1743 options::OPT_fno_optimize_sibling_calls))
1744 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001745
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001746 // Handle various floating point optimization flags, mapping them to the
1747 // appropriate LLVM code generation flags. The pattern for all of these is to
1748 // default off the codegen optimizations, and if any flag enables them and no
1749 // flag disables them after the flag enabling them, enable the codegen
1750 // optimization. This is complicated by several "umbrella" flags.
1751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001752 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001753 options::OPT_ffinite_math_only,
1754 options::OPT_fno_finite_math_only,
1755 options::OPT_fhonor_infinities,
1756 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001757 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1758 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001759 A->getOption().getID() != options::OPT_fhonor_infinities)
1760 CmdArgs.push_back("-menable-no-infs");
1761 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001762 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001763 options::OPT_ffinite_math_only,
1764 options::OPT_fno_finite_math_only,
1765 options::OPT_fhonor_nans,
1766 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001767 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1768 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001769 A->getOption().getID() != options::OPT_fhonor_nans)
1770 CmdArgs.push_back("-menable-no-nans");
1771
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001772 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1773 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001774 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001775 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001776 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001777 options::OPT_fno_math_errno))
1778 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1779 if (MathErrno)
1780 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001781
1782 // There are several flags which require disabling very specific
1783 // optimizations. Any of these being disabled forces us to turn off the
1784 // entire set of LLVM optimizations, so collect them through all the flag
1785 // madness.
1786 bool AssociativeMath = false;
1787 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001788 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001789 options::OPT_funsafe_math_optimizations,
1790 options::OPT_fno_unsafe_math_optimizations,
1791 options::OPT_fassociative_math,
1792 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001793 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1794 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001795 A->getOption().getID() != options::OPT_fno_associative_math)
1796 AssociativeMath = true;
1797 bool ReciprocalMath = false;
1798 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001799 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001800 options::OPT_funsafe_math_optimizations,
1801 options::OPT_fno_unsafe_math_optimizations,
1802 options::OPT_freciprocal_math,
1803 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001804 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1805 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001806 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1807 ReciprocalMath = true;
1808 bool SignedZeros = true;
1809 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001810 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001811 options::OPT_funsafe_math_optimizations,
1812 options::OPT_fno_unsafe_math_optimizations,
1813 options::OPT_fsigned_zeros,
1814 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001815 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1816 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001817 A->getOption().getID() != options::OPT_fsigned_zeros)
1818 SignedZeros = false;
1819 bool TrappingMath = true;
1820 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001821 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001822 options::OPT_funsafe_math_optimizations,
1823 options::OPT_fno_unsafe_math_optimizations,
1824 options::OPT_ftrapping_math,
1825 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001826 if (A->getOption().getID() != options::OPT_fno_fast_math &&
1827 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001828 A->getOption().getID() != options::OPT_ftrapping_math)
1829 TrappingMath = false;
1830 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1831 !TrappingMath)
1832 CmdArgs.push_back("-menable-unsafe-fp-math");
1833
Lang Hamesaa53b932012-07-06 00:59:19 +00001834
1835 // Validate and pass through -fp-contract option.
1836 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001837 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00001838 options::OPT_ffp_contract)) {
1839 if (A->getOption().getID() == options::OPT_ffp_contract) {
1840 StringRef Val = A->getValue(Args);
1841 if (Val == "fast" || Val == "on" || Val == "off") {
1842 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1843 } else {
1844 D.Diag(diag::err_drv_unsupported_option_argument)
1845 << A->getOption().getName() << Val;
1846 }
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001847 } else if (A->getOption().getID() == options::OPT_ffast_math) {
Lang Hamesaa53b932012-07-06 00:59:19 +00001848 // If fast-math is set then set the fp-contract mode to fast.
1849 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1850 }
1851 }
1852
Bob Wilson6a039162012-07-19 03:52:53 +00001853 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1854 // and if we find them, tell the frontend to provide the appropriate
1855 // preprocessor macros. This is distinct from enabling any optimizations as
1856 // these options induce language changes which must survive serialization
1857 // and deserialization, etc.
Chad Rosierc30eb1c2012-09-25 22:03:25 +00001858 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math))
1859 if (A->getOption().matches(options::OPT_ffast_math))
1860 CmdArgs.push_back("-ffast-math");
1861 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, options::OPT_fno_fast_math))
1862 if (A->getOption().matches(options::OPT_ffinite_math_only))
1863 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001864
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001865 // Decide whether to use verbose asm. Verbose assembly is the default on
1866 // toolchains which have the integrated assembler on by default.
1867 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1868 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001869 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001870 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001871 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001872
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001873 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1874 CmdArgs.push_back("-mdebug-pass");
1875 CmdArgs.push_back("Structure");
1876 }
1877 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1878 CmdArgs.push_back("-mdebug-pass");
1879 CmdArgs.push_back("Arguments");
1880 }
1881
John McCall8517abc2010-02-19 02:45:38 +00001882 // Enable -mconstructor-aliases except on darwin, where we have to
1883 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001884 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001885 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001886
John McCall7ef5cb32011-03-18 02:56:14 +00001887 // Darwin's kernel doesn't support guard variables; just die if we
1888 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001889 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001890 CmdArgs.push_back("-fforbid-guard-variables");
1891
Douglas Gregordbe39272011-02-01 15:15:22 +00001892 if (Args.hasArg(options::OPT_mms_bitfields)) {
1893 CmdArgs.push_back("-mms-bitfields");
1894 }
John McCall8517abc2010-02-19 02:45:38 +00001895
Daniel Dunbar306945d2009-09-16 06:17:29 +00001896 // This is a coarse approximation of what llvm-gcc actually does, both
1897 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1898 // complicated ways.
1899 bool AsynchronousUnwindTables =
1900 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1901 options::OPT_fno_asynchronous_unwind_tables,
1902 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001903 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001904 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1905 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001906 CmdArgs.push_back("-munwind-tables");
1907
Rafael Espindola66aa0452012-06-19 01:26:10 +00001908 getToolChain().addClangTargetOptions(CmdArgs);
1909
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001910 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1911 CmdArgs.push_back("-mlimit-float-precision");
1912 CmdArgs.push_back(A->getValue(Args));
1913 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001914
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001915 // FIXME: Handle -mtune=.
1916 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001917
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001918 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001919 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001920 CmdArgs.push_back(A->getValue(Args));
1921 }
1922
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001923 // Add target specific cpu and features flags.
1924 switch(getToolChain().getTriple().getArch()) {
1925 default:
1926 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001927
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001928 case llvm::Triple::arm:
1929 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001930 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001931 break;
1932
Eric Christopher0b26a612010-03-02 02:41:08 +00001933 case llvm::Triple::mips:
1934 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001935 case llvm::Triple::mips64:
1936 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001937 AddMIPSTargetArgs(Args, CmdArgs);
1938 break;
1939
Hal Finkel8eb59282012-06-11 22:35:19 +00001940 case llvm::Triple::ppc:
1941 case llvm::Triple::ppc64:
1942 AddPPCTargetArgs(Args, CmdArgs);
1943 break;
1944
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001945 case llvm::Triple::sparc:
1946 AddSparcTargetArgs(Args, CmdArgs);
1947 break;
1948
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001949 case llvm::Triple::x86:
1950 case llvm::Triple::x86_64:
1951 AddX86TargetArgs(Args, CmdArgs);
1952 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001953
1954 case llvm::Triple::hexagon:
1955 AddHexagonTargetArgs(Args, CmdArgs);
1956 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001957 }
1958
Tony Linthicum76329bf2011-12-12 21:14:55 +00001959
1960
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001961 // Pass the linker version in use.
1962 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1963 CmdArgs.push_back("-target-linker-version");
1964 CmdArgs.push_back(A->getValue(Args));
1965 }
1966
Nick Lewycky75033772011-02-02 06:43:03 +00001967 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001968 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001969 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001970 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001971 CmdArgs.push_back("-momit-leaf-frame-pointer");
1972
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001973 // Explicitly error on some things we know we don't support and can't just
1974 // ignore.
1975 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001976 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1977 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001978 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001979 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001980 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001981 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1982 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001983 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001984 << Unsupported->getOption().getName();
1985 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001986 }
1987
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001988 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001989 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001990 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001991 CmdArgs.push_back("-header-include-file");
1992 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1993 D.CCPrintHeadersFilename : "-");
1994 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001995 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001996 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001997
Chad Rosierbe10f982011-08-02 17:58:04 +00001998 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001999 CmdArgs.push_back("-diagnostic-log-file");
2000 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2001 D.CCLogDiagnosticsFilename : "-");
2002 }
2003
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002004 // Use the last option from "-g" group. "-gline-tables-only" is
2005 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002006 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002007 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
2008 if (A->getOption().matches(options::OPT_gline_tables_only)) {
2009 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002010 } else if (!A->getOption().matches(options::OPT_g0) &&
2011 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00002012 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00002013 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002014 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002015
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002016 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2017 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2018
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002019 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2020 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2021
Chris Lattner3c77a352010-06-22 00:03:40 +00002022 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2023
Nick Lewycky207bce32011-04-21 23:44:07 +00002024 if (Args.hasArg(options::OPT_ftest_coverage) ||
2025 Args.hasArg(options::OPT_coverage))
2026 CmdArgs.push_back("-femit-coverage-notes");
2027 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2028 Args.hasArg(options::OPT_coverage))
2029 CmdArgs.push_back("-femit-coverage-data");
2030
Nick Lewycky480cb992011-05-04 20:46:58 +00002031 if (C.getArgs().hasArg(options::OPT_c) ||
2032 C.getArgs().hasArg(options::OPT_S)) {
2033 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002034 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002035 SmallString<128> absFilename(Output.getFilename());
2036 llvm::sys::fs::make_absolute(absFilename);
2037 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002038 }
2039 }
2040
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002041 // Pass options for controlling the default header search paths.
2042 if (Args.hasArg(options::OPT_nostdinc)) {
2043 CmdArgs.push_back("-nostdsysteminc");
2044 CmdArgs.push_back("-nobuiltininc");
2045 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002046 if (Args.hasArg(options::OPT_nostdlibinc))
2047 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002048 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2049 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2050 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002051
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002052 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002053 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002054 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002055
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002056 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2057
Ted Kremenekf7639e12012-03-06 20:06:33 +00002058 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002059 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002060 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002061 options::OPT_ccc_arcmt_modify,
2062 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002063 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002064 switch (A->getOption().getID()) {
2065 default:
2066 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002067 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002068 CmdArgs.push_back("-arcmt-check");
2069 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002070 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002071 CmdArgs.push_back("-arcmt-modify");
2072 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002073 case options::OPT_ccc_arcmt_migrate:
2074 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002075 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002076 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002077
2078 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2079 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002080 break;
John McCalld70fb982011-06-15 23:25:17 +00002081 }
2082 }
2083 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002084
Ted Kremenekf7639e12012-03-06 20:06:33 +00002085 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2086 if (ARCMTEnabled) {
2087 D.Diag(diag::err_drv_argument_not_allowed_with)
2088 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2089 }
2090 CmdArgs.push_back("-mt-migrate-directory");
2091 CmdArgs.push_back(A->getValue(Args));
2092
2093 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2094 options::OPT_objcmt_migrate_subscripting)) {
2095 // None specified, means enable them all.
2096 CmdArgs.push_back("-objcmt-migrate-literals");
2097 CmdArgs.push_back("-objcmt-migrate-subscripting");
2098 } else {
2099 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2100 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2101 }
2102 }
2103
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002104 // Add preprocessing options like -I, -D, etc. if we are using the
2105 // preprocessor.
2106 //
2107 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002108 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002109 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110
Rafael Espindolaa7431922011-07-21 23:40:37 +00002111 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2112 // that "The compiler can only warn and ignore the option if not recognized".
2113 // When building with ccache, it will pass -D options to clang even on
2114 // preprocessed inputs and configure concludes that -fPIC is not supported.
2115 Args.ClaimAllArgs(options::OPT_D);
2116
Daniel Dunbar58f78332009-09-17 06:53:36 +00002117 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002118 // others.
2119 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002120 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002121 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002122 else if (A->getOption().matches(options::OPT_O) &&
2123 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002124 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002125 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002126 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002127 }
2128
Daniel Dunbar945577c2009-10-29 02:24:45 +00002129 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002130 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2131 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002132 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002133 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002134
2135 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2136 // (-ansi is equivalent to -std=c89).
2137 //
2138 // If a std is supplied, only add -trigraphs if it follows the
2139 // option.
2140 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2141 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002142 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002143 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002144 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002145 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002146 else
2147 Std->render(Args, CmdArgs);
2148
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002149 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2150 options::OPT_trigraphs))
2151 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002152 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002153 } else {
2154 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002155 //
2156 // FIXME: Clang doesn't correctly handle -std= when the input language
2157 // doesn't match. For the time being just ignore this for C++ inputs;
2158 // eventually we want to do all the standard defaulting here instead of
2159 // splitting it between the driver and clang -cc1.
2160 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002161 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2162 "-std=", /*Joined=*/true);
2163 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2164 CmdArgs.push_back("-std=c++11");
2165
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002166 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002167 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002168
Chandler Carruthb009b142011-04-23 06:30:43 +00002169 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2170 // '-fconst-strings'; this better indicates its actual behavior.
2171 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2172 false)) {
2173 // For perfect compatibility with GCC, we do this even in the presence of
2174 // '-w'. This flag names something other than a warning for GCC.
2175 CmdArgs.push_back("-fconst-strings");
2176 }
2177
Chandler Carruth61fbf622011-04-23 09:27:53 +00002178 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002179 // during C++ compilation, which it is by default. GCC keeps this define even
2180 // in the presence of '-w', match this behavior bug-for-bug.
2181 if (types::isCXX(InputType) &&
2182 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2183 true)) {
2184 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002185 }
2186
Chandler Carruthe0391482010-05-22 02:21:53 +00002187 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2188 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2189 if (Asm->getOption().matches(options::OPT_fasm))
2190 CmdArgs.push_back("-fgnu-keywords");
2191 else
2192 CmdArgs.push_back("-fno-gnu-keywords");
2193 }
2194
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002195 if (ShouldDisableCFI(Args, getToolChain()))
2196 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002197
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002198 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2199 CmdArgs.push_back("-fno-dwarf-directory-asm");
2200
Nick Lewyckyba743b72011-10-21 02:32:14 +00002201 if (const char *pwd = ::getenv("PWD")) {
2202 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2203 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002204 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002205 std::string CompDir = pwd;
2206 CmdArgs.push_back("-fdebug-compilation-dir");
2207 CmdArgs.push_back(Args.MakeArgString(CompDir));
2208 }
2209 }
2210
Richard Smith9a568822011-11-21 19:36:32 +00002211 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2212 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002213 CmdArgs.push_back("-ftemplate-depth");
2214 CmdArgs.push_back(A->getValue(Args));
2215 }
2216
Richard Smith9a568822011-11-21 19:36:32 +00002217 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2218 CmdArgs.push_back("-fconstexpr-depth");
2219 CmdArgs.push_back(A->getValue(Args));
2220 }
2221
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002222 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2223 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002224 if (A->getNumValues()) {
2225 StringRef bytes = A->getValue(Args);
2226 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2227 } else
2228 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002229 }
2230
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002231 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2232 options::OPT_fbounds_checking_EQ)) {
2233 if (A->getNumValues()) {
2234 StringRef val = A->getValue(Args);
2235 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2236 } else
2237 CmdArgs.push_back("-fbounds-checking=1");
2238 }
2239
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002240 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002241 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002242
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002243 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2244 CmdArgs.push_back("-fconstant-string-class");
2245 CmdArgs.push_back(A->getValue(Args));
2246 }
David Chisnall5778fce2009-08-31 16:41:57 +00002247
Chris Lattnere23003d2010-01-09 21:54:33 +00002248 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2249 CmdArgs.push_back("-ftabstop");
2250 CmdArgs.push_back(A->getValue(Args));
2251 }
2252
Chris Lattnerb35583d2010-04-07 20:49:23 +00002253 CmdArgs.push_back("-ferror-limit");
2254 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2255 CmdArgs.push_back(A->getValue(Args));
2256 else
2257 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002258
Chandler Carrutha77a7272010-05-06 04:55:18 +00002259 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2260 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002261 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002262 }
2263
2264 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2265 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002266 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002267 }
2268
Richard Smithf6f003a2011-12-16 19:06:07 +00002269 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2270 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2271 CmdArgs.push_back(A->getValue(Args));
2272 }
2273
Daniel Dunbar2c978472009-11-04 06:24:47 +00002274 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002275 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002276 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002277 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002278 } else {
2279 // If -fmessage-length=N was not specified, determine whether this is a
2280 // terminal and, if so, implicitly define -fmessage-length appropriately.
2281 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002282 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002283 }
2284
Daniel Dunbare357d562009-12-03 18:42:11 +00002285 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2286 CmdArgs.push_back("-fvisibility");
2287 CmdArgs.push_back(A->getValue(Args));
2288 }
2289
Douglas Gregor08329632010-06-15 17:05:35 +00002290 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002291
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002292 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2293
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002294 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002295 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2296 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002297 CmdArgs.push_back("-ffreestanding");
2298
Daniel Dunbare357d562009-12-03 18:42:11 +00002299 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002300 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002301 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002302 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002303 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002304 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002306 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002307 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2308 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002309
2310 // Report and error for -faltivec on anything other then PowerPC.
2311 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2312 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2313 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2314 D.Diag(diag::err_drv_argument_only_allowed_with)
2315 << A->getAsString(Args) << "ppc/ppc64";
2316
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002317 if (getToolChain().SupportsProfiling())
2318 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002319
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002320 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2321 options::OPT_fno_address_sanitizer, false))
2322 CmdArgs.push_back("-faddress-sanitizer");
2323
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002324 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2325 options::OPT_fno_thread_sanitizer, false))
2326 CmdArgs.push_back("-fthread-sanitizer");
2327
Daniel Dunbar35621a92010-03-16 16:57:46 +00002328 // -flax-vector-conversions is default.
2329 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2330 options::OPT_fno_lax_vector_conversions))
2331 CmdArgs.push_back("-fno-lax-vector-conversions");
2332
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002333 if (Args.getLastArg(options::OPT_fapple_kext))
2334 CmdArgs.push_back("-fapple-kext");
2335
David Blaikie690f21e2012-06-14 18:55:27 +00002336 if (Args.hasFlag(options::OPT_frewrite_includes,
2337 options::OPT_fno_rewrite_includes, false))
2338 CmdArgs.push_back("-frewrite-includes");
2339
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002340 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002341 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002342 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002343 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2344 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002345
2346 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2347 CmdArgs.push_back("-ftrapv-handler");
2348 CmdArgs.push_back(A->getValue(Args));
2349 }
2350
Bob Wilson14adb362012-02-03 06:27:22 +00002351 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002352
Chandler Carruth6e501032011-03-27 00:04:55 +00002353 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2354 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2355 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2356 options::OPT_fno_wrapv)) {
2357 if (A->getOption().matches(options::OPT_fwrapv))
2358 CmdArgs.push_back("-fwrapv");
2359 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2360 options::OPT_fno_strict_overflow)) {
2361 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2362 CmdArgs.push_back("-fwrapv");
2363 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002364 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002365 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002366
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002367 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2368
Daniel Dunbar4930e332009-11-17 08:07:36 +00002369 // -stack-protector=0 is default.
2370 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002371 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2372 options::OPT_fstack_protector_all,
2373 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002374 if (A->getOption().matches(options::OPT_fstack_protector))
2375 StackProtectorLevel = 1;
2376 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2377 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002378 } else {
2379 StackProtectorLevel =
2380 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2381 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002382 if (StackProtectorLevel) {
2383 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002384 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002385 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002386
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002387 // --param ssp-buffer-size=
2388 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2389 ie = Args.filtered_end(); it != ie; ++it) {
2390 StringRef Str((*it)->getValue(Args));
2391 if (Str.startswith("ssp-buffer-size=")) {
2392 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002393 CmdArgs.push_back("-stack-protector-buffer-size");
2394 // FIXME: Verify the argument is a valid integer.
2395 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002396 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002397 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002398 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002399 }
2400
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002401 // Translate -mstackrealign
2402 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2403 false)) {
2404 CmdArgs.push_back("-backend-option");
2405 CmdArgs.push_back("-force-align-stack");
2406 }
2407 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2408 false)) {
2409 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2410 }
2411
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002412 if (Args.hasArg(options::OPT_mstack_alignment)) {
2413 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2414 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002415 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002416
Daniel Dunbard18049a2009-04-07 21:16:11 +00002417 // Forward -f options with positive and negative forms; we translate
2418 // these by hand.
2419
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002420 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002421 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002422 CmdArgs.push_back("-fapple-kext");
2423 if (!Args.hasArg(options::OPT_fbuiltin))
2424 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002425 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002426 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002427 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002428 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002429 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002430
Nuno Lopes13c88c72009-12-16 16:59:22 +00002431 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2432 options::OPT_fno_assume_sane_operator_new))
2433 CmdArgs.push_back("-fno-assume-sane-operator-new");
2434
Daniel Dunbar4930e332009-11-17 08:07:36 +00002435 // -fblocks=0 is default.
2436 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002437 getToolChain().IsBlocksDefault()) ||
2438 (Args.hasArg(options::OPT_fgnu_runtime) &&
2439 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2440 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002441 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002442
2443 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2444 !getToolChain().hasBlocksRuntime())
2445 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002446 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002447
Douglas Gregor226173a2012-01-18 15:19:58 +00002448 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2449 // users must also pass -fcxx-modules. The latter flag will disappear once the
2450 // modules implementation is solid for C++/Objective-C++ programs as well.
2451 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2452 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2453 options::OPT_fno_cxx_modules,
2454 false);
2455 if (AllowedInCXX || !types::isCXX(InputType))
2456 CmdArgs.push_back("-fmodules");
2457 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002458
John McCalldfea9982010-04-09 19:12:06 +00002459 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002460 if (Args.hasFlag(options::OPT_fno_access_control,
2461 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002462 false))
John McCall3155f572010-04-09 19:03:51 +00002463 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002464
Anders Carlssond470fef2010-11-21 00:09:52 +00002465 // -felide-constructors is the default.
2466 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2467 options::OPT_felide_constructors,
2468 false))
2469 CmdArgs.push_back("-fno-elide-constructors");
2470
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002471 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002472 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2473 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002474 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002475
Tony Linthicum76329bf2011-12-12 21:14:55 +00002476 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002477 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002478 options::OPT_fno_short_enums,
2479 getToolChain().getTriple().getArch() ==
2480 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002481 CmdArgs.push_back("-fshort-enums");
2482
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002483 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002484 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002485 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002486 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002487
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002488 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002489 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002490 options::OPT_fno_threadsafe_statics))
2491 CmdArgs.push_back("-fno-threadsafe-statics");
2492
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002493 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002494 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2495 options::OPT_fno_use_cxa_atexit,
2496 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002497 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002498 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2499 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002500 CmdArgs.push_back("-fno-use-cxa-atexit");
2501
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002502 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002503 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002504 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2505 CmdArgs.push_back("-fms-extensions");
2506
Chad Rosiered943242012-07-20 21:20:33 +00002507 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002508 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2509 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002510
Francois Pichet1b4f1632011-09-17 04:32:15 +00002511 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002512 if (Args.hasFlag(options::OPT_fms_compatibility,
2513 options::OPT_fno_ms_compatibility,
2514 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2515 Args.hasFlag(options::OPT_fms_extensions,
2516 options::OPT_fno_ms_extensions,
2517 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002518 CmdArgs.push_back("-fms-compatibility");
2519
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002520 // -fmsc-version=1300 is default.
2521 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2522 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2523 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002524 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002525 if (msc_ver.empty())
2526 CmdArgs.push_back("-fmsc-version=1300");
2527 else
2528 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2529 }
2530
2531
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002532 // -fborland-extensions=0 is default.
2533 if (Args.hasFlag(options::OPT_fborland_extensions,
2534 options::OPT_fno_borland_extensions, false))
2535 CmdArgs.push_back("-fborland-extensions");
2536
Francois Pichet02744872011-09-01 16:38:08 +00002537 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2538 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002539 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2540 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002541 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002542 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002543
Chandler Carruthe03aa552010-04-17 20:17:31 +00002544 // -fgnu-keywords default varies depending on language; only pass if
2545 // specified.
2546 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002547 options::OPT_fno_gnu_keywords))
2548 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002549
Rafael Espindola922a6242011-06-02 17:30:53 +00002550 if (Args.hasFlag(options::OPT_fgnu89_inline,
2551 options::OPT_fno_gnu89_inline,
2552 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002553 CmdArgs.push_back("-fgnu89-inline");
2554
Chad Rosier9c76d242012-03-15 22:31:42 +00002555 if (Args.hasArg(options::OPT_fno_inline))
2556 CmdArgs.push_back("-fno-inline");
2557
Chad Rosier64d6be92012-03-06 21:17:19 +00002558 if (Args.hasArg(options::OPT_fno_inline_functions))
2559 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002560
John McCall5fb5df92012-06-20 06:18:46 +00002561 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002562
John McCall5fb5df92012-06-20 06:18:46 +00002563 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2564 // legacy is the default.
2565 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002566 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2567 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002568 objcRuntime.isLegacyDispatchDefaultForArch(
2569 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002570 if (getToolChain().UseObjCMixedDispatch())
2571 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2572 else
2573 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2574 }
2575 }
2576
Nico Weber97bd94b2012-03-09 21:19:44 +00002577 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2578 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002579 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002580 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2581 }
2582
John McCall24fc0de2011-07-06 00:26:06 +00002583 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2584 // NOTE: This logic is duplicated in ToolChains.cpp.
2585 bool ARC = isObjCAutoRefCount(Args);
2586 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002587 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002588
John McCall24fc0de2011-07-06 00:26:06 +00002589 CmdArgs.push_back("-fobjc-arc");
2590
Chandler Carruth491db322011-11-04 07:34:47 +00002591 // FIXME: It seems like this entire block, and several around it should be
2592 // wrapped in isObjC, but for now we just use it here as this is where it
2593 // was being used previously.
2594 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2595 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2596 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2597 else
2598 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2599 }
2600
John McCall24fc0de2011-07-06 00:26:06 +00002601 // Allow the user to enable full exceptions code emission.
2602 // We define off for Objective-CC, on for Objective-C++.
2603 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2604 options::OPT_fno_objc_arc_exceptions,
2605 /*default*/ types::isCXX(InputType)))
2606 CmdArgs.push_back("-fobjc-arc-exceptions");
2607 }
2608
2609 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2610 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002611 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002612 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002613
John McCall24fc0de2011-07-06 00:26:06 +00002614 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2615 // takes precedence.
2616 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2617 if (!GCArg)
2618 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2619 if (GCArg) {
2620 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002621 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002622 << GCArg->getAsString(Args);
2623 } else if (getToolChain().SupportsObjCGC()) {
2624 GCArg->render(Args, CmdArgs);
2625 } else {
2626 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002627 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002628 << GCArg->getAsString(Args);
2629 }
2630 }
2631
John McCallb5f652e2011-06-22 00:53:57 +00002632 // Add exception args.
2633 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002634 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002635
2636 if (getToolChain().UseSjLjExceptions())
2637 CmdArgs.push_back("-fsjlj-exceptions");
2638
2639 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002640 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2641 options::OPT_fno_assume_sane_operator_new))
2642 CmdArgs.push_back("-fno-assume-sane-operator-new");
2643
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002644 // -fconstant-cfstrings is default, and may be subject to argument translation
2645 // on Darwin.
2646 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2647 options::OPT_fno_constant_cfstrings) ||
2648 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2649 options::OPT_mno_constant_cfstrings))
2650 CmdArgs.push_back("-fno-constant-cfstrings");
2651
John Thompsoned4e2952009-11-05 20:14:16 +00002652 // -fshort-wchar default varies depending on platform; only
2653 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002654 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2655 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002656
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002657 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2658 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002659 //
2660 // FIXME: This is gross; that translation should be pulled from the
2661 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002662 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002663 options::OPT_fno_pascal_strings,
2664 false) ||
2665 Args.hasFlag(options::OPT_mpascal_strings,
2666 options::OPT_mno_pascal_strings,
2667 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002668 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002669
Daniel Dunbar096ed292011-10-05 21:04:55 +00002670 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2671 // -fno-pack-struct doesn't apply to -fpack-struct=.
2672 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002673 std::string PackStructStr = "-fpack-struct=";
2674 PackStructStr += A->getValue(Args);
2675 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002676 } else if (Args.hasFlag(options::OPT_fpack_struct,
2677 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002678 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002679 }
2680
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002681 if (Args.hasArg(options::OPT_mkernel) ||
2682 Args.hasArg(options::OPT_fapple_kext)) {
2683 if (!Args.hasArg(options::OPT_fcommon))
2684 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002685 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002686 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002687
Daniel Dunbard18049a2009-04-07 21:16:11 +00002688 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002689 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002690 CmdArgs.push_back("-fno-common");
2691
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002692 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002693 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002694 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002695 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002696 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002697 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2698
Daniel Dunbar6358d682010-10-15 22:30:42 +00002699 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2700 if (!Args.hasFlag(options::OPT_ffor_scope,
2701 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002702 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002703 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2704
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002705 // -fcaret-diagnostics is default.
2706 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2707 options::OPT_fno_caret_diagnostics, true))
2708 CmdArgs.push_back("-fno-caret-diagnostics");
2709
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002710 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002711 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002712 options::OPT_fno_diagnostics_fixit_info))
2713 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002714
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002715 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002716 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002717 options::OPT_fno_diagnostics_show_option))
2718 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002719
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002720 if (const Arg *A =
2721 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2722 CmdArgs.push_back("-fdiagnostics-show-category");
2723 CmdArgs.push_back(A->getValue(Args));
2724 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002725
Douglas Gregor643c9222011-05-21 17:07:29 +00002726 if (const Arg *A =
2727 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2728 CmdArgs.push_back("-fdiagnostics-format");
2729 CmdArgs.push_back(A->getValue(Args));
2730 }
2731
Chandler Carruthb6766f02011-03-27 01:50:55 +00002732 if (Arg *A = Args.getLastArg(
2733 options::OPT_fdiagnostics_show_note_include_stack,
2734 options::OPT_fno_diagnostics_show_note_include_stack)) {
2735 if (A->getOption().matches(
2736 options::OPT_fdiagnostics_show_note_include_stack))
2737 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2738 else
2739 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2740 }
2741
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002742 // Color diagnostics are the default, unless the terminal doesn't support
2743 // them.
2744 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002745 options::OPT_fno_color_diagnostics,
2746 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002747 CmdArgs.push_back("-fcolor-diagnostics");
2748
Daniel Dunbardb097022009-06-08 21:13:54 +00002749 if (!Args.hasFlag(options::OPT_fshow_source_location,
2750 options::OPT_fno_show_source_location))
2751 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002752
Douglas Gregor643c9222011-05-21 17:07:29 +00002753 if (!Args.hasFlag(options::OPT_fshow_column,
2754 options::OPT_fno_show_column,
2755 true))
2756 CmdArgs.push_back("-fno-show-column");
2757
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002758 if (!Args.hasFlag(options::OPT_fspell_checking,
2759 options::OPT_fno_spell_checking))
2760 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002761
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002762
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002763 // Silently ignore -fasm-blocks for now.
2764 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2765 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002766
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002767 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2768 A->render(Args, CmdArgs);
2769
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002770 // -fdollars-in-identifiers default varies depending on platform and
2771 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002772 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002773 options::OPT_fno_dollars_in_identifiers)) {
2774 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002775 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002776 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002777 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002778 }
2779
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002780 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2781 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002782 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002783 options::OPT_fno_unit_at_a_time)) {
2784 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002785 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002786 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002787
Eli Friedman055c9702011-11-02 01:53:16 +00002788 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2789 options::OPT_fno_apple_pragma_pack, false))
2790 CmdArgs.push_back("-fapple-pragma-pack");
2791
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002792 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002793 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002794 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002795#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002796 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002797 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2798 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2799 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2800 CmdArgs.push_back("-fno-builtin-strcat");
2801 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2802 CmdArgs.push_back("-fno-builtin-strcpy");
2803 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002804#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002805
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002806 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002807 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002808 options::OPT_traditional_cpp)) {
2809 if (isa<PreprocessJobAction>(JA))
2810 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002811 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002812 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002813 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002814
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002815 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002816 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002817
2818 // Handle serialized diagnostics.
2819 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2820 CmdArgs.push_back("-serialize-diagnostic-file");
2821 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2822 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002823
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00002824 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
2825 CmdArgs.push_back("-fretain-comments-from-system-headers");
2826
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002827 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2828 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002829 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002830 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2831 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002832 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002833
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002834 // We translate this by hand to the -cc1 argument, since nightly test uses
2835 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002836 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002837 CmdArgs.push_back("-disable-llvm-optzns");
2838 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002839 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002840 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002841
Daniel Dunbard67a3222009-03-30 06:36:42 +00002842 if (Output.getType() == types::TY_Dependencies) {
2843 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002844 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002845 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002846 CmdArgs.push_back(Output.getFilename());
2847 } else {
2848 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002849 }
2850
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002851 for (InputInfoList::const_iterator
2852 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2853 const InputInfo &II = *it;
2854 CmdArgs.push_back("-x");
Fariborz Jahanian659bc4a2012-09-28 19:05:17 +00002855 if (Args.hasArg(options::OPT_rewrite_objc))
2856 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2857 else
2858 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002859 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002860 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002861 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002862 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002863 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002864
Chris Lattnere9d7d782009-11-03 19:50:27 +00002865 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2866
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002867 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002868
2869 // Optionally embed the -cc1 level arguments into the debug info, for build
2870 // analysis.
2871 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002872 ArgStringList OriginalArgs;
2873 for (ArgList::const_iterator it = Args.begin(),
2874 ie = Args.end(); it != ie; ++it)
2875 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002876
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002877 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002878 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002879 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002880 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002881 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002882 }
2883 CmdArgs.push_back("-dwarf-debug-flags");
2884 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2885 }
2886
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002887 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002888
Roman Divacky178e01602011-02-10 16:52:03 +00002889 if (Arg *A = Args.getLastArg(options::OPT_pg))
2890 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002891 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002892 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002893
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002894 // Claim some arguments which clang supports automatically.
2895
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002896 // -fpch-preprocess is used with gcc to add a special marker in the output to
2897 // include the PCH file. Clang's PTH solution is completely transparent, so we
2898 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002899 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002900
Daniel Dunbar17731772009-03-23 19:03:36 +00002901 // Claim some arguments which clang doesn't support, but we don't
2902 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002903 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2904 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002905
Rafael Espindolad95a8122011-03-01 05:25:27 +00002906 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002907 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002908 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002909}
2910
Jim Grosbach576452b2012-02-10 20:37:10 +00002911void ClangAs::AddARMTargetArgs(const ArgList &Args,
2912 ArgStringList &CmdArgs) const {
2913 const Driver &D = getToolChain().getDriver();
2914 llvm::Triple Triple = getToolChain().getTriple();
2915
2916 // Set the CPU based on -march= and -mcpu=.
2917 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002918 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002919
2920 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002921 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002922 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002923
2924 // Honor -mfpmath=.
2925 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002926 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002927}
2928
John McCall5fb5df92012-06-20 06:18:46 +00002929/// Add options related to the Objective-C runtime/ABI.
2930///
2931/// Returns true if the runtime is non-fragile.
2932ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2933 ArgStringList &cmdArgs,
2934 RewriteKind rewriteKind) const {
2935 // Look for the controlling runtime option.
2936 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2937 options::OPT_fgnu_runtime,
2938 options::OPT_fobjc_runtime_EQ);
2939
2940 // Just forward -fobjc-runtime= to the frontend. This supercedes
2941 // options about fragility.
2942 if (runtimeArg &&
2943 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2944 ObjCRuntime runtime;
2945 StringRef value = runtimeArg->getValue(args);
2946 if (runtime.tryParse(value)) {
2947 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2948 << value;
2949 }
2950
2951 runtimeArg->render(args, cmdArgs);
2952 return runtime;
2953 }
2954
2955 // Otherwise, we'll need the ABI "version". Version numbers are
2956 // slightly confusing for historical reasons:
2957 // 1 - Traditional "fragile" ABI
2958 // 2 - Non-fragile ABI, version 1
2959 // 3 - Non-fragile ABI, version 2
2960 unsigned objcABIVersion = 1;
2961 // If -fobjc-abi-version= is present, use that to set the version.
2962 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2963 StringRef value = abiArg->getValue(args);
2964 if (value == "1")
2965 objcABIVersion = 1;
2966 else if (value == "2")
2967 objcABIVersion = 2;
2968 else if (value == "3")
2969 objcABIVersion = 3;
2970 else
2971 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2972 << value;
2973 } else {
2974 // Otherwise, determine if we are using the non-fragile ABI.
2975 bool nonFragileABIIsDefault =
2976 (rewriteKind == RK_NonFragile ||
2977 (rewriteKind == RK_None &&
2978 getToolChain().IsObjCNonFragileABIDefault()));
2979 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2980 options::OPT_fno_objc_nonfragile_abi,
2981 nonFragileABIIsDefault)) {
2982 // Determine the non-fragile ABI version to use.
2983#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2984 unsigned nonFragileABIVersion = 1;
2985#else
2986 unsigned nonFragileABIVersion = 2;
2987#endif
2988
2989 if (Arg *abiArg = args.getLastArg(
2990 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2991 StringRef value = abiArg->getValue(args);
2992 if (value == "1")
2993 nonFragileABIVersion = 1;
2994 else if (value == "2")
2995 nonFragileABIVersion = 2;
2996 else
2997 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2998 << value;
2999 }
3000
3001 objcABIVersion = 1 + nonFragileABIVersion;
3002 } else {
3003 objcABIVersion = 1;
3004 }
3005 }
3006
3007 // We don't actually care about the ABI version other than whether
3008 // it's non-fragile.
3009 bool isNonFragile = objcABIVersion != 1;
3010
3011 // If we have no runtime argument, ask the toolchain for its default runtime.
3012 // However, the rewriter only really supports the Mac runtime, so assume that.
3013 ObjCRuntime runtime;
3014 if (!runtimeArg) {
3015 switch (rewriteKind) {
3016 case RK_None:
3017 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3018 break;
3019 case RK_Fragile:
3020 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
3021 break;
3022 case RK_NonFragile:
3023 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3024 break;
3025 }
3026
3027 // -fnext-runtime
3028 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3029 // On Darwin, make this use the default behavior for the toolchain.
3030 if (getToolChain().getTriple().isOSDarwin()) {
3031 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3032
3033 // Otherwise, build for a generic macosx port.
3034 } else {
3035 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3036 }
3037
3038 // -fgnu-runtime
3039 } else {
3040 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003041 // Legacy behaviour is to target the gnustep runtime if we are i
3042 // non-fragile mode or the GCC runtime in fragile mode.
3043 if (isNonFragile)
3044 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3045 else
3046 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003047 }
3048
3049 cmdArgs.push_back(args.MakeArgString(
3050 "-fobjc-runtime=" + runtime.getAsString()));
3051 return runtime;
3052}
3053
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003054void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003055 const InputInfo &Output,
3056 const InputInfoList &Inputs,
3057 const ArgList &Args,
3058 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003059 ArgStringList CmdArgs;
3060
3061 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3062 const InputInfo &Input = Inputs[0];
3063
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003064 // Don't warn about "clang -w -c foo.s"
3065 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003066 // and "clang -emit-llvm -c foo.s"
3067 Args.ClaimAllArgs(options::OPT_emit_llvm);
3068 // and "clang -use-gold-plugin -c foo.s"
3069 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003070
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003071 // Invoke ourselves in -cc1as mode.
3072 //
3073 // FIXME: Implement custom jobs for internal actions.
3074 CmdArgs.push_back("-cc1as");
3075
3076 // Add the "effective" target triple.
3077 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003078 std::string TripleStr =
3079 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003080 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3081
3082 // Set the output mode, we currently only expect to be used as a real
3083 // assembler.
3084 CmdArgs.push_back("-filetype");
3085 CmdArgs.push_back("obj");
3086
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003087 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003088 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003089
Jim Grosbach576452b2012-02-10 20:37:10 +00003090 // Add target specific cpu and features flags.
3091 switch(getToolChain().getTriple().getArch()) {
3092 default:
3093 break;
3094
3095 case llvm::Triple::arm:
3096 case llvm::Triple::thumb:
3097 AddARMTargetArgs(Args, CmdArgs);
3098 break;
3099 }
3100
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003101 // Ignore explicit -force_cpusubtype_ALL option.
3102 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003103
Eric Christopherfc3ee562012-01-10 00:38:01 +00003104 // Determine the original source input.
3105 const Action *SourceAction = &JA;
3106 while (SourceAction->getKind() != Action::InputClass) {
3107 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3108 SourceAction = SourceAction->getInputs()[0];
3109 }
3110
3111 // Forward -g, assuming we are dealing with an actual assembly file.
3112 if (SourceAction->getType() == types::TY_Asm ||
3113 SourceAction->getType() == types::TY_PP_Asm) {
3114 Args.ClaimAllArgs(options::OPT_g_Group);
3115 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3116 if (!A->getOption().matches(options::OPT_g0))
3117 CmdArgs.push_back("-g");
3118 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003119
3120 // Optionally embed the -cc1as level arguments into the debug info, for build
3121 // analysis.
3122 if (getToolChain().UseDwarfDebugFlags()) {
3123 ArgStringList OriginalArgs;
3124 for (ArgList::const_iterator it = Args.begin(),
3125 ie = Args.end(); it != ie; ++it)
3126 (*it)->render(Args, OriginalArgs);
3127
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003128 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003129 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3130 Flags += Exec;
3131 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3132 Flags += " ";
3133 Flags += OriginalArgs[i];
3134 }
3135 CmdArgs.push_back("-dwarf-debug-flags");
3136 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3137 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003138
3139 // FIXME: Add -static support, once we have it.
3140
3141 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3142 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003143 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003144
3145 assert(Output.isFilename() && "Unexpected lipo output.");
3146 CmdArgs.push_back("-o");
3147 CmdArgs.push_back(Output.getFilename());
3148
Daniel Dunbarb440f562010-08-02 02:38:21 +00003149 assert(Input.isFilename() && "Invalid input.");
3150 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003151
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003152 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003153 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003154}
3155
Daniel Dunbara3246a02009-03-18 08:07:30 +00003156void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 const InputInfo &Output,
3158 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003159 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003160 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003161 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003162 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003163
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003164 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003165 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003166 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003167 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003168 // Don't forward any -g arguments to assembly steps.
3169 if (isa<AssembleJobAction>(JA) &&
3170 A->getOption().matches(options::OPT_g_Group))
3171 continue;
3172
Daniel Dunbar2da02722009-03-19 07:55:12 +00003173 // It is unfortunate that we have to claim here, as this means
3174 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003175 // platforms using a generic gcc, even if we are just using gcc
3176 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003177 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003178 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003179 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003180 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003181
Daniel Dunbar4e295052010-01-25 22:35:08 +00003182 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003183
3184 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003185 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003186 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003187 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003188
3189 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003190 if (Arch == "powerpc")
3191 CmdArgs.push_back("ppc");
3192 else if (Arch == "powerpc64")
3193 CmdArgs.push_back("ppc64");
3194 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003195 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003196 }
3197
Daniel Dunbar5716d872009-05-02 21:41:52 +00003198 // Try to force gcc to match the tool chain we want, if we recognize
3199 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003200 //
3201 // FIXME: The triple class should directly provide the information we want
3202 // here.
3203 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003204 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003205 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003206 CmdArgs.push_back("-m64");
3207
Daniel Dunbarb440f562010-08-02 02:38:21 +00003208 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003209 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003210 CmdArgs.push_back(Output.getFilename());
3211 } else {
3212 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003213 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003214 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003215
Tony Linthicum76329bf2011-12-12 21:14:55 +00003216 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3217 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003218
3219 // Only pass -x if gcc will understand it; otherwise hope gcc
3220 // understands the suffix correctly. The main use case this would go
3221 // wrong in is for linker inputs if they happened to have an odd
3222 // suffix; really the only way to get this to happen is a command
3223 // like '-x foobar a.c' which will treat a.c like a linker input.
3224 //
3225 // FIXME: For the linker case specifically, can we safely convert
3226 // inputs into '-Wl,' options?
3227 for (InputInfoList::const_iterator
3228 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3229 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003230
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003231 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003232 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3233 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003234 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003235 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003236 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003237 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003238 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003239
Daniel Dunbara3246a02009-03-18 08:07:30 +00003240 if (types::canTypeBeUserSpecified(II.getType())) {
3241 CmdArgs.push_back("-x");
3242 CmdArgs.push_back(types::getTypeName(II.getType()));
3243 }
3244
Daniel Dunbarb440f562010-08-02 02:38:21 +00003245 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003246 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003247 else {
3248 const Arg &A = II.getInputArg();
3249
3250 // Reverse translate some rewritten options.
3251 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3252 CmdArgs.push_back("-lstdc++");
3253 continue;
3254 }
3255
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003256 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003257 A.render(Args, CmdArgs);
3258 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003259 }
3260
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003261 const std::string customGCCName = D.getCCCGenericGCCName();
3262 const char *GCCName;
3263 if (!customGCCName.empty())
3264 GCCName = customGCCName.c_str();
3265 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003266 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003267 } else
3268 GCCName = "gcc";
3269
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003270 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003271 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003272 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003273}
3274
Daniel Dunbar4e295052010-01-25 22:35:08 +00003275void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3276 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003277 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003278}
3279
Daniel Dunbar4e295052010-01-25 22:35:08 +00003280void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3281 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003282 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003283}
3284
Daniel Dunbar4e295052010-01-25 22:35:08 +00003285void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3286 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003287 const Driver &D = getToolChain().getDriver();
3288
Daniel Dunbar4e295052010-01-25 22:35:08 +00003289 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003290 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3291 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003292 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003293 else {
3294 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003295 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003296 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003297
Daniel Dunbar4e295052010-01-25 22:35:08 +00003298 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003299 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003300}
3301
Daniel Dunbar4e295052010-01-25 22:35:08 +00003302void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3303 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003304 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003305}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003306
Daniel Dunbar4e295052010-01-25 22:35:08 +00003307void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3308 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003309 // The types are (hopefully) good enough.
3310}
3311
Tony Linthicum76329bf2011-12-12 21:14:55 +00003312// Hexagon tools start.
3313void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3314 ArgStringList &CmdArgs) const {
3315
3316}
3317void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3318 const InputInfo &Output,
3319 const InputInfoList &Inputs,
3320 const ArgList &Args,
3321 const char *LinkingOutput) const {
3322
3323 const Driver &D = getToolChain().getDriver();
3324 ArgStringList CmdArgs;
3325
3326 std::string MarchString = "-march=";
3327 MarchString += getHexagonTargetCPU(Args);
3328 CmdArgs.push_back(Args.MakeArgString(MarchString));
3329
3330 RenderExtraToolArgs(JA, CmdArgs);
3331
3332 if (Output.isFilename()) {
3333 CmdArgs.push_back("-o");
3334 CmdArgs.push_back(Output.getFilename());
3335 } else {
3336 assert(Output.isNothing() && "Unexpected output");
3337 CmdArgs.push_back("-fsyntax-only");
3338 }
3339
3340
3341 // Only pass -x if gcc will understand it; otherwise hope gcc
3342 // understands the suffix correctly. The main use case this would go
3343 // wrong in is for linker inputs if they happened to have an odd
3344 // suffix; really the only way to get this to happen is a command
3345 // like '-x foobar a.c' which will treat a.c like a linker input.
3346 //
3347 // FIXME: For the linker case specifically, can we safely convert
3348 // inputs into '-Wl,' options?
3349 for (InputInfoList::const_iterator
3350 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3351 const InputInfo &II = *it;
3352
3353 // Don't try to pass LLVM or AST inputs to a generic gcc.
3354 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3355 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3356 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3357 << getToolChain().getTripleString();
3358 else if (II.getType() == types::TY_AST)
3359 D.Diag(clang::diag::err_drv_no_ast_support)
3360 << getToolChain().getTripleString();
3361
3362 if (II.isFilename())
3363 CmdArgs.push_back(II.getFilename());
3364 else
3365 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3366 II.getInputArg().render(Args, CmdArgs);
3367 }
3368
3369 const char *GCCName = "hexagon-as";
3370 const char *Exec =
3371 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3372 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3373
3374}
3375void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3376 ArgStringList &CmdArgs) const {
3377 // The types are (hopefully) good enough.
3378}
3379
3380void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3381 const InputInfo &Output,
3382 const InputInfoList &Inputs,
3383 const ArgList &Args,
3384 const char *LinkingOutput) const {
3385
3386 const Driver &D = getToolChain().getDriver();
3387 ArgStringList CmdArgs;
3388
3389 for (ArgList::const_iterator
3390 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3391 Arg *A = *it;
3392 if (A->getOption().hasForwardToGCC()) {
3393 // Don't forward any -g arguments to assembly steps.
3394 if (isa<AssembleJobAction>(JA) &&
3395 A->getOption().matches(options::OPT_g_Group))
3396 continue;
3397
3398 // It is unfortunate that we have to claim here, as this means
3399 // we will basically never report anything interesting for
3400 // platforms using a generic gcc, even if we are just using gcc
3401 // to get to the assembler.
3402 A->claim();
3403 A->render(Args, CmdArgs);
3404 }
3405 }
3406
3407 RenderExtraToolArgs(JA, CmdArgs);
3408
3409 // Add Arch Information
3410 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003411 if ((A = getLastHexagonArchArg(Args))) {
3412 if (A->getOption().matches(options::OPT_m_Joined))
3413 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003414 else
Sebastian Pop86500282012-01-13 20:37:10 +00003415 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003416 }
Sebastian Pop86500282012-01-13 20:37:10 +00003417 else {
3418 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3419 }
3420
Tony Linthicum76329bf2011-12-12 21:14:55 +00003421 CmdArgs.push_back("-mqdsp6-compat");
3422
3423 const char *GCCName;
3424 if (C.getDriver().CCCIsCXX)
3425 GCCName = "hexagon-g++";
3426 else
3427 GCCName = "hexagon-gcc";
3428 const char *Exec =
3429 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3430
3431 if (Output.isFilename()) {
3432 CmdArgs.push_back("-o");
3433 CmdArgs.push_back(Output.getFilename());
3434 }
3435
3436 for (InputInfoList::const_iterator
3437 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3438 const InputInfo &II = *it;
3439
3440 // Don't try to pass LLVM or AST inputs to a generic gcc.
3441 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3442 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3443 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3444 << getToolChain().getTripleString();
3445 else if (II.getType() == types::TY_AST)
3446 D.Diag(clang::diag::err_drv_no_ast_support)
3447 << getToolChain().getTripleString();
3448
3449 if (II.isFilename())
3450 CmdArgs.push_back(II.getFilename());
3451 else
3452 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3453 II.getInputArg().render(Args, CmdArgs);
3454 }
3455 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3456
3457}
3458// Hexagon tools end.
3459
3460
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003461const char *darwin::CC1::getCC1Name(types::ID Type) const {
3462 switch (Type) {
3463 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003464 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003465 case types::TY_Asm:
3466 case types::TY_C: case types::TY_CHeader:
3467 case types::TY_PP_C: case types::TY_PP_CHeader:
3468 return "cc1";
3469 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003470 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3471 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003472 return "cc1obj";
3473 case types::TY_CXX: case types::TY_CXXHeader:
3474 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3475 return "cc1plus";
3476 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003477 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3478 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003479 return "cc1objplus";
3480 }
3481}
3482
David Blaikie68e081d2011-12-20 02:48:34 +00003483void darwin::CC1::anchor() {}
3484
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003485const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003486 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003487 return Args.MakeArgString(
3488 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003489}
3490
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003491const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003492 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003493 const char *Str = getBaseInputName(Args, Inputs);
3494
Chris Lattner906bb902011-01-16 08:14:11 +00003495 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003496 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003497
3498 return Str;
3499}
3500
3501const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003502darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003503 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003504 // FIXME: Think about this more.
3505 std::string Res;
3506
3507 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3508 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003509 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003510 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003511 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003512 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003513 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003514}
3515
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003516void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003517 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003518 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003519
3520 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003521 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003522
Bob Wilson7ecbd322012-02-07 01:17:55 +00003523 // Erase both -fmodule-cache-path and its argument.
3524 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3525 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003526 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003527 continue;
3528 }
3529
Bob Wilson7ecbd322012-02-07 01:17:55 +00003530 // Remove unsupported -f options.
3531 if (Option.startswith("-f")) {
3532 // Remove -f/-fno- to reduce the number of cases.
3533 if (Option.startswith("-fno-"))
3534 Option = Option.substr(5);
3535 else
3536 Option = Option.substr(2);
3537 RemoveOption = llvm::StringSwitch<bool>(Option)
3538 .Case("altivec", true)
3539 .Case("modules", true)
3540 .Case("diagnostics-show-note-include-stack", true)
3541 .Default(false);
3542 }
3543
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003544 // Handle machine specific options.
3545 if (Option.startswith("-m")) {
3546 RemoveOption = llvm::StringSwitch<bool>(Option)
3547 .Case("-mthumb", true)
3548 .Case("-mno-thumb", true)
3549 .Case("-mno-fused-madd", true)
3550 .Case("-mlong-branch", true)
3551 .Case("-mlongcall", true)
3552 .Case("-mcpu=G4", true)
3553 .Case("-mcpu=G5", true)
3554 .Default(false);
3555 }
3556
3557 // Handle warning options.
3558 if (Option.startswith("-W")) {
3559 // Remove -W/-Wno- to reduce the number of cases.
3560 if (Option.startswith("-Wno-"))
3561 Option = Option.substr(5);
3562 else
3563 Option = Option.substr(2);
3564
3565 RemoveOption = llvm::StringSwitch<bool>(Option)
3566 .Case("address-of-temporary", true)
3567 .Case("ambiguous-member-template", true)
3568 .Case("analyzer-incompatible-plugin", true)
3569 .Case("array-bounds", true)
3570 .Case("array-bounds-pointer-arithmetic", true)
3571 .Case("bind-to-temporary-copy", true)
3572 .Case("bitwise-op-parentheses", true)
3573 .Case("bool-conversions", true)
3574 .Case("builtin-macro-redefined", true)
3575 .Case("c++-hex-floats", true)
3576 .Case("c++0x-compat", true)
3577 .Case("c++0x-extensions", true)
3578 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003579 .Case("c++11-compat", true)
3580 .Case("c++11-extensions", true)
3581 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003582 .Case("conditional-uninitialized", true)
3583 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003584 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003585 .Case("CFString-literal", true)
3586 .Case("constant-logical-operand", true)
3587 .Case("custom-atomic-properties", true)
3588 .Case("default-arg-special-member", true)
3589 .Case("delegating-ctor-cycles", true)
3590 .Case("delete-non-virtual-dtor", true)
3591 .Case("deprecated-implementations", true)
3592 .Case("deprecated-writable-strings", true)
3593 .Case("distributed-object-modifiers", true)
3594 .Case("duplicate-method-arg", true)
3595 .Case("dynamic-class-memaccess", true)
3596 .Case("enum-compare", true)
3597 .Case("exit-time-destructors", true)
3598 .Case("gnu", true)
3599 .Case("gnu-designator", true)
3600 .Case("header-hygiene", true)
3601 .Case("idiomatic-parentheses", true)
3602 .Case("ignored-qualifiers", true)
3603 .Case("implicit-atomic-properties", true)
3604 .Case("incompatible-pointer-types", true)
3605 .Case("incomplete-implementation", true)
3606 .Case("initializer-overrides", true)
3607 .Case("invalid-noreturn", true)
3608 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003609 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003610 .Case("literal-conversion", true)
3611 .Case("literal-range", true)
3612 .Case("local-type-template-args", true)
3613 .Case("logical-op-parentheses", true)
3614 .Case("method-signatures", true)
3615 .Case("microsoft", true)
3616 .Case("mismatched-tags", true)
3617 .Case("missing-method-return-type", true)
3618 .Case("non-pod-varargs", true)
3619 .Case("nonfragile-abi2", true)
3620 .Case("null-arithmetic", true)
3621 .Case("null-dereference", true)
3622 .Case("out-of-line-declaration", true)
3623 .Case("overriding-method-mismatch", true)
3624 .Case("readonly-setter-attrs", true)
3625 .Case("return-stack-address", true)
3626 .Case("self-assign", true)
3627 .Case("semicolon-before-method-body", true)
3628 .Case("sentinel", true)
3629 .Case("shift-overflow", true)
3630 .Case("shift-sign-overflow", true)
3631 .Case("sign-conversion", true)
3632 .Case("sizeof-array-argument", true)
3633 .Case("sizeof-pointer-memaccess", true)
3634 .Case("string-compare", true)
3635 .Case("super-class-method-mismatch", true)
3636 .Case("tautological-compare", true)
3637 .Case("typedef-redefinition", true)
3638 .Case("typename-missing", true)
3639 .Case("undefined-reinterpret-cast", true)
3640 .Case("unknown-warning-option", true)
3641 .Case("unnamed-type-template-args", true)
3642 .Case("unneeded-internal-declaration", true)
3643 .Case("unneeded-member-function", true)
3644 .Case("unused-comparison", true)
3645 .Case("unused-exception-parameter", true)
3646 .Case("unused-member-function", true)
3647 .Case("unused-result", true)
3648 .Case("vector-conversions", true)
3649 .Case("vla", true)
3650 .Case("used-but-marked-unused", true)
3651 .Case("weak-vtables", true)
3652 .Default(false);
3653 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003654 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003655 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003656 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003657 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003658 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003659 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003660 }
3661}
3662
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003663void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003664 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003665 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003666
3667 CheckCodeGenerationOptions(D, Args);
3668
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003669 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003670 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3671 !Args.hasArg(options::OPT_mdynamic_no_pic))
3672 CmdArgs.push_back("-fPIC");
3673
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003674 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3675 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3676 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3677 CmdArgs.push_back("-fno-builtin-strcat");
3678 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3679 CmdArgs.push_back("-fno-builtin-strcpy");
3680 }
3681
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003682 if (Args.hasArg(options::OPT_g_Flag) &&
3683 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3684 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3685}
3686
3687void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3688 const InputInfoList &Inputs,
3689 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003690 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003691
3692 // Derived from cc1_options spec.
3693 if (Args.hasArg(options::OPT_fast) ||
3694 Args.hasArg(options::OPT_fastf) ||
3695 Args.hasArg(options::OPT_fastcp))
3696 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003697
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003698 if (Arg *A = Args.getLastArg(options::OPT_pg))
3699 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003700 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003701 << A->getAsString(Args) << "-fomit-frame-pointer";
3702
3703 AddCC1Args(Args, CmdArgs);
3704
3705 if (!Args.hasArg(options::OPT_Q))
3706 CmdArgs.push_back("-quiet");
3707
3708 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003709 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003710
3711 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3712
3713 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3714 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3715
3716 // FIXME: The goal is to use the user provided -o if that is our
3717 // final output, otherwise to drive from the original input
3718 // name. Find a clean way to go about this.
3719 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3720 Args.hasArg(options::OPT_o)) {
3721 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3722 CmdArgs.push_back("-auxbase-strip");
3723 CmdArgs.push_back(OutputOpt->getValue(Args));
3724 } else {
3725 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003726 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003727 }
3728
3729 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3730
3731 Args.AddAllArgs(CmdArgs, options::OPT_O);
3732 // FIXME: -Wall is getting some special treatment. Investigate.
3733 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3734 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003735 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003736 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003737 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3738 // Honor -std-default.
3739 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3740 "-std=", /*Joined=*/true);
3741 }
3742
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003743 if (Args.hasArg(options::OPT_v))
3744 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003745 if (Args.hasArg(options::OPT_pg) &&
3746 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003747 CmdArgs.push_back("-p");
3748 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003749
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003750 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003751 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3752 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3753 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3754 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3755 //
3756 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003757 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3758 options::OPT_fsyntax_only),
3759 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003760 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3761 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3762 (*it)->claim();
3763 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003764 }
3765 }
3766 } else
3767 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003768
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003769 // Claim Clang only -f options, they aren't worth warning about.
3770 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3771
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003772 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3773 if (Args.hasArg(options::OPT_Qn))
3774 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003775
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003776 // FIXME: This isn't correct.
3777 //Args.AddLastArg(CmdArgs, options::OPT__help)
3778 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3779
3780 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3781
3782 // FIXME: Still don't get what is happening here. Investigate.
3783 Args.AddAllArgs(CmdArgs, options::OPT__param);
3784
3785 if (Args.hasArg(options::OPT_fmudflap) ||
3786 Args.hasArg(options::OPT_fmudflapth)) {
3787 CmdArgs.push_back("-fno-builtin");
3788 CmdArgs.push_back("-fno-merge-constants");
3789 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003790
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003791 if (Args.hasArg(options::OPT_coverage)) {
3792 CmdArgs.push_back("-fprofile-arcs");
3793 CmdArgs.push_back("-ftest-coverage");
3794 }
3795
3796 if (types::isCXX(Inputs[0].getType()))
3797 CmdArgs.push_back("-D__private_extern__=extern");
3798}
3799
3800void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3801 const InputInfoList &Inputs,
3802 const ArgStringList &OutputArgs) const {
3803 // Derived from cpp_options
3804 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003805
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003806 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3807
3808 AddCC1Args(Args, CmdArgs);
3809
3810 // NOTE: The code below has some commonality with cpp_options, but
3811 // in classic gcc style ends up sending things in different
3812 // orders. This may be a good merge candidate once we drop pedantic
3813 // compatibility.
3814
3815 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003816 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003817 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003818 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3819 // Honor -std-default.
3820 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3821 "-std=", /*Joined=*/true);
3822 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003823 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3824 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003825
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003826 // The driver treats -fsyntax-only specially.
3827 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3828
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003829 // Claim Clang only -f options, they aren't worth warning about.
3830 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3831
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003832 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3833 !Args.hasArg(options::OPT_fno_working_directory))
3834 CmdArgs.push_back("-fworking-directory");
3835
3836 Args.AddAllArgs(CmdArgs, options::OPT_O);
3837 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3838 if (Args.hasArg(options::OPT_save_temps))
3839 CmdArgs.push_back("-fpch-preprocess");
3840}
3841
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003842void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003843 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003844 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003845 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003846
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003847 CheckPreprocessingOptions(D, Args);
3848
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003849 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003850 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3851 Args.AddLastArg(CmdArgs, options::OPT_C);
3852 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003853 if (!Args.hasArg(options::OPT_Q))
3854 CmdArgs.push_back("-quiet");
3855 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003856 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003857 Args.AddLastArg(CmdArgs, options::OPT_v);
3858 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3859 Args.AddLastArg(CmdArgs, options::OPT_P);
3860
3861 // FIXME: Handle %I properly.
3862 if (getToolChain().getArchName() == "x86_64") {
3863 CmdArgs.push_back("-imultilib");
3864 CmdArgs.push_back("x86_64");
3865 }
3866
3867 if (Args.hasArg(options::OPT_MD)) {
3868 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003869 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003870 }
3871
3872 if (Args.hasArg(options::OPT_MMD)) {
3873 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003874 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003875 }
3876
3877 Args.AddLastArg(CmdArgs, options::OPT_M);
3878 Args.AddLastArg(CmdArgs, options::OPT_MM);
3879 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3880 Args.AddLastArg(CmdArgs, options::OPT_MG);
3881 Args.AddLastArg(CmdArgs, options::OPT_MP);
3882 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3883 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3884 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3885 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3886 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3887 CmdArgs.push_back("-MQ");
3888 CmdArgs.push_back(OutputOpt->getValue(Args));
3889 }
3890 }
3891
3892 Args.AddLastArg(CmdArgs, options::OPT_remap);
3893 if (Args.hasArg(options::OPT_g3))
3894 CmdArgs.push_back("-dD");
3895 Args.AddLastArg(CmdArgs, options::OPT_H);
3896
3897 AddCPPArgs(Args, CmdArgs);
3898
3899 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3900 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3901
3902 for (InputInfoList::const_iterator
3903 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3904 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003905
Daniel Dunbarb440f562010-08-02 02:38:21 +00003906 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003907 }
3908
3909 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3910 options::OPT_Xpreprocessor);
3911
3912 if (Args.hasArg(options::OPT_fmudflap)) {
3913 CmdArgs.push_back("-D_MUDFLAP");
3914 CmdArgs.push_back("-include");
3915 CmdArgs.push_back("mf-runtime.h");
3916 }
3917
3918 if (Args.hasArg(options::OPT_fmudflapth)) {
3919 CmdArgs.push_back("-D_MUDFLAP");
3920 CmdArgs.push_back("-D_MUDFLAPTH");
3921 CmdArgs.push_back("-include");
3922 CmdArgs.push_back("mf-runtime.h");
3923 }
3924}
3925
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003926void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003927 ArgStringList &CmdArgs) const {
3928 // Derived from cpp spec.
3929
3930 if (Args.hasArg(options::OPT_static)) {
3931 // The gcc spec is broken here, it refers to dynamic but
3932 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003933
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003934 // if (!Args.hasArg(arglist.parser.dynamicOption))
3935 CmdArgs.push_back("-D__STATIC__");
3936 } else
3937 CmdArgs.push_back("-D__DYNAMIC__");
3938
3939 if (Args.hasArg(options::OPT_pthread))
3940 CmdArgs.push_back("-D_REENTRANT");
3941}
3942
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003943void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003944 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003945 const InputInfoList &Inputs,
3946 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003947 const char *LinkingOutput) const {
3948 ArgStringList CmdArgs;
3949
3950 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3951
3952 CmdArgs.push_back("-E");
3953
3954 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003955 Args.hasArg(options::OPT_traditional_cpp))
3956 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003957
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003958 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003959 assert(Output.isFilename() && "Unexpected CC1 output.");
3960 OutputArgs.push_back("-o");
3961 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003962
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003963 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003964 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3965 } else {
3966 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3967 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3968 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003969
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003970 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3971
Chad Rosierc31e48d2011-09-08 00:38:00 +00003972 RemoveCC1UnsupportedArgs(CmdArgs);
3973
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003974 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003975 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003976 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003977 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003978}
3979
3980void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003981 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003982 const InputInfoList &Inputs,
3983 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003984 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003985 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003986 ArgStringList CmdArgs;
3987
3988 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3989
Bob Wilson0090df22012-04-01 23:03:29 +00003990 // Silence warning about unused --serialize-diagnostics
3991 Args.ClaimAllArgs(options::OPT__serialize_diags);
3992
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003993 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003994 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003995 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003996 << A->getAsString(Args) << "-E";
3997
Daniel Dunbar24e52992010-06-07 23:28:45 +00003998 if (JA.getType() == types::TY_LLVM_IR ||
3999 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004000 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00004001 else if (JA.getType() == types::TY_LLVM_BC ||
4002 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004003 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004004 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004005 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004006 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00004007 else if (JA.getType() != types::TY_PP_Asm &&
4008 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004009 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004010 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004011
4012 ArgStringList OutputArgs;
4013 if (Output.getType() != types::TY_PCH) {
4014 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004015 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004016 OutputArgs.push_back("/dev/null");
4017 else
4018 OutputArgs.push_back(Output.getFilename());
4019 }
4020
4021 // There is no need for this level of compatibility, but it makes
4022 // diffing easier.
4023 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
4024 Args.hasArg(options::OPT_S));
4025
4026 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004027 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004028 if (OutputArgsEarly) {
4029 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4030 } else {
4031 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4032 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4033 }
4034 } else {
4035 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004036
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004037 for (InputInfoList::const_iterator
4038 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4039 const InputInfo &II = *it;
4040
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004041 // Reject AST inputs.
4042 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004043 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004044 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004045 return;
4046 }
4047
Daniel Dunbarb440f562010-08-02 02:38:21 +00004048 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004049 }
4050
4051 if (OutputArgsEarly) {
4052 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4053 } else {
4054 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4055 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4056 }
4057 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004058
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004059 if (Output.getType() == types::TY_PCH) {
4060 assert(Output.isFilename() && "Invalid PCH output.");
4061
4062 CmdArgs.push_back("-o");
4063 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4064 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004065 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004066 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004067 C.addTempFile(TmpPath);
4068 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004069
Eric Christopher84fbdb42011-08-19 00:30:14 +00004070 // If we're emitting a pch file with the last 4 characters of ".pth"
4071 // and falling back to llvm-gcc we want to use ".gch" instead.
4072 std::string OutputFile(Output.getFilename());
4073 size_t loc = OutputFile.rfind(".pth");
4074 if (loc != std::string::npos)
4075 OutputFile.replace(loc, 4, ".gch");
4076 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4077 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004078 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004079
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004080 RemoveCC1UnsupportedArgs(CmdArgs);
4081
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004082 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004083 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004084 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004085 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004086}
4087
Daniel Dunbarbe220842009-03-20 16:06:39 +00004088void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004089 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004090 const InputInfoList &Inputs,
4091 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004092 const char *LinkingOutput) const {
4093 ArgStringList CmdArgs;
4094
4095 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4096 const InputInfo &Input = Inputs[0];
4097
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004098 // Determine the original source input.
4099 const Action *SourceAction = &JA;
4100 while (SourceAction->getKind() != Action::InputClass) {
4101 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4102 SourceAction = SourceAction->getInputs()[0];
4103 }
4104
4105 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004106 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004107 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004108 if (Args.hasArg(options::OPT_gstabs))
4109 CmdArgs.push_back("--gstabs");
4110 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004111 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004112 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004113
Daniel Dunbarbe220842009-03-20 16:06:39 +00004114 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004115 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004116
Daniel Dunbar6d484762010-07-22 01:47:22 +00004117 // Use -force_cpusubtype_ALL on x86 by default.
4118 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4119 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004120 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4121 CmdArgs.push_back("-force_cpusubtype_ALL");
4122
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004123 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4124 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004125 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004126 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004127 CmdArgs.push_back("-static");
4128
Daniel Dunbarbe220842009-03-20 16:06:39 +00004129 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4130 options::OPT_Xassembler);
4131
4132 assert(Output.isFilename() && "Unexpected lipo output.");
4133 CmdArgs.push_back("-o");
4134 CmdArgs.push_back(Output.getFilename());
4135
Daniel Dunbarb440f562010-08-02 02:38:21 +00004136 assert(Input.isFilename() && "Invalid input.");
4137 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004138
4139 // asm_final spec is empty.
4140
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004141 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004142 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004143 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004144}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004145
David Blaikie68e081d2011-12-20 02:48:34 +00004146void darwin::DarwinTool::anchor() {}
4147
Daniel Dunbare9ded432009-09-09 18:36:20 +00004148void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4149 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004150 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004151
Daniel Dunbarc1964212009-03-26 16:23:12 +00004152 // Derived from darwin_arch spec.
4153 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004154 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004155
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004156 // FIXME: Is this needed anymore?
4157 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004158 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004159}
4160
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004161void darwin::Link::AddLinkArgs(Compilation &C,
4162 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004163 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004164 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004165 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004166
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004167 unsigned Version[3] = { 0, 0, 0 };
4168 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4169 bool HadExtra;
4170 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4171 Version[1], Version[2], HadExtra) ||
4172 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004173 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004174 << A->getAsString(Args);
4175 }
4176
4177 // Newer linkers support -demangle, pass it if supported and not disabled by
4178 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004179 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004180 // Don't pass -demangle to ld_classic.
4181 //
4182 // FIXME: This is a temporary workaround, ld should be handling this.
4183 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4184 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004185 if (getToolChain().getArch() == llvm::Triple::x86) {
4186 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4187 options::OPT_Wl_COMMA),
4188 ie = Args.filtered_end(); it != ie; ++it) {
4189 const Arg *A = *it;
4190 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004191 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004192 UsesLdClassic = true;
4193 }
4194 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004195 if (!UsesLdClassic)
4196 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004197 }
4198
Daniel Dunbaref889c72011-06-21 20:55:11 +00004199 // If we are using LTO, then automatically create a temporary file path for
4200 // the linker to use, so that it's lifetime will extend past a possible
4201 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004202 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004203 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004204 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004205 C.addTempFile(TmpPath);
4206 CmdArgs.push_back("-object_path_lto");
4207 CmdArgs.push_back(TmpPath);
4208 }
4209
Daniel Dunbarc1964212009-03-26 16:23:12 +00004210 // Derived from the "link" spec.
4211 Args.AddAllArgs(CmdArgs, options::OPT_static);
4212 if (!Args.hasArg(options::OPT_static))
4213 CmdArgs.push_back("-dynamic");
4214 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4215 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4216 // here. How do we wish to handle such things?
4217 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004218
Daniel Dunbarc1964212009-03-26 16:23:12 +00004219 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004220 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004221 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004222 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004223
4224 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4225 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4226 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4227
4228 Arg *A;
4229 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4230 (A = Args.getLastArg(options::OPT_current__version)) ||
4231 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004232 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004233 << A->getAsString(Args) << "-dynamiclib";
4234
4235 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4236 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4237 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4238 } else {
4239 CmdArgs.push_back("-dylib");
4240
4241 Arg *A;
4242 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4243 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4244 (A = Args.getLastArg(options::OPT_client__name)) ||
4245 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4246 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4247 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004248 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004249 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004250
Daniel Dunbarc1964212009-03-26 16:23:12 +00004251 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4252 "-dylib_compatibility_version");
4253 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4254 "-dylib_current_version");
4255
Daniel Dunbara48823f2010-01-22 02:04:52 +00004256 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004257
4258 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4259 "-dylib_install_name");
4260 }
4261
4262 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4263 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4264 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004265 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004266 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004267 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4268 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4269 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4270 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4271 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4272 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004273 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004274 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4275 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4276 Args.AddAllArgs(CmdArgs, options::OPT_init);
4277
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004278 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004279 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004280
4281 // If we had an explicit -mios-simulator-version-min argument, honor that,
4282 // otherwise use the traditional deployment targets. We can't just check the
4283 // is-sim attribute because existing code follows this path, and the linker
4284 // may not handle the argument.
4285 //
4286 // FIXME: We may be able to remove this, once we can verify no one depends on
4287 // it.
4288 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4289 CmdArgs.push_back("-ios_simulator_version_min");
4290 else if (DarwinTC.isTargetIPhoneOS())
4291 CmdArgs.push_back("-iphoneos_version_min");
4292 else
4293 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004294 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004295
Daniel Dunbarc1964212009-03-26 16:23:12 +00004296 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4297 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4298 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4299 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4300 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004301
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004302 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4303 options::OPT_fno_pie,
4304 options::OPT_fno_PIE)) {
4305 if (A->getOption().matches(options::OPT_fpie) ||
4306 A->getOption().matches(options::OPT_fPIE))
4307 CmdArgs.push_back("-pie");
4308 else
4309 CmdArgs.push_back("-no_pie");
4310 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004311
4312 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4313 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4314 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4315 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4316 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4317 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4318 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4319 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4320 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4321 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4322 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4323 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4324 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4325 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4326 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4327 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004328
Daniel Dunbar84384642011-05-02 21:03:47 +00004329 // Give --sysroot= preference, over the Apple specific behavior to also use
4330 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004331 StringRef sysroot = C.getSysRoot();
4332 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004333 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004334 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004335 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4336 CmdArgs.push_back("-syslibroot");
4337 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004338 }
4339
Daniel Dunbarc1964212009-03-26 16:23:12 +00004340 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4341 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4342 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4343 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4344 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004345 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004346 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4347 Args.AddAllArgs(CmdArgs, options::OPT_y);
4348 Args.AddLastArg(CmdArgs, options::OPT_w);
4349 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4350 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4351 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4352 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4353 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4354 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4355 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4356 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4357 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4358 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4359 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4360 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4361}
4362
4363void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004364 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004365 const InputInfoList &Inputs,
4366 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004367 const char *LinkingOutput) const {
4368 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004369
Daniel Dunbarc1964212009-03-26 16:23:12 +00004370 // The logic here is derived from gcc's behavior; most of which
4371 // comes from specs (starting with link_command). Consult gcc for
4372 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004373 ArgStringList CmdArgs;
4374
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004375 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4376 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4377 options::OPT_ccc_arcmt_migrate)) {
4378 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4379 (*I)->claim();
4380 const char *Exec =
4381 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4382 CmdArgs.push_back(Output.getFilename());
4383 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4384 return;
4385 }
4386
Daniel Dunbarc1964212009-03-26 16:23:12 +00004387 // I'm not sure why this particular decomposition exists in gcc, but
4388 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004389 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004390
Daniel Dunbarc1964212009-03-26 16:23:12 +00004391 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4392 Args.AddAllArgs(CmdArgs, options::OPT_s);
4393 Args.AddAllArgs(CmdArgs, options::OPT_t);
4394 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4395 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004396 Args.AddLastArg(CmdArgs, options::OPT_e);
4397 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4398 Args.AddAllArgs(CmdArgs, options::OPT_r);
4399
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004400 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4401 // members of static archive libraries which implement Objective-C classes or
4402 // categories.
4403 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4404 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004405
Daniel Dunbarc1964212009-03-26 16:23:12 +00004406 CmdArgs.push_back("-o");
4407 CmdArgs.push_back(Output.getFilename());
4408
Chad Rosier06fd3c62012-05-16 23:45:12 +00004409 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004410 !Args.hasArg(options::OPT_nostartfiles)) {
4411 // Derived from startfile spec.
4412 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004413 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004414 if (getDarwinToolChain().isTargetIOSSimulator()) {
4415 // The simulator doesn't have a versioned crt1 file.
4416 CmdArgs.push_back("-ldylib1.o");
4417 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004418 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4419 CmdArgs.push_back("-ldylib1.o");
4420 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004421 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004422 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004423 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004424 CmdArgs.push_back("-ldylib1.10.5.o");
4425 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004426 } else {
4427 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004428 if (!Args.hasArg(options::OPT_static)) {
4429 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004430 if (getDarwinToolChain().isTargetIOSSimulator()) {
4431 // The simulator doesn't have a versioned crt1 file.
4432 CmdArgs.push_back("-lbundle1.o");
4433 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004434 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4435 CmdArgs.push_back("-lbundle1.o");
4436 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004437 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004438 CmdArgs.push_back("-lbundle1.o");
4439 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004440 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004441 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004442 if (Args.hasArg(options::OPT_pg) &&
4443 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004444 if (Args.hasArg(options::OPT_static) ||
4445 Args.hasArg(options::OPT_object) ||
4446 Args.hasArg(options::OPT_preload)) {
4447 CmdArgs.push_back("-lgcrt0.o");
4448 } else {
4449 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004450
Daniel Dunbarc1964212009-03-26 16:23:12 +00004451 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004452 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004453 // By default on OS X 10.8 and later, we don't link with a crt1.o
4454 // file and the linker knows to use _main as the entry point. But,
4455 // when compiling with -pg, we need to link with the gcrt1.o file,
4456 // so pass the -no_new_main option to tell the linker to use the
4457 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004458 if (getDarwinToolChain().isTargetMacOS() &&
4459 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4460 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004461 } else {
4462 if (Args.hasArg(options::OPT_static) ||
4463 Args.hasArg(options::OPT_object) ||
4464 Args.hasArg(options::OPT_preload)) {
4465 CmdArgs.push_back("-lcrt0.o");
4466 } else {
4467 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004468 if (getDarwinToolChain().isTargetIOSSimulator()) {
4469 // The simulator doesn't have a versioned crt1 file.
4470 CmdArgs.push_back("-lcrt1.o");
4471 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004472 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4473 CmdArgs.push_back("-lcrt1.o");
4474 else
4475 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004476 } else {
4477 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4478 CmdArgs.push_back("-lcrt1.o");
4479 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4480 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004481 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004482 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004483
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004484 // darwin_crt2 spec is empty.
4485 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004486 }
4487 }
4488 }
4489 }
4490
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004491 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4492 Args.hasArg(options::OPT_shared_libgcc) &&
4493 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004494 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004495 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004496 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004497 }
4498 }
4499
4500 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004501
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004502 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4503 // symbols may appear. Mark all of them as dynamic_lookup.
4504 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4505 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4506 options::OPT_fno_address_sanitizer, false)) {
4507 if (Args.hasArg(options::OPT_dynamiclib) ||
4508 Args.hasArg(options::OPT_bundle)) {
4509 CmdArgs.push_back("-undefined");
4510 CmdArgs.push_back("dynamic_lookup");
4511 }
4512 }
4513
Daniel Dunbarc1964212009-03-26 16:23:12 +00004514 if (Args.hasArg(options::OPT_fopenmp))
4515 // This is more complicated in gcc...
4516 CmdArgs.push_back("-lgomp");
4517
Douglas Gregor9295df02012-05-15 21:00:27 +00004518 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4519
Bob Wilson16d93952012-05-15 18:57:39 +00004520 if (isObjCRuntimeLinked(Args) &&
4521 !Args.hasArg(options::OPT_nostdlib) &&
4522 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004523 // Avoid linking compatibility stubs on i386 mac.
4524 if (!getDarwinToolChain().isTargetMacOS() ||
4525 getDarwinToolChain().getArchName() != "i386") {
4526 // If we don't have ARC or subscripting runtime support, link in the
4527 // runtime stubs. We have to do this *before* adding any of the normal
4528 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004529 ObjCRuntime runtime =
4530 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004531 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004532 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004533 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004534 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004535 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004536 CmdArgs.push_back("-framework");
4537 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004538 // Link libobj.
4539 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004540 }
John McCall31168b02011-06-15 23:02:42 +00004541
Daniel Dunbarc1964212009-03-26 16:23:12 +00004542 if (LinkingOutput) {
4543 CmdArgs.push_back("-arch_multiple");
4544 CmdArgs.push_back("-final_output");
4545 CmdArgs.push_back(LinkingOutput);
4546 }
4547
Daniel Dunbarc1964212009-03-26 16:23:12 +00004548 if (Args.hasArg(options::OPT_fnested_functions))
4549 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004550
Daniel Dunbarc1964212009-03-26 16:23:12 +00004551 if (!Args.hasArg(options::OPT_nostdlib) &&
4552 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004553 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004554 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004555
Daniel Dunbarc1964212009-03-26 16:23:12 +00004556 // link_ssp spec is empty.
4557
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004558 // Let the tool chain choose which runtime library to link.
4559 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004560 }
4561
Chad Rosier06fd3c62012-05-16 23:45:12 +00004562 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004563 !Args.hasArg(options::OPT_nostartfiles)) {
4564 // endfile_spec is empty.
4565 }
4566
4567 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4568 Args.AddAllArgs(CmdArgs, options::OPT_F);
4569
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004570 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004571 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004572 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004573}
4574
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004575void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004576 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004577 const InputInfoList &Inputs,
4578 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004579 const char *LinkingOutput) const {
4580 ArgStringList CmdArgs;
4581
4582 CmdArgs.push_back("-create");
4583 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004584
4585 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004586 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004587
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004588 for (InputInfoList::const_iterator
4589 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4590 const InputInfo &II = *it;
4591 assert(II.isFilename() && "Unexpected lipo input.");
4592 CmdArgs.push_back(II.getFilename());
4593 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004594 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004595 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004596 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004597}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004598
Daniel Dunbar88299622010-06-04 18:28:36 +00004599void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004600 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004601 const InputInfoList &Inputs,
4602 const ArgList &Args,
4603 const char *LinkingOutput) const {
4604 ArgStringList CmdArgs;
4605
Daniel Dunbareb86b042011-05-09 17:23:16 +00004606 CmdArgs.push_back("-o");
4607 CmdArgs.push_back(Output.getFilename());
4608
Daniel Dunbar88299622010-06-04 18:28:36 +00004609 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4610 const InputInfo &Input = Inputs[0];
4611 assert(Input.isFilename() && "Unexpected dsymutil input.");
4612 CmdArgs.push_back(Input.getFilename());
4613
Daniel Dunbar88299622010-06-04 18:28:36 +00004614 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004615 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004616 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004617}
4618
Eric Christopher551ef452011-08-23 17:56:55 +00004619void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4620 const InputInfo &Output,
4621 const InputInfoList &Inputs,
4622 const ArgList &Args,
4623 const char *LinkingOutput) const {
4624 ArgStringList CmdArgs;
4625 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004626 CmdArgs.push_back("--debug-info");
4627 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004628 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004629
4630 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4631 const InputInfo &Input = Inputs[0];
4632 assert(Input.isFilename() && "Unexpected verify input");
4633
4634 // Grabbing the output of the earlier dsymutil run.
4635 CmdArgs.push_back(Input.getFilename());
4636
4637 const char *Exec =
4638 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4639 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4640}
4641
David Chisnallf571cde2012-02-15 13:39:01 +00004642void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4643 const InputInfo &Output,
4644 const InputInfoList &Inputs,
4645 const ArgList &Args,
4646 const char *LinkingOutput) const {
4647 ArgStringList CmdArgs;
4648
4649 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4650 options::OPT_Xassembler);
4651
4652 CmdArgs.push_back("-o");
4653 CmdArgs.push_back(Output.getFilename());
4654
4655 for (InputInfoList::const_iterator
4656 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4657 const InputInfo &II = *it;
4658 CmdArgs.push_back(II.getFilename());
4659 }
4660
4661 const char *Exec =
4662 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4663 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4664}
4665
4666
4667void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4668 const InputInfo &Output,
4669 const InputInfoList &Inputs,
4670 const ArgList &Args,
4671 const char *LinkingOutput) const {
4672 // FIXME: Find a real GCC, don't hard-code versions here
4673 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4674 const llvm::Triple &T = getToolChain().getTriple();
4675 std::string LibPath = "/usr/lib/";
4676 llvm::Triple::ArchType Arch = T.getArch();
4677 switch (Arch) {
4678 case llvm::Triple::x86:
4679 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4680 T.getOSName()).str() + "/4.5.2/";
4681 break;
4682 case llvm::Triple::x86_64:
4683 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4684 T.getOSName()).str();
4685 GCCLibPath += "/4.5.2/amd64/";
4686 LibPath += "amd64/";
4687 break;
4688 default:
4689 assert(0 && "Unsupported architecture");
4690 }
4691
4692 ArgStringList CmdArgs;
4693
David Chisnall272a0712012-02-29 15:06:12 +00004694 // Demangle C++ names in errors
4695 CmdArgs.push_back("-C");
4696
David Chisnallf571cde2012-02-15 13:39:01 +00004697 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4698 (!Args.hasArg(options::OPT_shared))) {
4699 CmdArgs.push_back("-e");
4700 CmdArgs.push_back("_start");
4701 }
4702
4703 if (Args.hasArg(options::OPT_static)) {
4704 CmdArgs.push_back("-Bstatic");
4705 CmdArgs.push_back("-dn");
4706 } else {
4707 CmdArgs.push_back("-Bdynamic");
4708 if (Args.hasArg(options::OPT_shared)) {
4709 CmdArgs.push_back("-shared");
4710 } else {
4711 CmdArgs.push_back("--dynamic-linker");
4712 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4713 }
4714 }
4715
4716 if (Output.isFilename()) {
4717 CmdArgs.push_back("-o");
4718 CmdArgs.push_back(Output.getFilename());
4719 } else {
4720 assert(Output.isNothing() && "Invalid output.");
4721 }
4722
4723 if (!Args.hasArg(options::OPT_nostdlib) &&
4724 !Args.hasArg(options::OPT_nostartfiles)) {
4725 if (!Args.hasArg(options::OPT_shared)) {
4726 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4727 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004728 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004729 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4730 } else {
4731 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004732 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4733 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004734 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004735 if (getToolChain().getDriver().CCCIsCXX)
4736 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004737 }
4738
4739 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4740
4741 Args.AddAllArgs(CmdArgs, options::OPT_L);
4742 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4743 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004744 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004745
4746 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4747
4748 if (!Args.hasArg(options::OPT_nostdlib) &&
4749 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004750 if (getToolChain().getDriver().CCCIsCXX)
4751 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004752 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004753 if (!Args.hasArg(options::OPT_shared)) {
4754 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004755 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004756 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004757 }
David Chisnallf571cde2012-02-15 13:39:01 +00004758 }
4759
4760 if (!Args.hasArg(options::OPT_nostdlib) &&
4761 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004762 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004763 }
David Chisnall96de9932012-02-16 16:00:47 +00004764 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004765
4766 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4767
4768 const char *Exec =
4769 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4770 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4771}
4772
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004773void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004774 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004775 const InputInfoList &Inputs,
4776 const ArgList &Args,
4777 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004778 ArgStringList CmdArgs;
4779
4780 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4781 options::OPT_Xassembler);
4782
4783 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004784 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004785
4786 for (InputInfoList::const_iterator
4787 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4788 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004789 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004790 }
4791
4792 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004793 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004794 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004795}
4796
4797void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004798 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004799 const InputInfoList &Inputs,
4800 const ArgList &Args,
4801 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004802 ArgStringList CmdArgs;
4803
4804 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004805 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004806 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004807 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004808 }
4809
4810 if (Args.hasArg(options::OPT_static)) {
4811 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004812 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004813 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004814// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815 CmdArgs.push_back("-Bdynamic");
4816 if (Args.hasArg(options::OPT_shared)) {
4817 CmdArgs.push_back("-shared");
4818 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004819 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004820 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4821 }
4822 }
4823
Daniel Dunbarb440f562010-08-02 02:38:21 +00004824 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004825 CmdArgs.push_back("-o");
4826 CmdArgs.push_back(Output.getFilename());
4827 } else {
4828 assert(Output.isNothing() && "Invalid output.");
4829 }
4830
4831 if (!Args.hasArg(options::OPT_nostdlib) &&
4832 !Args.hasArg(options::OPT_nostartfiles)) {
4833 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004834 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004835 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004836 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004837 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004838 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004839 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004840 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004841 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004842 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004843 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004844 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004845 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004846 }
4847
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004848 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4849 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004850 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004851
4852 Args.AddAllArgs(CmdArgs, options::OPT_L);
4853 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4854 Args.AddAllArgs(CmdArgs, options::OPT_e);
4855
Daniel Dunbar54423b22010-09-17 00:24:54 +00004856 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004857
4858 if (!Args.hasArg(options::OPT_nostdlib) &&
4859 !Args.hasArg(options::OPT_nodefaultlibs)) {
4860 // FIXME: For some reason GCC passes -lgcc before adding
4861 // the default system libraries. Just mimic this for now.
4862 CmdArgs.push_back("-lgcc");
4863
4864 if (Args.hasArg(options::OPT_pthread))
4865 CmdArgs.push_back("-pthread");
4866 if (!Args.hasArg(options::OPT_shared))
4867 CmdArgs.push_back("-lc");
4868 CmdArgs.push_back("-lgcc");
4869 }
4870
4871 if (!Args.hasArg(options::OPT_nostdlib) &&
4872 !Args.hasArg(options::OPT_nostartfiles)) {
4873 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004874 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004875 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004876 }
4877
Bill Wendling08760582011-06-27 19:15:03 +00004878 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004879
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004880 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004881 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004882 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004883}
4884
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004885void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004886 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004887 const InputInfoList &Inputs,
4888 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004889 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004890 ArgStringList CmdArgs;
4891
4892 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4893 options::OPT_Xassembler);
4894
4895 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004896 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004897
4898 for (InputInfoList::const_iterator
4899 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4900 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004901 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004902 }
4903
4904 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004905 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004906 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004907}
4908
4909void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004910 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004911 const InputInfoList &Inputs,
4912 const ArgList &Args,
4913 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004914 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004915 ArgStringList CmdArgs;
4916
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004917 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004918 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004919 CmdArgs.push_back("-e");
4920 CmdArgs.push_back("__start");
4921 }
4922
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004923 if (Args.hasArg(options::OPT_static)) {
4924 CmdArgs.push_back("-Bstatic");
4925 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004926 if (Args.hasArg(options::OPT_rdynamic))
4927 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004928 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004929 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004930 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004931 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004932 } else {
4933 CmdArgs.push_back("-dynamic-linker");
4934 CmdArgs.push_back("/usr/libexec/ld.so");
4935 }
4936 }
4937
Daniel Dunbarb440f562010-08-02 02:38:21 +00004938 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004939 CmdArgs.push_back("-o");
4940 CmdArgs.push_back(Output.getFilename());
4941 } else {
4942 assert(Output.isNothing() && "Invalid output.");
4943 }
4944
4945 if (!Args.hasArg(options::OPT_nostdlib) &&
4946 !Args.hasArg(options::OPT_nostartfiles)) {
4947 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004948 if (Args.hasArg(options::OPT_pg))
4949 CmdArgs.push_back(Args.MakeArgString(
4950 getToolChain().GetFilePath("gcrt0.o")));
4951 else
4952 CmdArgs.push_back(Args.MakeArgString(
4953 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004954 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004955 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004956 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004957 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004958 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004959 }
4960 }
4961
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004962 std::string Triple = getToolChain().getTripleString();
4963 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004964 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004965 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004966 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004967
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004968 Args.AddAllArgs(CmdArgs, options::OPT_L);
4969 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4970 Args.AddAllArgs(CmdArgs, options::OPT_e);
4971
Daniel Dunbar54423b22010-09-17 00:24:54 +00004972 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004973
4974 if (!Args.hasArg(options::OPT_nostdlib) &&
4975 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004976 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004977 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004978 if (Args.hasArg(options::OPT_pg))
4979 CmdArgs.push_back("-lm_p");
4980 else
4981 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004982 }
4983
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004984 // FIXME: For some reason GCC passes -lgcc before adding
4985 // the default system libraries. Just mimic this for now.
4986 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004987
Eric Christopher17674ec2012-09-13 06:32:34 +00004988 if (Args.hasArg(options::OPT_pthread)) {
4989 if (!Args.hasArg(options::OPT_shared) &&
4990 Args.hasArg(options::OPT_pg))
4991 CmdArgs.push_back("-lpthread_p");
4992 else
4993 CmdArgs.push_back("-lpthread");
4994 }
4995
Chandler Carruth45661652011-12-17 22:32:42 +00004996 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004997 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004998 CmdArgs.push_back("-lc_p");
4999 else
5000 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00005001 }
Eric Christopher17674ec2012-09-13 06:32:34 +00005002
Daniel Dunbara8888ac2009-08-03 01:28:59 +00005003 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005004 }
5005
5006 if (!Args.hasArg(options::OPT_nostdlib) &&
5007 !Args.hasArg(options::OPT_nostartfiles)) {
5008 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005009 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005010 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005011 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00005012 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005013 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005014 }
5015
5016 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005017 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005018 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005019}
Ed Schoutene33194b2009-04-02 19:13:12 +00005020
Eli Friedman9fa28852012-08-08 23:57:20 +00005021void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5022 const InputInfo &Output,
5023 const InputInfoList &Inputs,
5024 const ArgList &Args,
5025 const char *LinkingOutput) const {
5026 ArgStringList CmdArgs;
5027
5028 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5029 options::OPT_Xassembler);
5030
5031 CmdArgs.push_back("-o");
5032 CmdArgs.push_back(Output.getFilename());
5033
5034 for (InputInfoList::const_iterator
5035 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5036 const InputInfo &II = *it;
5037 CmdArgs.push_back(II.getFilename());
5038 }
5039
5040 const char *Exec =
5041 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5043}
5044
5045void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5046 const InputInfo &Output,
5047 const InputInfoList &Inputs,
5048 const ArgList &Args,
5049 const char *LinkingOutput) const {
5050 const Driver &D = getToolChain().getDriver();
5051 ArgStringList CmdArgs;
5052
5053 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5054 (!Args.hasArg(options::OPT_shared))) {
5055 CmdArgs.push_back("-e");
5056 CmdArgs.push_back("__start");
5057 }
5058
5059 if (Args.hasArg(options::OPT_static)) {
5060 CmdArgs.push_back("-Bstatic");
5061 } else {
5062 if (Args.hasArg(options::OPT_rdynamic))
5063 CmdArgs.push_back("-export-dynamic");
5064 CmdArgs.push_back("--eh-frame-hdr");
5065 CmdArgs.push_back("-Bdynamic");
5066 if (Args.hasArg(options::OPT_shared)) {
5067 CmdArgs.push_back("-shared");
5068 } else {
5069 CmdArgs.push_back("-dynamic-linker");
5070 CmdArgs.push_back("/usr/libexec/ld.so");
5071 }
5072 }
5073
5074 if (Output.isFilename()) {
5075 CmdArgs.push_back("-o");
5076 CmdArgs.push_back(Output.getFilename());
5077 } else {
5078 assert(Output.isNothing() && "Invalid output.");
5079 }
5080
5081 if (!Args.hasArg(options::OPT_nostdlib) &&
5082 !Args.hasArg(options::OPT_nostartfiles)) {
5083 if (!Args.hasArg(options::OPT_shared)) {
5084 if (Args.hasArg(options::OPT_pg))
5085 CmdArgs.push_back(Args.MakeArgString(
5086 getToolChain().GetFilePath("gcrt0.o")));
5087 else
5088 CmdArgs.push_back(Args.MakeArgString(
5089 getToolChain().GetFilePath("crt0.o")));
5090 CmdArgs.push_back(Args.MakeArgString(
5091 getToolChain().GetFilePath("crtbegin.o")));
5092 } else {
5093 CmdArgs.push_back(Args.MakeArgString(
5094 getToolChain().GetFilePath("crtbeginS.o")));
5095 }
5096 }
5097
5098 Args.AddAllArgs(CmdArgs, options::OPT_L);
5099 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5100 Args.AddAllArgs(CmdArgs, options::OPT_e);
5101
5102 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5103
5104 if (!Args.hasArg(options::OPT_nostdlib) &&
5105 !Args.hasArg(options::OPT_nodefaultlibs)) {
5106 if (D.CCCIsCXX) {
5107 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5108 if (Args.hasArg(options::OPT_pg))
5109 CmdArgs.push_back("-lm_p");
5110 else
5111 CmdArgs.push_back("-lm");
5112 }
5113
5114 if (Args.hasArg(options::OPT_pthread))
5115 CmdArgs.push_back("-lpthread");
5116 if (!Args.hasArg(options::OPT_shared)) {
5117 if (Args.hasArg(options::OPT_pg))
5118 CmdArgs.push_back("-lc_p");
5119 else
5120 CmdArgs.push_back("-lc");
5121 }
5122
5123 std::string myarch = "-lclang_rt.";
5124 const llvm::Triple &T = getToolChain().getTriple();
5125 llvm::Triple::ArchType Arch = T.getArch();
5126 switch (Arch) {
5127 case llvm::Triple::arm:
5128 myarch += ("arm");
5129 break;
5130 case llvm::Triple::x86:
5131 myarch += ("i386");
5132 break;
5133 case llvm::Triple::x86_64:
5134 myarch += ("amd64");
5135 break;
5136 default:
5137 assert(0 && "Unsupported architecture");
5138 }
5139 CmdArgs.push_back(Args.MakeArgString(myarch));
5140 }
5141
5142 if (!Args.hasArg(options::OPT_nostdlib) &&
5143 !Args.hasArg(options::OPT_nostartfiles)) {
5144 if (!Args.hasArg(options::OPT_shared))
5145 CmdArgs.push_back(Args.MakeArgString(
5146 getToolChain().GetFilePath("crtend.o")));
5147 else
5148 CmdArgs.push_back(Args.MakeArgString(
5149 getToolChain().GetFilePath("crtendS.o")));
5150 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005151
5152 const char *Exec =
5153 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5154 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005155}
5156
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005157void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005158 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005159 const InputInfoList &Inputs,
5160 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005161 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005162 ArgStringList CmdArgs;
5163
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005164 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5165 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005166 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005167 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005168 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005169 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005170 else if (getToolChain().getArch() == llvm::Triple::mips ||
5171 getToolChain().getArch() == llvm::Triple::mipsel ||
5172 getToolChain().getArch() == llvm::Triple::mips64 ||
5173 getToolChain().getArch() == llvm::Triple::mips64el) {
5174 StringRef CPUName;
5175 StringRef ABIName;
5176 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005177
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005178 CmdArgs.push_back("-march");
5179 CmdArgs.push_back(CPUName.data());
5180
5181 // Convert ABI name to the GNU tools acceptable variant.
5182 if (ABIName == "o32")
5183 ABIName = "32";
5184 else if (ABIName == "n64")
5185 ABIName = "64";
5186
5187 CmdArgs.push_back("-mabi");
5188 CmdArgs.push_back(ABIName.data());
5189
5190 if (getToolChain().getArch() == llvm::Triple::mips ||
5191 getToolChain().getArch() == llvm::Triple::mips64)
5192 CmdArgs.push_back("-EB");
5193 else
5194 CmdArgs.push_back("-EL");
5195
5196 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5197 options::OPT_fpic, options::OPT_fno_pic,
5198 options::OPT_fPIE, options::OPT_fno_PIE,
5199 options::OPT_fpie, options::OPT_fno_pie);
5200 if (LastPICArg &&
5201 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5202 LastPICArg->getOption().matches(options::OPT_fpic) ||
5203 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5204 LastPICArg->getOption().matches(options::OPT_fpie))) {
5205 CmdArgs.push_back("-KPIC");
5206 }
5207 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005208
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005209 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5210 options::OPT_Xassembler);
5211
5212 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005213 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005214
5215 for (InputInfoList::const_iterator
5216 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5217 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005218 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005219 }
5220
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005221 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005222 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005223 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005224}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005225
5226void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005227 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005228 const InputInfoList &Inputs,
5229 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005230 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005231 const toolchains::FreeBSD& ToolChain =
5232 static_cast<const toolchains::FreeBSD&>(getToolChain());
5233 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005234 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005235
5236 // Silence warning for "clang -g foo.o -o foo"
5237 Args.ClaimAllArgs(options::OPT_g_Group);
5238 // and "clang -emit-llvm foo.o -o foo"
5239 Args.ClaimAllArgs(options::OPT_emit_llvm);
5240 // and for "clang -w foo.o -o foo". Other warning options are already
5241 // handled somewhere else.
5242 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005243
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005244 if (!D.SysRoot.empty())
5245 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5246
Roman Divackyafe2f232012-08-28 15:09:03 +00005247 if (Args.hasArg(options::OPT_pie))
5248 CmdArgs.push_back("-pie");
5249
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005250 if (Args.hasArg(options::OPT_static)) {
5251 CmdArgs.push_back("-Bstatic");
5252 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005253 if (Args.hasArg(options::OPT_rdynamic))
5254 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005255 CmdArgs.push_back("--eh-frame-hdr");
5256 if (Args.hasArg(options::OPT_shared)) {
5257 CmdArgs.push_back("-Bshareable");
5258 } else {
5259 CmdArgs.push_back("-dynamic-linker");
5260 CmdArgs.push_back("/libexec/ld-elf.so.1");
5261 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005262 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5263 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005264 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5265 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5266 CmdArgs.push_back("--hash-style=both");
5267 }
5268 }
5269 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005270 }
5271
5272 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5273 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005274 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005275 CmdArgs.push_back("-m");
5276 CmdArgs.push_back("elf_i386_fbsd");
5277 }
5278
Roman Divackyafe2f232012-08-28 15:09:03 +00005279 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005280 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005281 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005282 }
5283
Daniel Dunbarb440f562010-08-02 02:38:21 +00005284 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005285 CmdArgs.push_back("-o");
5286 CmdArgs.push_back(Output.getFilename());
5287 } else {
5288 assert(Output.isNothing() && "Invalid output.");
5289 }
5290
5291 if (!Args.hasArg(options::OPT_nostdlib) &&
5292 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005293 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005294 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005295 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005296 crt1 = "gcrt1.o";
5297 else if (Args.hasArg(options::OPT_pie))
5298 crt1 = "Scrt1.o";
5299 else
5300 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005301 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005302 if (crt1)
5303 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5304
5305 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5306
5307 const char *crtbegin = NULL;
5308 if (Args.hasArg(options::OPT_static))
5309 crtbegin = "crtbeginT.o";
5310 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5311 crtbegin = "crtbeginS.o";
5312 else
5313 crtbegin = "crtbegin.o";
5314
5315 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005316 }
5317
5318 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005319 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005320 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5321 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005322 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005323 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5324 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005325 Args.AddAllArgs(CmdArgs, options::OPT_s);
5326 Args.AddAllArgs(CmdArgs, options::OPT_t);
5327 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5328 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005329
Roman Divackyafe2f232012-08-28 15:09:03 +00005330 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005331
5332 if (!Args.hasArg(options::OPT_nostdlib) &&
5333 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005334 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005335 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005336 if (Args.hasArg(options::OPT_pg))
5337 CmdArgs.push_back("-lm_p");
5338 else
5339 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005340 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005341 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5342 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005343 if (Args.hasArg(options::OPT_pg))
5344 CmdArgs.push_back("-lgcc_p");
5345 else
5346 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005347 if (Args.hasArg(options::OPT_static)) {
5348 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005349 } else if (Args.hasArg(options::OPT_pg)) {
5350 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005351 } else {
5352 CmdArgs.push_back("--as-needed");
5353 CmdArgs.push_back("-lgcc_s");
5354 CmdArgs.push_back("--no-as-needed");
5355 }
5356
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005357 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005358 if (Args.hasArg(options::OPT_pg))
5359 CmdArgs.push_back("-lpthread_p");
5360 else
5361 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005362 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005363
Roman Divacky66f22762011-02-10 16:59:40 +00005364 if (Args.hasArg(options::OPT_pg)) {
5365 if (Args.hasArg(options::OPT_shared))
5366 CmdArgs.push_back("-lc");
5367 else
5368 CmdArgs.push_back("-lc_p");
5369 CmdArgs.push_back("-lgcc_p");
5370 } else {
5371 CmdArgs.push_back("-lc");
5372 CmdArgs.push_back("-lgcc");
5373 }
5374
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005375 if (Args.hasArg(options::OPT_static)) {
5376 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005377 } else if (Args.hasArg(options::OPT_pg)) {
5378 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005379 } else {
5380 CmdArgs.push_back("--as-needed");
5381 CmdArgs.push_back("-lgcc_s");
5382 CmdArgs.push_back("--no-as-needed");
5383 }
5384 }
5385
5386 if (!Args.hasArg(options::OPT_nostdlib) &&
5387 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005388 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005389 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005390 else
5391 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005392 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005393 }
5394
Roman Divackyafe2f232012-08-28 15:09:03 +00005395 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005396
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005397 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005398 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005399 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005400}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005401
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005402void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5403 const InputInfo &Output,
5404 const InputInfoList &Inputs,
5405 const ArgList &Args,
5406 const char *LinkingOutput) const {
5407 ArgStringList CmdArgs;
5408
5409 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5410 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005411 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005412 CmdArgs.push_back("--32");
5413
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005414 // Set byte order explicitly
5415 if (getToolChain().getArchName() == "mips")
5416 CmdArgs.push_back("-EB");
5417 else if (getToolChain().getArchName() == "mipsel")
5418 CmdArgs.push_back("-EL");
5419
5420 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5421 options::OPT_Xassembler);
5422
5423 CmdArgs.push_back("-o");
5424 CmdArgs.push_back(Output.getFilename());
5425
5426 for (InputInfoList::const_iterator
5427 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5428 const InputInfo &II = *it;
5429 CmdArgs.push_back(II.getFilename());
5430 }
5431
David Chisnallddbd68f2011-09-27 22:03:18 +00005432 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005433 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5434}
5435
5436void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5437 const InputInfo &Output,
5438 const InputInfoList &Inputs,
5439 const ArgList &Args,
5440 const char *LinkingOutput) const {
5441 const Driver &D = getToolChain().getDriver();
5442 ArgStringList CmdArgs;
5443
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005444 if (!D.SysRoot.empty())
5445 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5446
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005447 if (Args.hasArg(options::OPT_static)) {
5448 CmdArgs.push_back("-Bstatic");
5449 } else {
5450 if (Args.hasArg(options::OPT_rdynamic))
5451 CmdArgs.push_back("-export-dynamic");
5452 CmdArgs.push_back("--eh-frame-hdr");
5453 if (Args.hasArg(options::OPT_shared)) {
5454 CmdArgs.push_back("-Bshareable");
5455 } else {
5456 CmdArgs.push_back("-dynamic-linker");
5457 CmdArgs.push_back("/libexec/ld.elf_so");
5458 }
5459 }
5460
5461 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5462 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005463 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005464 CmdArgs.push_back("-m");
5465 CmdArgs.push_back("elf_i386");
5466 }
5467
5468 if (Output.isFilename()) {
5469 CmdArgs.push_back("-o");
5470 CmdArgs.push_back(Output.getFilename());
5471 } else {
5472 assert(Output.isNothing() && "Invalid output.");
5473 }
5474
5475 if (!Args.hasArg(options::OPT_nostdlib) &&
5476 !Args.hasArg(options::OPT_nostartfiles)) {
5477 if (!Args.hasArg(options::OPT_shared)) {
5478 CmdArgs.push_back(Args.MakeArgString(
5479 getToolChain().GetFilePath("crt0.o")));
5480 CmdArgs.push_back(Args.MakeArgString(
5481 getToolChain().GetFilePath("crti.o")));
5482 CmdArgs.push_back(Args.MakeArgString(
5483 getToolChain().GetFilePath("crtbegin.o")));
5484 } else {
5485 CmdArgs.push_back(Args.MakeArgString(
5486 getToolChain().GetFilePath("crti.o")));
5487 CmdArgs.push_back(Args.MakeArgString(
5488 getToolChain().GetFilePath("crtbeginS.o")));
5489 }
5490 }
5491
5492 Args.AddAllArgs(CmdArgs, options::OPT_L);
5493 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5494 Args.AddAllArgs(CmdArgs, options::OPT_e);
5495 Args.AddAllArgs(CmdArgs, options::OPT_s);
5496 Args.AddAllArgs(CmdArgs, options::OPT_t);
5497 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5498 Args.AddAllArgs(CmdArgs, options::OPT_r);
5499
5500 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5501
5502 if (!Args.hasArg(options::OPT_nostdlib) &&
5503 !Args.hasArg(options::OPT_nodefaultlibs)) {
5504 if (D.CCCIsCXX) {
5505 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5506 CmdArgs.push_back("-lm");
5507 }
5508 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5509 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005510 if (Args.hasArg(options::OPT_static)) {
5511 CmdArgs.push_back("-lgcc_eh");
5512 } else {
5513 CmdArgs.push_back("--as-needed");
5514 CmdArgs.push_back("-lgcc_s");
5515 CmdArgs.push_back("--no-as-needed");
5516 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005517 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005518
5519 if (Args.hasArg(options::OPT_pthread))
5520 CmdArgs.push_back("-lpthread");
5521 CmdArgs.push_back("-lc");
5522
5523 CmdArgs.push_back("-lgcc");
5524 if (Args.hasArg(options::OPT_static)) {
5525 CmdArgs.push_back("-lgcc_eh");
5526 } else {
5527 CmdArgs.push_back("--as-needed");
5528 CmdArgs.push_back("-lgcc_s");
5529 CmdArgs.push_back("--no-as-needed");
5530 }
5531 }
5532
5533 if (!Args.hasArg(options::OPT_nostdlib) &&
5534 !Args.hasArg(options::OPT_nostartfiles)) {
5535 if (!Args.hasArg(options::OPT_shared))
5536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5537 "crtend.o")));
5538 else
5539 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5540 "crtendS.o")));
5541 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5542 "crtn.o")));
5543 }
5544
Bill Wendling08760582011-06-27 19:15:03 +00005545 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005546
David Chisnallddbd68f2011-09-27 22:03:18 +00005547 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005548 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5549}
5550
Rafael Espindola92b00932010-08-10 00:25:48 +00005551void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5552 const InputInfo &Output,
5553 const InputInfoList &Inputs,
5554 const ArgList &Args,
5555 const char *LinkingOutput) const {
5556 ArgStringList CmdArgs;
5557
5558 // Add --32/--64 to make sure we get the format we want.
5559 // This is incomplete
5560 if (getToolChain().getArch() == llvm::Triple::x86) {
5561 CmdArgs.push_back("--32");
5562 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5563 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005564 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5565 CmdArgs.push_back("-a32");
5566 CmdArgs.push_back("-mppc");
5567 CmdArgs.push_back("-many");
5568 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5569 CmdArgs.push_back("-a64");
5570 CmdArgs.push_back("-mppc64");
5571 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005572 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005573 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005574 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5575 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005576
5577 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5578 getToolChain().getTriple());
5579 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005580
5581 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5582 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5583 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005584 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5585 getToolChain().getArch() == llvm::Triple::mipsel ||
5586 getToolChain().getArch() == llvm::Triple::mips64 ||
5587 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005588 StringRef CPUName;
5589 StringRef ABIName;
5590 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005591
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005592 CmdArgs.push_back("-march");
5593 CmdArgs.push_back(CPUName.data());
5594
5595 // Convert ABI name to the GNU tools acceptable variant.
5596 if (ABIName == "o32")
5597 ABIName = "32";
5598 else if (ABIName == "n64")
5599 ABIName = "64";
5600
5601 CmdArgs.push_back("-mabi");
5602 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005603
5604 if (getToolChain().getArch() == llvm::Triple::mips ||
5605 getToolChain().getArch() == llvm::Triple::mips64)
5606 CmdArgs.push_back("-EB");
5607 else
5608 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005609
5610 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5611 options::OPT_fpic, options::OPT_fno_pic,
5612 options::OPT_fPIE, options::OPT_fno_PIE,
5613 options::OPT_fpie, options::OPT_fno_pie);
5614 if (LastPICArg &&
5615 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5616 LastPICArg->getOption().matches(options::OPT_fpic) ||
5617 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5618 LastPICArg->getOption().matches(options::OPT_fpie))) {
5619 CmdArgs.push_back("-KPIC");
5620 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005621 }
5622
5623 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5624 options::OPT_Xassembler);
5625
5626 CmdArgs.push_back("-o");
5627 CmdArgs.push_back(Output.getFilename());
5628
5629 for (InputInfoList::const_iterator
5630 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5631 const InputInfo &II = *it;
5632 CmdArgs.push_back(II.getFilename());
5633 }
5634
5635 const char *Exec =
5636 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5637 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5638}
5639
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005640static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5641 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005642 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005643 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005644 Args.hasArg(options::OPT_static_libgcc);
5645 if (!D.CCCIsCXX)
5646 CmdArgs.push_back("-lgcc");
5647
5648 if (StaticLibgcc) {
5649 if (D.CCCIsCXX)
5650 CmdArgs.push_back("-lgcc");
5651 } else {
5652 if (!D.CCCIsCXX)
5653 CmdArgs.push_back("--as-needed");
5654 CmdArgs.push_back("-lgcc_s");
5655 if (!D.CCCIsCXX)
5656 CmdArgs.push_back("--no-as-needed");
5657 }
5658
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005659 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005660 CmdArgs.push_back("-lgcc_eh");
5661 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5662 CmdArgs.push_back("-lgcc");
5663}
5664
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005665void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5666 const InputInfo &Output,
5667 const InputInfoList &Inputs,
5668 const ArgList &Args,
5669 const char *LinkingOutput) const {
5670 const toolchains::Linux& ToolChain =
5671 static_cast<const toolchains::Linux&>(getToolChain());
5672 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005673 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005674 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005675
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005676 ArgStringList CmdArgs;
5677
Rafael Espindolad1002f62010-11-15 18:28:16 +00005678 // Silence warning for "clang -g foo.o -o foo"
5679 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005680 // and "clang -emit-llvm foo.o -o foo"
5681 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005682 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005683 // handled somewhere else.
5684 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005685
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005686 if (!D.SysRoot.empty())
5687 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005688
Rafael Espindolad47ac232010-11-17 22:26:15 +00005689 if (Args.hasArg(options::OPT_pie))
5690 CmdArgs.push_back("-pie");
5691
Rafael Espindola1c76c592010-11-07 22:57:16 +00005692 if (Args.hasArg(options::OPT_rdynamic))
5693 CmdArgs.push_back("-export-dynamic");
5694
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005695 if (Args.hasArg(options::OPT_s))
5696 CmdArgs.push_back("-s");
5697
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005698 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5699 e = ToolChain.ExtraOpts.end();
5700 i != e; ++i)
5701 CmdArgs.push_back(i->c_str());
5702
5703 if (!Args.hasArg(options::OPT_static)) {
5704 CmdArgs.push_back("--eh-frame-hdr");
5705 }
5706
5707 CmdArgs.push_back("-m");
5708 if (ToolChain.getArch() == llvm::Triple::x86)
5709 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005710 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005711 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005712 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005713 else if (ToolChain.getArch() == llvm::Triple::ppc)
5714 CmdArgs.push_back("elf32ppclinux");
5715 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5716 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005717 else if (ToolChain.getArch() == llvm::Triple::mips)
5718 CmdArgs.push_back("elf32btsmip");
5719 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5720 CmdArgs.push_back("elf32ltsmip");
5721 else if (ToolChain.getArch() == llvm::Triple::mips64)
5722 CmdArgs.push_back("elf64btsmip");
5723 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5724 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005725 else
5726 CmdArgs.push_back("elf_x86_64");
5727
5728 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005729 if (ToolChain.getArch() == llvm::Triple::arm
5730 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005731 CmdArgs.push_back("-Bstatic");
5732 else
5733 CmdArgs.push_back("-static");
5734 } else if (Args.hasArg(options::OPT_shared)) {
5735 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005736 if ((ToolChain.getArch() == llvm::Triple::arm
5737 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5738 CmdArgs.push_back("-Bsymbolic");
5739 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005740 }
5741
5742 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005743 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005744 (!Args.hasArg(options::OPT_static) &&
5745 !Args.hasArg(options::OPT_shared))) {
5746 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005747 if (isAndroid)
5748 CmdArgs.push_back("/system/bin/linker");
5749 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005750 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005751 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005752 ToolChain.getArch() == llvm::Triple::thumb) {
5753 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5754 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5755 else
5756 CmdArgs.push_back("/lib/ld-linux.so.3");
5757 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005758 else if (ToolChain.getArch() == llvm::Triple::mips ||
5759 ToolChain.getArch() == llvm::Triple::mipsel)
5760 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005761 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5762 ToolChain.getArch() == llvm::Triple::mips64el)
5763 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005764 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005765 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005766 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005767 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005768 else
5769 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5770 }
5771
5772 CmdArgs.push_back("-o");
5773 CmdArgs.push_back(Output.getFilename());
5774
Rafael Espindola81937ec2010-12-01 01:52:43 +00005775 if (!Args.hasArg(options::OPT_nostdlib) &&
5776 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005777 if (!isAndroid) {
5778 const char *crt1 = NULL;
5779 if (!Args.hasArg(options::OPT_shared)){
5780 if (Args.hasArg(options::OPT_pie))
5781 crt1 = "Scrt1.o";
5782 else
5783 crt1 = "crt1.o";
5784 }
5785 if (crt1)
5786 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005787
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005788 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5789 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005790
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005791 const char *crtbegin;
5792 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005793 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005794 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005795 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005796 else if (Args.hasArg(options::OPT_pie))
5797 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005798 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005799 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5801 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005802
5803 Args.AddAllArgs(CmdArgs, options::OPT_L);
5804
5805 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5806
Roman Divackyee8188a2011-03-01 17:53:14 +00005807 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5808 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005809 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005810
Rafael Espindola9446d762012-04-09 23:53:34 +00005811 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5812 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5813 // forward.
5814 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5815 CmdArgs.push_back("-plugin");
5816 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5817 CmdArgs.push_back(Args.MakeArgString(Plugin));
5818 }
5819
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005820 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5821 CmdArgs.push_back("--no-demangle");
5822
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005823 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5824
Chandler Carruth94a32012012-05-14 18:31:18 +00005825 if (D.CCCIsCXX &&
5826 !Args.hasArg(options::OPT_nostdlib) &&
5827 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005828 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5829 !Args.hasArg(options::OPT_static);
5830 if (OnlyLibstdcxxStatic)
5831 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005832 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005833 if (OnlyLibstdcxxStatic)
5834 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005835 CmdArgs.push_back("-lm");
5836 }
5837
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005838 // Call this before we add the C run-time.
5839 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005840 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005841
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005842 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005843 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5844 if (Args.hasArg(options::OPT_static))
5845 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005846
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005847 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005848
Chandler Carruth94a32012012-05-14 18:31:18 +00005849 if (Args.hasArg(options::OPT_pthread) ||
5850 Args.hasArg(options::OPT_pthreads))
5851 CmdArgs.push_back("-lpthread");
5852
5853 CmdArgs.push_back("-lc");
5854
5855 if (Args.hasArg(options::OPT_static))
5856 CmdArgs.push_back("--end-group");
5857 else
5858 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5859 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005860
Rafael Espindola81937ec2010-12-01 01:52:43 +00005861 if (!Args.hasArg(options::OPT_nostartfiles)) {
5862 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005863 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005864 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005865 else if (Args.hasArg(options::OPT_pie))
5866 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005867 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005868 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005869
Rafael Espindola81937ec2010-12-01 01:52:43 +00005870 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005871 if (!isAndroid)
5872 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005873 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005874 }
5875
Bill Wendling08760582011-06-27 19:15:03 +00005876 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005877
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005878 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5879}
Rafael Espindola92b00932010-08-10 00:25:48 +00005880
Chris Lattner3e2ee142010-07-07 16:01:42 +00005881void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005882 const InputInfo &Output,
5883 const InputInfoList &Inputs,
5884 const ArgList &Args,
5885 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005886 ArgStringList CmdArgs;
5887
5888 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5889 options::OPT_Xassembler);
5890
5891 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005892 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005893
5894 for (InputInfoList::const_iterator
5895 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5896 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005897 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005898 }
5899
5900 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005901 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005902 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005903}
5904
5905void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005906 const InputInfo &Output,
5907 const InputInfoList &Inputs,
5908 const ArgList &Args,
5909 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005910 const Driver &D = getToolChain().getDriver();
5911 ArgStringList CmdArgs;
5912
Daniel Dunbarb440f562010-08-02 02:38:21 +00005913 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005914 CmdArgs.push_back("-o");
5915 CmdArgs.push_back(Output.getFilename());
5916 } else {
5917 assert(Output.isNothing() && "Invalid output.");
5918 }
5919
5920 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005921 !Args.hasArg(options::OPT_nostartfiles)) {
5922 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5923 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5924 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5925 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5926 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005927
5928 Args.AddAllArgs(CmdArgs, options::OPT_L);
5929 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5930 Args.AddAllArgs(CmdArgs, options::OPT_e);
5931
Daniel Dunbar54423b22010-09-17 00:24:54 +00005932 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005933
Eli Friedman83de5132011-12-08 23:54:21 +00005934 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5935
Chris Lattner3e2ee142010-07-07 16:01:42 +00005936 if (!Args.hasArg(options::OPT_nostdlib) &&
5937 !Args.hasArg(options::OPT_nodefaultlibs)) {
5938 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005939 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005940 CmdArgs.push_back("-lm");
5941 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005942 }
5943
5944 if (!Args.hasArg(options::OPT_nostdlib) &&
5945 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005946 if (Args.hasArg(options::OPT_pthread))
5947 CmdArgs.push_back("-lpthread");
5948 CmdArgs.push_back("-lc");
5949 CmdArgs.push_back("-lCompilerRT-Generic");
5950 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5951 CmdArgs.push_back(
5952 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005953 }
5954
Eli Friedman83de5132011-12-08 23:54:21 +00005955 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005956 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005957}
5958
Daniel Dunbarcc912342009-05-02 18:28:39 +00005959/// DragonFly Tools
5960
5961// For now, DragonFly Assemble does just about the same as for
5962// FreeBSD, but this may change soon.
5963void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005964 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005965 const InputInfoList &Inputs,
5966 const ArgList &Args,
5967 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005968 ArgStringList CmdArgs;
5969
5970 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5971 // instruct as in the base system to assemble 32-bit code.
5972 if (getToolChain().getArchName() == "i386")
5973 CmdArgs.push_back("--32");
5974
5975 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5976 options::OPT_Xassembler);
5977
5978 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005979 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005980
5981 for (InputInfoList::const_iterator
5982 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5983 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005984 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005985 }
5986
5987 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005988 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005989 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005990}
5991
5992void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005993 const InputInfo &Output,
5994 const InputInfoList &Inputs,
5995 const ArgList &Args,
5996 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005997 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005998 ArgStringList CmdArgs;
5999
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006000 if (!D.SysRoot.empty())
6001 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6002
Daniel Dunbarcc912342009-05-02 18:28:39 +00006003 if (Args.hasArg(options::OPT_static)) {
6004 CmdArgs.push_back("-Bstatic");
6005 } else {
6006 if (Args.hasArg(options::OPT_shared))
6007 CmdArgs.push_back("-Bshareable");
6008 else {
6009 CmdArgs.push_back("-dynamic-linker");
6010 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
6011 }
6012 }
6013
6014 // When building 32-bit code on DragonFly/pc64, we have to explicitly
6015 // instruct ld in the base system to link 32-bit code.
6016 if (getToolChain().getArchName() == "i386") {
6017 CmdArgs.push_back("-m");
6018 CmdArgs.push_back("elf_i386");
6019 }
6020
Daniel Dunbarb440f562010-08-02 02:38:21 +00006021 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00006022 CmdArgs.push_back("-o");
6023 CmdArgs.push_back(Output.getFilename());
6024 } else {
6025 assert(Output.isNothing() && "Invalid output.");
6026 }
6027
6028 if (!Args.hasArg(options::OPT_nostdlib) &&
6029 !Args.hasArg(options::OPT_nostartfiles)) {
6030 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006031 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006032 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006033 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006034 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006035 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006036 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006037 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006038 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006039 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006040 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006041 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006042 }
6043 }
6044
6045 Args.AddAllArgs(CmdArgs, options::OPT_L);
6046 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6047 Args.AddAllArgs(CmdArgs, options::OPT_e);
6048
Daniel Dunbar54423b22010-09-17 00:24:54 +00006049 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006050
6051 if (!Args.hasArg(options::OPT_nostdlib) &&
6052 !Args.hasArg(options::OPT_nodefaultlibs)) {
6053 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6054 // rpaths
6055 CmdArgs.push_back("-L/usr/lib/gcc41");
6056
6057 if (!Args.hasArg(options::OPT_static)) {
6058 CmdArgs.push_back("-rpath");
6059 CmdArgs.push_back("/usr/lib/gcc41");
6060
6061 CmdArgs.push_back("-rpath-link");
6062 CmdArgs.push_back("/usr/lib/gcc41");
6063
6064 CmdArgs.push_back("-rpath");
6065 CmdArgs.push_back("/usr/lib");
6066
6067 CmdArgs.push_back("-rpath-link");
6068 CmdArgs.push_back("/usr/lib");
6069 }
6070
Rafael Espindola38360b32010-07-20 12:59:03 +00006071 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006072 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006073 CmdArgs.push_back("-lm");
6074 }
6075
Daniel Dunbarcc912342009-05-02 18:28:39 +00006076 if (Args.hasArg(options::OPT_shared)) {
6077 CmdArgs.push_back("-lgcc_pic");
6078 } else {
6079 CmdArgs.push_back("-lgcc");
6080 }
6081
6082
6083 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006084 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006085
6086 if (!Args.hasArg(options::OPT_nolibc)) {
6087 CmdArgs.push_back("-lc");
6088 }
6089
6090 if (Args.hasArg(options::OPT_shared)) {
6091 CmdArgs.push_back("-lgcc_pic");
6092 } else {
6093 CmdArgs.push_back("-lgcc");
6094 }
6095 }
6096
6097 if (!Args.hasArg(options::OPT_nostdlib) &&
6098 !Args.hasArg(options::OPT_nostartfiles)) {
6099 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006100 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006101 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006102 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006103 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006104 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006105 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006106 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006107 }
6108
Bill Wendling08760582011-06-27 19:15:03 +00006109 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006110
Daniel Dunbarcc912342009-05-02 18:28:39 +00006111 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006112 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006113 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006114}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006115
6116void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6117 const InputInfo &Output,
6118 const InputInfoList &Inputs,
6119 const ArgList &Args,
6120 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006121 ArgStringList CmdArgs;
6122
6123 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006124 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6125 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006126 } else {
6127 assert(Output.isNothing() && "Invalid output.");
6128 }
6129
6130 if (!Args.hasArg(options::OPT_nostdlib) &&
6131 !Args.hasArg(options::OPT_nostartfiles)) {
6132 CmdArgs.push_back("-defaultlib:libcmt");
6133 }
6134
6135 CmdArgs.push_back("-nologo");
6136
Michael J. Spencere2f49362012-06-18 16:56:04 +00006137 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6138
6139 // Add filenames immediately.
6140 for (InputInfoList::const_iterator
6141 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6142 if (it->isFilename())
6143 CmdArgs.push_back(it->getFilename());
6144 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006145
6146 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006147 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006148 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6149}