blob: 1117202f93979cee4f26932fe5eb83d56d44a30a [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;
222 if (Output.getType() == types::TY_Dependencies) {
Daniel Dunbarb440f562010-08-02 02:38:21 +0000223 DepFile = Output.getFilename();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000224 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
225 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000226 C.addFailureResultFile(DepFile);
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")
445 .Cases("cortex-a8", "cortex-a9", "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
579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
580 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
581
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000582 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
583 FPMath == "vfp4") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000586
587 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000592// Select the float ABI as determined by -msoft-float, -mhard-float, and
593// -mfloat-abi=.
594static StringRef getARMFloatABI(const Driver &D,
595 const ArgList &Args,
596 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000597 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000598 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ)) {
601 if (A->getOption().matches(options::OPT_msoft_float))
602 FloatABI = "soft";
603 else if (A->getOption().matches(options::OPT_mhard_float))
604 FloatABI = "hard";
605 else {
606 FloatABI = A->getValue(Args);
607 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 << A->getAsString(Args);
610 FloatABI = "soft";
611 }
612 }
613 }
614
615 // If unspecified, choose the default based on the platform.
616 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000617 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000618 case llvm::Triple::Darwin:
619 case llvm::Triple::MacOSX:
620 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000621 // Darwin defaults to "softfp" for v6 and v7.
622 //
623 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000624 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000625 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000626 if (StringRef(ArchName).startswith("v6") ||
627 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 FloatABI = "softfp";
629 else
630 FloatABI = "soft";
631 break;
632 }
633
634 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000635 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
642 case llvm::Triple::EABI:
643 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
644 FloatABI = "softfp";
645 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000646 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000647 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000648 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000649 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 default:
656 // Assume "soft", but warn the user we are guessing.
657 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000658 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000659 break;
660 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000661 }
662 }
663
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000664 return FloatABI;
665}
666
667
668void Clang::AddARMTargetArgs(const ArgList &Args,
669 ArgStringList &CmdArgs,
670 bool KernelOrKext) const {
671 const Driver &D = getToolChain().getDriver();
672 llvm::Triple Triple = getToolChain().getTriple();
673
674 // Select the ABI to use.
675 //
676 // FIXME: Support -meabi.
677 const char *ABIName = 0;
678 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
679 ABIName = A->getValue(Args);
680 } else {
681 // Select the default based on the platform.
682 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000683 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000684 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000685 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000686 ABIName = "aapcs-linux";
687 break;
688 case llvm::Triple::EABI:
689 ABIName = "aapcs";
690 break;
691 default:
692 ABIName = "apcs-gnu";
693 }
694 }
695 CmdArgs.push_back("-target-abi");
696 CmdArgs.push_back(ABIName);
697
698 // Set the CPU based on -march= and -mcpu=.
699 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000700 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000701
702 // Determine floating point ABI from the options & target defaults.
703 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000704 if (FloatABI == "soft") {
705 // Floating point operations and argument passing are soft.
706 //
707 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000708 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000709 CmdArgs.push_back("-mfloat-abi");
710 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000711 } else if (FloatABI == "softfp") {
712 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000713 CmdArgs.push_back("-mfloat-abi");
714 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000715 } else {
716 // Floating point operations and argument passing are hard.
717 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000718 CmdArgs.push_back("-mfloat-abi");
719 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000720 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000721
722 // Set appropriate target features for floating point mode.
723 //
724 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
725 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
726 // stripped out by the ARM target.
727
728 // Use software floating point operations?
729 if (FloatABI == "soft") {
730 CmdArgs.push_back("-target-feature");
731 CmdArgs.push_back("+soft-float");
732 }
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard") {
736 CmdArgs.push_back("-target-feature");
737 CmdArgs.push_back("+soft-float-abi");
738 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000739
740 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000742 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000743
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000744 // Honor -mfpmath=.
745 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000746 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000747
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000748 // Setting -msoft-float effectively disables NEON because of the GCC
749 // implementation, although the same isn't true of VFP or VFP3.
750 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000751 CmdArgs.push_back("-target-feature");
752 CmdArgs.push_back("-neon");
753 }
754
755 // Kernel code has more strict alignment requirements.
756 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000757 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000758 CmdArgs.push_back("-arm-long-calls");
759
Daniel Dunbar12100e22011-03-22 16:48:17 +0000760 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000761 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000762
763 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000764 CmdArgs.push_back("-backend-option");
765 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000766 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000767
768 // Setting -mno-global-merge disables the codegen global merge pass. Setting
769 // -mglobal-merge has no effect as the pass is enabled by default.
770 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
771 options::OPT_mno_global_merge)) {
772 if (A->getOption().matches(options::OPT_mno_global_merge))
773 CmdArgs.push_back("-mno-global-merge");
774 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000775
Chad Rosierc14ded72012-05-16 21:19:55 +0000776 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000777 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000778}
779
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000780// Get default architecture.
781static const char* getMipsArchFromCPU(StringRef CPUName) {
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000782 if (CPUName == "mips32" || CPUName == "mips32r2")
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000783 return "mips";
784
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000785 assert((CPUName == "mips64" || CPUName == "mips64r2") &&
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000786 "Unexpected cpu name.");
787
788 return "mips64";
789}
790
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000791// Check that ArchName is a known Mips architecture name.
792static bool checkMipsArchName(StringRef ArchName) {
793 return ArchName == "mips" ||
794 ArchName == "mipsel" ||
795 ArchName == "mips64" ||
796 ArchName == "mips64el";
797}
798
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000799// Get default target cpu.
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000800static const char* getMipsCPUFromArch(StringRef ArchName) {
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000801 if (ArchName == "mips" || ArchName == "mipsel")
Akira Hatanakaa21f5da2011-11-29 23:09:24 +0000802 return "mips32";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000803
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000804 assert((ArchName == "mips64" || ArchName == "mips64el") &&
805 "Unexpected arch name.");
806
807 return "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000808}
809
810// Get default ABI.
811static const char* getMipsABIFromArch(StringRef ArchName) {
812 if (ArchName == "mips" || ArchName == "mipsel")
813 return "o32";
814
815 assert((ArchName == "mips64" || ArchName == "mips64el") &&
816 "Unexpected arch name.");
817 return "n64";
818}
819
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000820// Get CPU and ABI names. They are not independent
821// so we have to calculate them together.
822static void getMipsCPUAndABI(const ArgList &Args,
823 const ToolChain &TC,
824 StringRef &CPUName,
825 StringRef &ABIName) {
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000826 StringRef ArchName;
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000827
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000828 // Select target cpu and architecture.
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000829 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
830 CPUName = A->getValue(Args);
831 ArchName = getMipsArchFromCPU(CPUName);
832 }
833 else {
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000834 ArchName = Args.MakeArgString(TC.getArchName());
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000835 if (!checkMipsArchName(ArchName))
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000836 TC.getDriver().Diag(diag::err_drv_invalid_arch_name) << ArchName;
Akira Hatanaka5e9dde32011-11-30 19:31:38 +0000837 else
838 CPUName = getMipsCPUFromArch(ArchName);
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000839 }
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000840
Eric Christopher0b26a612010-03-02 02:41:08 +0000841 // Select the ABI to use.
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000842 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000843 ABIName = A->getValue(Args);
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000844 else
845 ABIName = getMipsABIFromArch(ArchName);
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000846}
847
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000848// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
849// and -mfloat-abi=.
850static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000851 // Select the float ABI as determined by -msoft-float, -mhard-float,
852 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000853 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000854 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000855 options::OPT_mhard_float,
856 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000857 if (A->getOption().matches(options::OPT_msoft_float))
858 FloatABI = "soft";
859 else if (A->getOption().matches(options::OPT_mhard_float))
860 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000861 else {
862 FloatABI = A->getValue(Args);
863 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000864 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000865 FloatABI = "hard";
866 }
867 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000868 }
869
870 // If unspecified, choose the default based on the platform.
871 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000872 // Assume "hard", because it's a default value used by gcc.
873 // When we start to recognize specific target MIPS processors,
874 // we will be able to select the default more correctly.
875 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000876 }
877
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000878 return FloatABI;
879}
880
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000881static void AddTargetFeature(const ArgList &Args,
882 ArgStringList &CmdArgs,
883 OptSpecifier OnOpt,
884 OptSpecifier OffOpt,
885 StringRef FeatureName) {
886 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
887 CmdArgs.push_back("-target-feature");
888 if (A->getOption().matches(OnOpt))
889 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
890 else
891 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
892 }
893}
894
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000895void Clang::AddMIPSTargetArgs(const ArgList &Args,
896 ArgStringList &CmdArgs) const {
897 const Driver &D = getToolChain().getDriver();
898 StringRef CPUName;
899 StringRef ABIName;
900 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
901
902 CmdArgs.push_back("-target-cpu");
903 CmdArgs.push_back(CPUName.data());
904
905 CmdArgs.push_back("-target-abi");
906 CmdArgs.push_back(ABIName.data());
907
908 StringRef FloatABI = getMipsFloatABI(D, Args);
909
Eric Christopher0b26a612010-03-02 02:41:08 +0000910 if (FloatABI == "soft") {
911 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("soft");
915
916 // FIXME: Note, this is a hack. We need to pass the selected float
917 // mode to the MipsTargetInfoBase to define appropriate macros there.
918 // Now it is the only method.
919 CmdArgs.push_back("-target-feature");
920 CmdArgs.push_back("+soft-float");
921 }
922 else if (FloatABI == "single") {
923 // Restrict the use of hardware floating-point
924 // instructions to 32-bit operations.
925 CmdArgs.push_back("-target-feature");
926 CmdArgs.push_back("+single-float");
927 }
928 else {
929 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000930 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000931 CmdArgs.push_back("-mfloat-abi");
932 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000933 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000934
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000935 AddTargetFeature(Args, CmdArgs,
936 options::OPT_mips16, options::OPT_mno_mips16,
937 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000938 AddTargetFeature(Args, CmdArgs,
939 options::OPT_mdsp, options::OPT_mno_dsp,
940 "dsp");
941 AddTargetFeature(Args, CmdArgs,
942 options::OPT_mdspr2, options::OPT_mno_dspr2,
943 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000944
945 if (Arg *A = Args.getLastArg(options::OPT_G)) {
946 StringRef v = A->getValue(Args);
947 CmdArgs.push_back("-mllvm");
948 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
949 A->claim();
950 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000951}
952
Hal Finkel8eb59282012-06-11 22:35:19 +0000953/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
954static std::string getPPCTargetCPU(const ArgList &Args) {
955 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
956 StringRef CPUName = A->getValue(Args);
957
958 if (CPUName == "native") {
959 std::string CPU = llvm::sys::getHostCPUName();
960 if (!CPU.empty() && CPU != "generic")
961 return CPU;
962 else
963 return "";
964 }
965
966 return llvm::StringSwitch<const char *>(CPUName)
967 .Case("common", "generic")
968 .Case("440", "440")
969 .Case("440fp", "440")
970 .Case("450", "450")
971 .Case("601", "601")
972 .Case("602", "602")
973 .Case("603", "603")
974 .Case("603e", "603e")
975 .Case("603ev", "603ev")
976 .Case("604", "604")
977 .Case("604e", "604e")
978 .Case("620", "620")
979 .Case("G3", "g3")
980 .Case("7400", "7400")
981 .Case("G4", "g4")
982 .Case("7450", "7450")
983 .Case("G4+", "g4+")
984 .Case("750", "750")
985 .Case("970", "970")
986 .Case("G5", "g5")
987 .Case("a2", "a2")
988 .Case("power6", "pwr6")
989 .Case("power7", "pwr7")
990 .Case("powerpc", "ppc")
991 .Case("powerpc64", "ppc64")
992 .Default("");
993 }
994
995 return "";
996}
997
998void Clang::AddPPCTargetArgs(const ArgList &Args,
999 ArgStringList &CmdArgs) const {
1000 std::string TargetCPUName = getPPCTargetCPU(Args);
1001
1002 // LLVM may default to generating code for the native CPU,
1003 // but, like gcc, we default to a more generic option for
1004 // each architecture. (except on Darwin)
1005 llvm::Triple Triple = getToolChain().getTriple();
1006 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
1007 if (Triple.getArch() == llvm::Triple::ppc64)
1008 TargetCPUName = "ppc64";
1009 else
1010 TargetCPUName = "ppc";
1011 }
1012
1013 if (!TargetCPUName.empty()) {
1014 CmdArgs.push_back("-target-cpu");
1015 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
1016 }
1017}
1018
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001019void Clang::AddSparcTargetArgs(const ArgList &Args,
1020 ArgStringList &CmdArgs) const {
1021 const Driver &D = getToolChain().getDriver();
1022
1023 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001024 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001025 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001026 }
1027
1028 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001029 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001030 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1031 options::OPT_mhard_float)) {
1032 if (A->getOption().matches(options::OPT_msoft_float))
1033 FloatABI = "soft";
1034 else if (A->getOption().matches(options::OPT_mhard_float))
1035 FloatABI = "hard";
1036 }
1037
1038 // If unspecified, choose the default based on the platform.
1039 if (FloatABI.empty()) {
1040 switch (getToolChain().getTriple().getOS()) {
1041 default:
1042 // Assume "soft", but warn the user we are guessing.
1043 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001044 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001045 break;
1046 }
1047 }
1048
1049 if (FloatABI == "soft") {
1050 // Floating point operations and argument passing are soft.
1051 //
1052 // FIXME: This changes CPP defines, we need -target-soft-float.
1053 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001054 CmdArgs.push_back("-target-feature");
1055 CmdArgs.push_back("+soft-float");
1056 } else {
1057 assert(FloatABI == "hard" && "Invalid float abi!");
1058 CmdArgs.push_back("-mhard-float");
1059 }
1060}
1061
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001062void Clang::AddX86TargetArgs(const ArgList &Args,
1063 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001064 if (!Args.hasFlag(options::OPT_mred_zone,
1065 options::OPT_mno_red_zone,
1066 true) ||
1067 Args.hasArg(options::OPT_mkernel) ||
1068 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001069 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001070
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001071 if (Args.hasFlag(options::OPT_msoft_float,
1072 options::OPT_mno_soft_float,
1073 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001074 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001075
Daniel Dunbare13ada62009-11-14 22:04:54 +00001076 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001077 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001078 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001079 // FIXME: Reject attempts to use -march=native unless the target matches
1080 // the host.
1081 //
1082 // FIXME: We should also incorporate the detected target features for use
1083 // with -native.
1084 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001085 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001086 CPUName = Args.MakeArgString(CPU);
1087 } else
1088 CPUName = A->getValue(Args);
1089 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001090
Daniel Dunbare13ada62009-11-14 22:04:54 +00001091 // Select the default CPU if none was given (or detection failed).
1092 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001093 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001094 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001095 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001096 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001097 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001098 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001099 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001100 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001101 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001102 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001103 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001104 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001105 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001106 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001108 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001109 } else if (getToolChain().getOS().startswith("bitrig")) {
1110 if (getToolChain().getArch() == llvm::Triple::x86_64)
1111 CPUName = "x86-64";
1112 else if (getToolChain().getArch() == llvm::Triple::x86)
1113 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001114 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001115 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001116 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001117 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001118 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001119 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001120 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001121 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001122 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001123 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001124 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001125 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001126 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001127 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001128 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001129 }
1130 }
1131
Daniel Dunbare13ada62009-11-14 22:04:54 +00001132 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001133 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001134 CmdArgs.push_back(CPUName);
1135 }
1136
Eli Friedmanad811f02011-07-02 00:34:19 +00001137 // The required algorithm here is slightly strange: the options are applied
1138 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1139 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1140 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1141 // former correctly, but not the latter; handle directly-overridden
1142 // attributes here.
1143 llvm::StringMap<unsigned> PrevFeature;
1144 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001145 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1146 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001147 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001148 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001149
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001150 // Skip over "-m".
1151 assert(Name.startswith("-m") && "Invalid feature name.");
1152 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001153
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001154 bool IsNegative = Name.startswith("no-");
1155 if (IsNegative)
1156 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001157
Eli Friedmanad811f02011-07-02 00:34:19 +00001158 unsigned& Prev = PrevFeature[Name];
1159 if (Prev)
1160 Features[Prev - 1] = 0;
1161 Prev = Features.size() + 1;
1162 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1163 }
1164 for (unsigned i = 0; i < Features.size(); i++) {
1165 if (Features[i]) {
1166 CmdArgs.push_back("-target-feature");
1167 CmdArgs.push_back(Features[i]);
1168 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001169 }
1170}
1171
Tony Linthicum76329bf2011-12-12 21:14:55 +00001172static Arg* getLastHexagonArchArg (const ArgList &Args)
1173{
1174 Arg * A = NULL;
1175
Sebastian Pop86500282012-01-13 20:37:10 +00001176 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1177 it != ie; ++it) {
1178 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001179 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1180 A = *it;
1181 A->claim();
1182 }
Sebastian Pop86500282012-01-13 20:37:10 +00001183 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1184 StringRef Value = (*it)->getValue(Args,0);
1185 if (Value.startswith("v")) {
1186 A = *it;
1187 A->claim();
1188 }
1189 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001190 }
1191 return A;
1192}
1193
Sebastian Pop86500282012-01-13 20:37:10 +00001194static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001195{
1196 Arg *A;
1197 llvm::StringRef WhichHexagon;
1198
Sebastian Pop86500282012-01-13 20:37:10 +00001199 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001200 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001201 WhichHexagon = A->getValue(Args);
1202 if (WhichHexagon == "")
1203 return "v4";
1204 else
1205 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001206 }
Sebastian Pop86500282012-01-13 20:37:10 +00001207 else
1208 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001209}
1210
1211void Clang::AddHexagonTargetArgs(const ArgList &Args,
1212 ArgStringList &CmdArgs) const {
1213 llvm::Triple Triple = getToolChain().getTriple();
1214
1215 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001216 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001217 CmdArgs.push_back("-fno-signed-char");
1218 CmdArgs.push_back("-nobuiltininc");
1219
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001220 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001221 CmdArgs.push_back("-mqdsp6-compat");
1222
1223 if (Arg *A = Args.getLastArg(options::OPT_G,
1224 options::OPT_msmall_data_threshold_EQ)) {
1225 std::string SmallDataThreshold="-small-data-threshold=";
1226 SmallDataThreshold += A->getValue(Args);
1227 CmdArgs.push_back ("-mllvm");
1228 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1229 A->claim();
1230 }
1231
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001232 if (!Args.hasArg(options::OPT_fno_short_enums))
1233 CmdArgs.push_back("-fshort-enums");
1234 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1235 CmdArgs.push_back ("-mllvm");
1236 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1237 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001238 CmdArgs.push_back ("-mllvm");
1239 CmdArgs.push_back ("-machine-sink-split=0");
1240}
1241
Eric Christopher84fbdb42011-08-19 00:30:14 +00001242static bool
John McCall5fb5df92012-06-20 06:18:46 +00001243shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001244 const llvm::Triple &Triple) {
1245 // We use the zero-cost exception tables for Objective-C if the non-fragile
1246 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1247 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001248 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001249 return true;
1250
Bob Wilson6524dd32011-10-14 05:03:44 +00001251 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001252 return false;
1253
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001254 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001255 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001256 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001257}
1258
Anders Carlssone96ab552011-02-28 02:27:16 +00001259/// addExceptionArgs - Adds exception related arguments to the driver command
1260/// arguments. There's a master flag, -fexceptions and also language specific
1261/// flags to enable/disable C++ and Objective-C exceptions.
1262/// This makes it possible to for example disable C++ exceptions but enable
1263/// Objective-C exceptions.
1264static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1265 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001266 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001267 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001268 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001269 if (KernelOrKext) {
1270 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1271 // arguments now to avoid warnings about unused arguments.
1272 Args.ClaimAllArgs(options::OPT_fexceptions);
1273 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1274 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1275 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1276 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1277 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001278 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001279 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001280
1281 // Exceptions are enabled by default.
1282 bool ExceptionsEnabled = true;
1283
1284 // This keeps track of whether exceptions were explicitly turned on or off.
1285 bool DidHaveExplicitExceptionFlag = false;
1286
Rafael Espindola00a66572009-10-01 13:33:33 +00001287 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1288 options::OPT_fno_exceptions)) {
1289 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001290 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001291 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001292 ExceptionsEnabled = false;
1293
1294 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001295 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001296
Anders Carlssone96ab552011-02-28 02:27:16 +00001297 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001298
Anders Carlssone96ab552011-02-28 02:27:16 +00001299 // Exception tables and cleanups can be enabled with -fexceptions even if the
1300 // language itself doesn't support exceptions.
1301 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1302 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001303
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001304 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1305 // is not necessarily sensible, but follows GCC.
1306 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001307 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001308 options::OPT_fno_objc_exceptions,
1309 true)) {
1310 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001311
Eric Christopher84fbdb42011-08-19 00:30:14 +00001312 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001313 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001314 }
1315
1316 if (types::isCXX(InputType)) {
1317 bool CXXExceptionsEnabled = ExceptionsEnabled;
1318
Eric Christopher84fbdb42011-08-19 00:30:14 +00001319 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1320 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001321 options::OPT_fexceptions,
1322 options::OPT_fno_exceptions)) {
1323 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1324 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001325 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001326 CXXExceptionsEnabled = false;
1327 }
1328
1329 if (CXXExceptionsEnabled) {
1330 CmdArgs.push_back("-fcxx-exceptions");
1331
1332 ShouldUseExceptionTables = true;
1333 }
1334 }
1335
1336 if (ShouldUseExceptionTables)
1337 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001338}
1339
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001340static bool ShouldDisableCFI(const ArgList &Args,
1341 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001342 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001343 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001344 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001345 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001346 Default = Args.hasFlag(options::OPT_integrated_as,
1347 options::OPT_no_integrated_as,
1348 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001349 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001350 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1351 options::OPT_fno_dwarf2_cfi_asm,
1352 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001353}
1354
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001355static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1356 const ToolChain &TC) {
1357 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1358 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1359 options::OPT_no_integrated_as,
1360 IsIADefault);
1361 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1362 options::OPT_fno_dwarf_directory_asm,
1363 UseIntegratedAs);
1364 return !UseDwarfDirectory;
1365}
1366
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001367/// \brief Check whether the given input tree contains any compilation actions.
1368static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001369 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001370 return true;
1371
1372 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1373 if (ContainsCompileAction(*it))
1374 return true;
1375
1376 return false;
1377}
1378
1379/// \brief Check if -relax-all should be passed to the internal assembler.
1380/// This is done by default when compiling non-assembler source with -O0.
1381static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1382 bool RelaxDefault = true;
1383
1384 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1385 RelaxDefault = A->getOption().matches(options::OPT_O0);
1386
1387 if (RelaxDefault) {
1388 RelaxDefault = false;
1389 for (ActionList::const_iterator it = C.getActions().begin(),
1390 ie = C.getActions().end(); it != ie; ++it) {
1391 if (ContainsCompileAction(*it)) {
1392 RelaxDefault = true;
1393 break;
1394 }
1395 }
1396 }
1397
1398 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1399 RelaxDefault);
1400}
1401
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001402/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1403/// This needs to be called before we add the C run-time (malloc, etc).
1404static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001405 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001406 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001407 options::OPT_fno_address_sanitizer, false))
1408 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001409 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001410 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001411 if (!Args.hasArg(options::OPT_pie))
1412 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001413 // For an executable, we add a .preinit_array stub.
1414 CmdArgs.push_back("-u");
1415 CmdArgs.push_back("__asan_preinit");
1416 CmdArgs.push_back("-lasan");
1417 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001418
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001419 CmdArgs.push_back("-lasan_preload");
1420 CmdArgs.push_back("-ldl");
1421 } else {
1422 if (!Args.hasArg(options::OPT_shared)) {
1423 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1424 // resource directory.
1425 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1426 llvm::sys::path::append(LibAsan, "lib", "linux",
1427 (Twine("libclang_rt.asan-") +
1428 TC.getArchName() + ".a"));
1429 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1430 CmdArgs.push_back("-lpthread");
1431 CmdArgs.push_back("-ldl");
1432 CmdArgs.push_back("-export-dynamic");
1433 }
1434 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001435}
1436
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001437/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1438/// This needs to be called before we add the C run-time (malloc, etc).
1439static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1440 ArgStringList &CmdArgs) {
1441 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1442 options::OPT_fno_thread_sanitizer, false))
1443 return;
1444 if (!Args.hasArg(options::OPT_shared)) {
1445 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1446 // resource directory.
1447 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1448 llvm::sys::path::append(LibTsan, "lib", "linux",
1449 (Twine("libclang_rt.tsan-") +
1450 TC.getArchName() + ".a"));
1451 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1452 CmdArgs.push_back("-lpthread");
1453 CmdArgs.push_back("-ldl");
1454 CmdArgs.push_back("-export-dynamic");
1455 }
1456}
1457
Rafael Espindola224dd632011-12-14 21:02:23 +00001458static bool shouldUseFramePointer(const ArgList &Args,
1459 const llvm::Triple &Triple) {
1460 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1461 options::OPT_fomit_frame_pointer))
1462 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1463
Rafael Espindola00b29182011-12-14 21:50:24 +00001464 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001465 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1466 Triple.getArch() == llvm::Triple::x86) &&
1467 Triple.getOS() == llvm::Triple::Linux) {
1468 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1469 if (!A->getOption().matches(options::OPT_O0))
1470 return false;
1471 }
1472
1473 return true;
1474}
1475
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001476void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001477 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001478 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001479 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001480 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001481 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1482 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001483 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001484 ArgStringList CmdArgs;
1485
Daniel Dunbare521a892009-03-31 20:53:55 +00001486 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1487
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001488 // Invoke ourselves in -cc1 mode.
1489 //
1490 // FIXME: Implement custom jobs for internal actions.
1491 CmdArgs.push_back("-cc1");
1492
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001493 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001494 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001495 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001496 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001497
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001498 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001499 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001500
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001501 if (isa<AnalyzeJobAction>(JA)) {
1502 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1503 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001504 } else if (isa<MigrateJobAction>(JA)) {
1505 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001506 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001507 if (Output.getType() == types::TY_Dependencies)
1508 CmdArgs.push_back("-Eonly");
1509 else
1510 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001511 } else if (isa<AssembleJobAction>(JA)) {
1512 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001513
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001514 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001515 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001516
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001517 // When using an integrated assembler, translate -Wa, and -Xassembler
1518 // options.
1519 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1520 options::OPT_Xassembler),
1521 ie = Args.filtered_end(); it != ie; ++it) {
1522 const Arg *A = *it;
1523 A->claim();
1524
1525 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001526 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001527
1528 if (Value == "-force_cpusubtype_ALL") {
1529 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001530 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001531 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001532 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001533 CmdArgs.push_back("-mllvm");
1534 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001535 } else if (Value == "--noexecstack") {
1536 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001537 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001538 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001539 << A->getOption().getName() << Value;
1540 }
1541 }
1542 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001543
1544 // Also ignore explicit -force_cpusubtype_ALL option.
1545 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001546 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001547 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001548 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001549
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001550 if (JA.getType() == types::TY_Nothing)
1551 CmdArgs.push_back("-fsyntax-only");
1552 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001553 CmdArgs.push_back("-emit-pch");
1554 else
1555 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001556 } else {
1557 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001558
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001559 if (JA.getType() == types::TY_Nothing) {
1560 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001561 } else if (JA.getType() == types::TY_LLVM_IR ||
1562 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001563 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001564 } else if (JA.getType() == types::TY_LLVM_BC ||
1565 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001566 CmdArgs.push_back("-emit-llvm-bc");
1567 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001568 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001569 } else if (JA.getType() == types::TY_AST) {
1570 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001571 } else if (JA.getType() == types::TY_RewrittenObjC) {
1572 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001573 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001574 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1575 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001576 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001577 } else {
1578 assert(JA.getType() == types::TY_PP_Asm &&
1579 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001580 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001581 }
1582
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 // The make clang go fast button.
1584 CmdArgs.push_back("-disable-free");
1585
John McCallbb79b5f2010-02-13 03:50:24 +00001586 // Disable the verification pass in -asserts builds.
1587#ifdef NDEBUG
1588 CmdArgs.push_back("-disable-llvm-verifier");
1589#endif
1590
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001591 // Set the main file name, so that debug info works even with
1592 // -save-temps.
1593 CmdArgs.push_back("-main-file-name");
1594 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1595
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001596 // Some flags which affect the language (via preprocessor
1597 // defines). See darwin::CC1::AddCPPArgs.
1598 if (Args.hasArg(options::OPT_static))
1599 CmdArgs.push_back("-static-define");
1600
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001601 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001602 // Enable region store model by default.
1603 CmdArgs.push_back("-analyzer-store=region");
1604
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001605 // Treat blocks as analysis entry points.
1606 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1607
Ted Kremenek49c79792011-03-24 00:28:47 +00001608 CmdArgs.push_back("-analyzer-eagerly-assume");
1609
Anna Zaks0af3e062012-03-08 23:16:35 +00001610 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001611
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001612 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001613 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001614 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001615
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001616 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1617 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001618
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001619 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001620 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001621
1622 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001623
1624 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001625 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1626 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1627 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1628 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1629 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1630 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001631 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001632
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001633 // Set the output format. The default is plist, for (lame) historical
1634 // reasons.
1635 CmdArgs.push_back("-analyzer-output");
1636 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1637 CmdArgs.push_back(A->getValue(Args));
1638 else
1639 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001640
Ted Kremenekfe449a22010-03-22 22:32:05 +00001641 // Disable the presentation of standard compiler warnings when
1642 // using --analyze. We only want to show static analyzer diagnostics
1643 // or frontend errors.
1644 CmdArgs.push_back("-w");
1645
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001646 // Add -Xanalyzer arguments when running as analyzer.
1647 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001648 }
1649
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001650 CheckCodeGenerationOptions(D, Args);
1651
Daniel Dunbar44e71222009-04-29 18:32:25 +00001652 // Perform argument translation for LLVM backend. This
1653 // takes some care in reconciling with llvm-gcc. The
1654 // issue is that llvm-gcc translates these options based on
1655 // the values in cc1, whereas we are processing based on
1656 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001657
Daniel Dunbar44e71222009-04-29 18:32:25 +00001658 // This comes from the default translation the driver + cc1
1659 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001660
1661 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1662 options::OPT_fpic, options::OPT_fno_pic,
1663 options::OPT_fPIE, options::OPT_fno_PIE,
1664 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001665 bool PICDisabled = false;
1666 bool PICEnabled = false;
1667 bool PICForPIE = false;
1668 if (LastPICArg) {
1669 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1670 LastPICArg->getOption().matches(options::OPT_fpie));
1671 PICEnabled = (PICForPIE ||
1672 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1673 LastPICArg->getOption().matches(options::OPT_fpic));
1674 PICDisabled = !PICEnabled;
1675 }
1676 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1677 // PIC or PIE options above, if these show up, PIC is disabled.
1678 if (Args.hasArg(options::OPT_mkernel))
1679 PICDisabled = true;
1680 if (Args.hasArg(options::OPT_static))
1681 PICDisabled = true;
1682 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1683
1684 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001685 const char *Model = getToolChain().GetForcedPicModel();
1686 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001687 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001688 Model = "dynamic-no-pic";
1689 else if (PICDisabled)
1690 Model = "static";
1691 else if (PICEnabled)
1692 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001693 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001694 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001695 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001696 StringRef ModelStr = Model ? Model : "";
1697 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001698 CmdArgs.push_back("-mrelocation-model");
1699 CmdArgs.push_back(Model);
1700 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001701
Chandler Carruthc0c04552012-04-08 16:40:35 +00001702 // Infer the __PIC__ and __PIE__ values.
1703 if (ModelStr == "pic" && PICForPIE) {
1704 CmdArgs.push_back("-pie-level");
1705 CmdArgs.push_back((LastPICArg &&
1706 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1707 "2" : "1");
1708 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001709 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001710 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1711 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1712 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001713 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001714
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001715 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1716 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001717 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001718
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001719 // LLVM Code Generator Options.
1720
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001721 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1722 CmdArgs.push_back("-mregparm");
1723 CmdArgs.push_back(A->getValue(Args));
1724 }
1725
Roman Divacky65b88cd2011-03-01 17:40:53 +00001726 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1727 CmdArgs.push_back("-mrtd");
1728
Rafael Espindola224dd632011-12-14 21:02:23 +00001729 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001730 CmdArgs.push_back("-mdisable-fp-elim");
1731 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1732 options::OPT_fno_zero_initialized_in_bss))
1733 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001734 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1735 options::OPT_fno_strict_aliasing,
1736 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001737 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001738 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1739 false))
1740 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001741 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1742 options::OPT_fno_optimize_sibling_calls))
1743 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001744
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001745 // Handle various floating point optimization flags, mapping them to the
1746 // appropriate LLVM code generation flags. The pattern for all of these is to
1747 // default off the codegen optimizations, and if any flag enables them and no
1748 // flag disables them after the flag enabling them, enable the codegen
1749 // optimization. This is complicated by several "umbrella" flags.
1750 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1751 options::OPT_ffinite_math_only,
1752 options::OPT_fno_finite_math_only,
1753 options::OPT_fhonor_infinities,
1754 options::OPT_fno_honor_infinities))
1755 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1756 A->getOption().getID() != options::OPT_fhonor_infinities)
1757 CmdArgs.push_back("-menable-no-infs");
1758 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1759 options::OPT_ffinite_math_only,
1760 options::OPT_fno_finite_math_only,
1761 options::OPT_fhonor_nans,
1762 options::OPT_fno_honor_nans))
1763 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1764 A->getOption().getID() != options::OPT_fhonor_nans)
1765 CmdArgs.push_back("-menable-no-nans");
1766
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001767 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1768 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001769 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1770 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001771 options::OPT_fno_math_errno))
1772 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1773 if (MathErrno)
1774 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001775
1776 // There are several flags which require disabling very specific
1777 // optimizations. Any of these being disabled forces us to turn off the
1778 // entire set of LLVM optimizations, so collect them through all the flag
1779 // madness.
1780 bool AssociativeMath = false;
1781 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1782 options::OPT_funsafe_math_optimizations,
1783 options::OPT_fno_unsafe_math_optimizations,
1784 options::OPT_fassociative_math,
1785 options::OPT_fno_associative_math))
1786 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1787 A->getOption().getID() != options::OPT_fno_associative_math)
1788 AssociativeMath = true;
1789 bool ReciprocalMath = false;
1790 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1791 options::OPT_funsafe_math_optimizations,
1792 options::OPT_fno_unsafe_math_optimizations,
1793 options::OPT_freciprocal_math,
1794 options::OPT_fno_reciprocal_math))
1795 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1796 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1797 ReciprocalMath = true;
1798 bool SignedZeros = true;
1799 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1800 options::OPT_funsafe_math_optimizations,
1801 options::OPT_fno_unsafe_math_optimizations,
1802 options::OPT_fsigned_zeros,
1803 options::OPT_fno_signed_zeros))
1804 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1805 A->getOption().getID() != options::OPT_fsigned_zeros)
1806 SignedZeros = false;
1807 bool TrappingMath = true;
1808 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1809 options::OPT_funsafe_math_optimizations,
1810 options::OPT_fno_unsafe_math_optimizations,
1811 options::OPT_ftrapping_math,
1812 options::OPT_fno_trapping_math))
1813 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1814 A->getOption().getID() != options::OPT_ftrapping_math)
1815 TrappingMath = false;
1816 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1817 !TrappingMath)
1818 CmdArgs.push_back("-menable-unsafe-fp-math");
1819
Lang Hamesaa53b932012-07-06 00:59:19 +00001820
1821 // Validate and pass through -fp-contract option.
1822 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1823 options::OPT_ffp_contract)) {
1824 if (A->getOption().getID() == options::OPT_ffp_contract) {
1825 StringRef Val = A->getValue(Args);
1826 if (Val == "fast" || Val == "on" || Val == "off") {
1827 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1828 } else {
1829 D.Diag(diag::err_drv_unsupported_option_argument)
1830 << A->getOption().getName() << Val;
1831 }
1832 } else { // A is OPT_ffast_math
1833 // If fast-math is set then set the fp-contract mode to fast.
1834 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1835 }
1836 }
1837
Bob Wilson6a039162012-07-19 03:52:53 +00001838 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1839 // and if we find them, tell the frontend to provide the appropriate
1840 // preprocessor macros. This is distinct from enabling any optimizations as
1841 // these options induce language changes which must survive serialization
1842 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001843 if (Args.hasArg(options::OPT_ffast_math))
1844 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001845 if (Args.hasArg(options::OPT_ffinite_math_only))
1846 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001847
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001848 // Decide whether to use verbose asm. Verbose assembly is the default on
1849 // toolchains which have the integrated assembler on by default.
1850 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1851 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001852 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001853 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001854 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001855
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001856 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1857 CmdArgs.push_back("-mdebug-pass");
1858 CmdArgs.push_back("Structure");
1859 }
1860 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1861 CmdArgs.push_back("-mdebug-pass");
1862 CmdArgs.push_back("Arguments");
1863 }
1864
John McCall8517abc2010-02-19 02:45:38 +00001865 // Enable -mconstructor-aliases except on darwin, where we have to
1866 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001867 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001868 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001869
John McCall7ef5cb32011-03-18 02:56:14 +00001870 // Darwin's kernel doesn't support guard variables; just die if we
1871 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001872 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001873 CmdArgs.push_back("-fforbid-guard-variables");
1874
Douglas Gregordbe39272011-02-01 15:15:22 +00001875 if (Args.hasArg(options::OPT_mms_bitfields)) {
1876 CmdArgs.push_back("-mms-bitfields");
1877 }
John McCall8517abc2010-02-19 02:45:38 +00001878
Daniel Dunbar306945d2009-09-16 06:17:29 +00001879 // This is a coarse approximation of what llvm-gcc actually does, both
1880 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1881 // complicated ways.
1882 bool AsynchronousUnwindTables =
1883 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1884 options::OPT_fno_asynchronous_unwind_tables,
1885 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001886 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001887 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1888 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001889 CmdArgs.push_back("-munwind-tables");
1890
Rafael Espindola66aa0452012-06-19 01:26:10 +00001891 getToolChain().addClangTargetOptions(CmdArgs);
1892
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001893 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1894 CmdArgs.push_back("-mlimit-float-precision");
1895 CmdArgs.push_back(A->getValue(Args));
1896 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001897
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001898 // FIXME: Handle -mtune=.
1899 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001900
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001901 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001902 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001903 CmdArgs.push_back(A->getValue(Args));
1904 }
1905
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001906 // Add target specific cpu and features flags.
1907 switch(getToolChain().getTriple().getArch()) {
1908 default:
1909 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001910
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001911 case llvm::Triple::arm:
1912 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001913 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001914 break;
1915
Eric Christopher0b26a612010-03-02 02:41:08 +00001916 case llvm::Triple::mips:
1917 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001918 case llvm::Triple::mips64:
1919 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001920 AddMIPSTargetArgs(Args, CmdArgs);
1921 break;
1922
Hal Finkel8eb59282012-06-11 22:35:19 +00001923 case llvm::Triple::ppc:
1924 case llvm::Triple::ppc64:
1925 AddPPCTargetArgs(Args, CmdArgs);
1926 break;
1927
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001928 case llvm::Triple::sparc:
1929 AddSparcTargetArgs(Args, CmdArgs);
1930 break;
1931
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001932 case llvm::Triple::x86:
1933 case llvm::Triple::x86_64:
1934 AddX86TargetArgs(Args, CmdArgs);
1935 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001936
1937 case llvm::Triple::hexagon:
1938 AddHexagonTargetArgs(Args, CmdArgs);
1939 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001940 }
1941
Tony Linthicum76329bf2011-12-12 21:14:55 +00001942
1943
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001944 // Pass the linker version in use.
1945 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1946 CmdArgs.push_back("-target-linker-version");
1947 CmdArgs.push_back(A->getValue(Args));
1948 }
1949
Nick Lewycky75033772011-02-02 06:43:03 +00001950 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001951 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001952 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001953 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001954 CmdArgs.push_back("-momit-leaf-frame-pointer");
1955
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001956 // Explicitly error on some things we know we don't support and can't just
1957 // ignore.
1958 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001959 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1960 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001961 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001962 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001963 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001964 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1965 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001966 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001967 << Unsupported->getOption().getName();
1968 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001969 }
1970
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001971 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001972 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001973 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001974 CmdArgs.push_back("-header-include-file");
1975 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1976 D.CCPrintHeadersFilename : "-");
1977 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001978 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001979 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001980
Chad Rosierbe10f982011-08-02 17:58:04 +00001981 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001982 CmdArgs.push_back("-diagnostic-log-file");
1983 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1984 D.CCLogDiagnosticsFilename : "-");
1985 }
1986
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001987 // Use the last option from "-g" group. "-gline-tables-only" is
1988 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001989 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001990 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1991 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1992 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001993 } else if (!A->getOption().matches(options::OPT_g0) &&
1994 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001995 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001996 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001997 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001998
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001999 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2000 Args.ClaimAllArgs(options::OPT_g_flags_Group);
2001
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002002 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
2003 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
2004
Chris Lattner3c77a352010-06-22 00:03:40 +00002005 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2006
Nick Lewycky207bce32011-04-21 23:44:07 +00002007 if (Args.hasArg(options::OPT_ftest_coverage) ||
2008 Args.hasArg(options::OPT_coverage))
2009 CmdArgs.push_back("-femit-coverage-notes");
2010 if (Args.hasArg(options::OPT_fprofile_arcs) ||
2011 Args.hasArg(options::OPT_coverage))
2012 CmdArgs.push_back("-femit-coverage-data");
2013
Nick Lewycky480cb992011-05-04 20:46:58 +00002014 if (C.getArgs().hasArg(options::OPT_c) ||
2015 C.getArgs().hasArg(options::OPT_S)) {
2016 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00002017 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002018 SmallString<128> absFilename(Output.getFilename());
2019 llvm::sys::fs::make_absolute(absFilename);
2020 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002021 }
2022 }
2023
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002024 // Pass options for controlling the default header search paths.
2025 if (Args.hasArg(options::OPT_nostdinc)) {
2026 CmdArgs.push_back("-nostdsysteminc");
2027 CmdArgs.push_back("-nobuiltininc");
2028 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002029 if (Args.hasArg(options::OPT_nostdlibinc))
2030 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002031 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2032 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2033 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002034
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002035 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002036 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002037 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002038
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002039 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2040
Ted Kremenekf7639e12012-03-06 20:06:33 +00002041 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002042 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002043 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002044 options::OPT_ccc_arcmt_modify,
2045 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002046 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002047 switch (A->getOption().getID()) {
2048 default:
2049 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002050 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002051 CmdArgs.push_back("-arcmt-check");
2052 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002053 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002054 CmdArgs.push_back("-arcmt-modify");
2055 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002056 case options::OPT_ccc_arcmt_migrate:
2057 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002058 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002059 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002060
2061 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2062 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002063 break;
John McCalld70fb982011-06-15 23:25:17 +00002064 }
2065 }
2066 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002067
Ted Kremenekf7639e12012-03-06 20:06:33 +00002068 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2069 if (ARCMTEnabled) {
2070 D.Diag(diag::err_drv_argument_not_allowed_with)
2071 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2072 }
2073 CmdArgs.push_back("-mt-migrate-directory");
2074 CmdArgs.push_back(A->getValue(Args));
2075
2076 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2077 options::OPT_objcmt_migrate_subscripting)) {
2078 // None specified, means enable them all.
2079 CmdArgs.push_back("-objcmt-migrate-literals");
2080 CmdArgs.push_back("-objcmt-migrate-subscripting");
2081 } else {
2082 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2083 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2084 }
2085 }
2086
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002087 // Add preprocessing options like -I, -D, etc. if we are using the
2088 // preprocessor.
2089 //
2090 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002091 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002092 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002093
Rafael Espindolaa7431922011-07-21 23:40:37 +00002094 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2095 // that "The compiler can only warn and ignore the option if not recognized".
2096 // When building with ccache, it will pass -D options to clang even on
2097 // preprocessed inputs and configure concludes that -fPIC is not supported.
2098 Args.ClaimAllArgs(options::OPT_D);
2099
Daniel Dunbar58f78332009-09-17 06:53:36 +00002100 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002101 // others.
2102 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002103 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002104 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002105 else if (A->getOption().matches(options::OPT_O) &&
2106 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002107 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002108 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002109 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002110 }
2111
Daniel Dunbar945577c2009-10-29 02:24:45 +00002112 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002113 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2114 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002115 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002116 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002117
2118 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2119 // (-ansi is equivalent to -std=c89).
2120 //
2121 // If a std is supplied, only add -trigraphs if it follows the
2122 // option.
2123 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2124 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002125 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002126 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002127 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002128 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002129 else
2130 Std->render(Args, CmdArgs);
2131
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002132 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2133 options::OPT_trigraphs))
2134 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002135 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002136 } else {
2137 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002138 //
2139 // FIXME: Clang doesn't correctly handle -std= when the input language
2140 // doesn't match. For the time being just ignore this for C++ inputs;
2141 // eventually we want to do all the standard defaulting here instead of
2142 // splitting it between the driver and clang -cc1.
2143 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002144 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2145 "-std=", /*Joined=*/true);
2146 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2147 CmdArgs.push_back("-std=c++11");
2148
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002149 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002150 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002151
Chandler Carruthb009b142011-04-23 06:30:43 +00002152 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2153 // '-fconst-strings'; this better indicates its actual behavior.
2154 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2155 false)) {
2156 // For perfect compatibility with GCC, we do this even in the presence of
2157 // '-w'. This flag names something other than a warning for GCC.
2158 CmdArgs.push_back("-fconst-strings");
2159 }
2160
Chandler Carruth61fbf622011-04-23 09:27:53 +00002161 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002162 // during C++ compilation, which it is by default. GCC keeps this define even
2163 // in the presence of '-w', match this behavior bug-for-bug.
2164 if (types::isCXX(InputType) &&
2165 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2166 true)) {
2167 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002168 }
2169
Chandler Carruthe0391482010-05-22 02:21:53 +00002170 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2171 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2172 if (Asm->getOption().matches(options::OPT_fasm))
2173 CmdArgs.push_back("-fgnu-keywords");
2174 else
2175 CmdArgs.push_back("-fno-gnu-keywords");
2176 }
2177
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002178 if (ShouldDisableCFI(Args, getToolChain()))
2179 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002180
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002181 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2182 CmdArgs.push_back("-fno-dwarf-directory-asm");
2183
Nick Lewyckyba743b72011-10-21 02:32:14 +00002184 if (const char *pwd = ::getenv("PWD")) {
2185 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2186 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002187 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002188 std::string CompDir = pwd;
2189 CmdArgs.push_back("-fdebug-compilation-dir");
2190 CmdArgs.push_back(Args.MakeArgString(CompDir));
2191 }
2192 }
2193
Richard Smith9a568822011-11-21 19:36:32 +00002194 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2195 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002196 CmdArgs.push_back("-ftemplate-depth");
2197 CmdArgs.push_back(A->getValue(Args));
2198 }
2199
Richard Smith9a568822011-11-21 19:36:32 +00002200 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2201 CmdArgs.push_back("-fconstexpr-depth");
2202 CmdArgs.push_back(A->getValue(Args));
2203 }
2204
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002205 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2206 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002207 if (A->getNumValues()) {
2208 StringRef bytes = A->getValue(Args);
2209 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2210 } else
2211 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002212 }
2213
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002214 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2215 options::OPT_fbounds_checking_EQ)) {
2216 if (A->getNumValues()) {
2217 StringRef val = A->getValue(Args);
2218 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2219 } else
2220 CmdArgs.push_back("-fbounds-checking=1");
2221 }
2222
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002223 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002224 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002225
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002226 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2227 CmdArgs.push_back("-fconstant-string-class");
2228 CmdArgs.push_back(A->getValue(Args));
2229 }
David Chisnall5778fce2009-08-31 16:41:57 +00002230
Chris Lattnere23003d2010-01-09 21:54:33 +00002231 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2232 CmdArgs.push_back("-ftabstop");
2233 CmdArgs.push_back(A->getValue(Args));
2234 }
2235
Chris Lattnerb35583d2010-04-07 20:49:23 +00002236 CmdArgs.push_back("-ferror-limit");
2237 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2238 CmdArgs.push_back(A->getValue(Args));
2239 else
2240 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002241
Chandler Carrutha77a7272010-05-06 04:55:18 +00002242 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2243 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002244 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002245 }
2246
2247 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2248 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002249 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002250 }
2251
Richard Smithf6f003a2011-12-16 19:06:07 +00002252 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2253 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2254 CmdArgs.push_back(A->getValue(Args));
2255 }
2256
Daniel Dunbar2c978472009-11-04 06:24:47 +00002257 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002258 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002259 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002260 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002261 } else {
2262 // If -fmessage-length=N was not specified, determine whether this is a
2263 // terminal and, if so, implicitly define -fmessage-length appropriately.
2264 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002265 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002266 }
2267
Daniel Dunbare357d562009-12-03 18:42:11 +00002268 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2269 CmdArgs.push_back("-fvisibility");
2270 CmdArgs.push_back(A->getValue(Args));
2271 }
2272
Douglas Gregor08329632010-06-15 17:05:35 +00002273 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002274
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002275 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2276
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002277 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002278 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2279 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002280 CmdArgs.push_back("-ffreestanding");
2281
Daniel Dunbare357d562009-12-03 18:42:11 +00002282 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002283 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002284 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002285 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002286 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002287 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002288 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002289 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002290 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2291 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002292
2293 // Report and error for -faltivec on anything other then PowerPC.
2294 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2295 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2296 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2297 D.Diag(diag::err_drv_argument_only_allowed_with)
2298 << A->getAsString(Args) << "ppc/ppc64";
2299
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002300 if (getToolChain().SupportsProfiling())
2301 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002302
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002303 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2304 options::OPT_fno_address_sanitizer, false))
2305 CmdArgs.push_back("-faddress-sanitizer");
2306
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002307 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2308 options::OPT_fno_thread_sanitizer, false))
2309 CmdArgs.push_back("-fthread-sanitizer");
2310
Daniel Dunbar35621a92010-03-16 16:57:46 +00002311 // -flax-vector-conversions is default.
2312 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2313 options::OPT_fno_lax_vector_conversions))
2314 CmdArgs.push_back("-fno-lax-vector-conversions");
2315
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002316 if (Args.getLastArg(options::OPT_fapple_kext))
2317 CmdArgs.push_back("-fapple-kext");
2318
David Blaikie690f21e2012-06-14 18:55:27 +00002319 if (Args.hasFlag(options::OPT_frewrite_includes,
2320 options::OPT_fno_rewrite_includes, false))
2321 CmdArgs.push_back("-frewrite-includes");
2322
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002323 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002324 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002325 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002326 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2327 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002328
2329 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2330 CmdArgs.push_back("-ftrapv-handler");
2331 CmdArgs.push_back(A->getValue(Args));
2332 }
2333
Bob Wilson14adb362012-02-03 06:27:22 +00002334 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002335
Chandler Carruth6e501032011-03-27 00:04:55 +00002336 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2337 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2338 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2339 options::OPT_fno_wrapv)) {
2340 if (A->getOption().matches(options::OPT_fwrapv))
2341 CmdArgs.push_back("-fwrapv");
2342 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2343 options::OPT_fno_strict_overflow)) {
2344 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2345 CmdArgs.push_back("-fwrapv");
2346 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002347 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002348 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002349
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002350 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2351
Daniel Dunbar4930e332009-11-17 08:07:36 +00002352 // -stack-protector=0 is default.
2353 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002354 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2355 options::OPT_fstack_protector_all,
2356 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002357 if (A->getOption().matches(options::OPT_fstack_protector))
2358 StackProtectorLevel = 1;
2359 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2360 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002361 } else {
2362 StackProtectorLevel =
2363 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2364 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002365 if (StackProtectorLevel) {
2366 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002367 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002368
2369 // --param ssp-buffer-size=
2370 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2371 ie = Args.filtered_end(); it != ie; ++it) {
2372 StringRef Str((*it)->getValue(Args));
2373 if (Str.startswith("ssp-buffer-size=")) {
2374 CmdArgs.push_back("-stack-protector-buffer-size");
2375 // FIXME: Verify the argument is a valid integer.
2376 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
2377 (*it)->claim();
2378 }
2379 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002380 }
2381
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002382 // Translate -mstackrealign
2383 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2384 false)) {
2385 CmdArgs.push_back("-backend-option");
2386 CmdArgs.push_back("-force-align-stack");
2387 }
2388 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2389 false)) {
2390 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2391 }
2392
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002393 if (Args.hasArg(options::OPT_mstack_alignment)) {
2394 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2395 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002396 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002397
Daniel Dunbard18049a2009-04-07 21:16:11 +00002398 // Forward -f options with positive and negative forms; we translate
2399 // these by hand.
2400
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002401 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002402 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002403 CmdArgs.push_back("-fapple-kext");
2404 if (!Args.hasArg(options::OPT_fbuiltin))
2405 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002406 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002407 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002408 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002409 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002410 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002411
Nuno Lopes13c88c72009-12-16 16:59:22 +00002412 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2413 options::OPT_fno_assume_sane_operator_new))
2414 CmdArgs.push_back("-fno-assume-sane-operator-new");
2415
Daniel Dunbar4930e332009-11-17 08:07:36 +00002416 // -fblocks=0 is default.
2417 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002418 getToolChain().IsBlocksDefault()) ||
2419 (Args.hasArg(options::OPT_fgnu_runtime) &&
2420 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2421 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002422 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002423
2424 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2425 !getToolChain().hasBlocksRuntime())
2426 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002427 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002428
Douglas Gregor226173a2012-01-18 15:19:58 +00002429 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2430 // users must also pass -fcxx-modules. The latter flag will disappear once the
2431 // modules implementation is solid for C++/Objective-C++ programs as well.
2432 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2433 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2434 options::OPT_fno_cxx_modules,
2435 false);
2436 if (AllowedInCXX || !types::isCXX(InputType))
2437 CmdArgs.push_back("-fmodules");
2438 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002439
John McCalldfea9982010-04-09 19:12:06 +00002440 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002441 if (Args.hasFlag(options::OPT_fno_access_control,
2442 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002443 false))
John McCall3155f572010-04-09 19:03:51 +00002444 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002445
Anders Carlssond470fef2010-11-21 00:09:52 +00002446 // -felide-constructors is the default.
2447 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2448 options::OPT_felide_constructors,
2449 false))
2450 CmdArgs.push_back("-fno-elide-constructors");
2451
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002452 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002453 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2454 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002455 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002456
Tony Linthicum76329bf2011-12-12 21:14:55 +00002457 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002458 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002459 options::OPT_fno_short_enums,
2460 getToolChain().getTriple().getArch() ==
2461 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002462 CmdArgs.push_back("-fshort-enums");
2463
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002464 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002465 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002466 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002467 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002468
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002469 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002470 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002471 options::OPT_fno_threadsafe_statics))
2472 CmdArgs.push_back("-fno-threadsafe-statics");
2473
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002474 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002475 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2476 options::OPT_fno_use_cxa_atexit,
2477 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002478 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002479 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2480 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002481 CmdArgs.push_back("-fno-use-cxa-atexit");
2482
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002483 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002484 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002485 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2486 CmdArgs.push_back("-fms-extensions");
2487
Chad Rosiered943242012-07-20 21:20:33 +00002488 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002489 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2490 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002491
Francois Pichet1b4f1632011-09-17 04:32:15 +00002492 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002493 if (Args.hasFlag(options::OPT_fms_compatibility,
2494 options::OPT_fno_ms_compatibility,
2495 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2496 Args.hasFlag(options::OPT_fms_extensions,
2497 options::OPT_fno_ms_extensions,
2498 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002499 CmdArgs.push_back("-fms-compatibility");
2500
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002501 // -fmsc-version=1300 is default.
2502 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2503 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2504 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002505 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002506 if (msc_ver.empty())
2507 CmdArgs.push_back("-fmsc-version=1300");
2508 else
2509 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2510 }
2511
2512
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002513 // -fborland-extensions=0 is default.
2514 if (Args.hasFlag(options::OPT_fborland_extensions,
2515 options::OPT_fno_borland_extensions, false))
2516 CmdArgs.push_back("-fborland-extensions");
2517
Francois Pichet02744872011-09-01 16:38:08 +00002518 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2519 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002520 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2521 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002522 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002523 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002524
Chandler Carruthe03aa552010-04-17 20:17:31 +00002525 // -fgnu-keywords default varies depending on language; only pass if
2526 // specified.
2527 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002528 options::OPT_fno_gnu_keywords))
2529 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002530
Rafael Espindola922a6242011-06-02 17:30:53 +00002531 if (Args.hasFlag(options::OPT_fgnu89_inline,
2532 options::OPT_fno_gnu89_inline,
2533 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002534 CmdArgs.push_back("-fgnu89-inline");
2535
Chad Rosier9c76d242012-03-15 22:31:42 +00002536 if (Args.hasArg(options::OPT_fno_inline))
2537 CmdArgs.push_back("-fno-inline");
2538
Chad Rosier64d6be92012-03-06 21:17:19 +00002539 if (Args.hasArg(options::OPT_fno_inline_functions))
2540 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002541
John McCall5fb5df92012-06-20 06:18:46 +00002542 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002543
John McCall5fb5df92012-06-20 06:18:46 +00002544 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2545 // legacy is the default.
2546 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002547 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2548 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002549 objcRuntime.isLegacyDispatchDefaultForArch(
2550 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002551 if (getToolChain().UseObjCMixedDispatch())
2552 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2553 else
2554 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2555 }
2556 }
2557
Nico Weber97bd94b2012-03-09 21:19:44 +00002558 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2559 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002560 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002561 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2562 }
2563
John McCall24fc0de2011-07-06 00:26:06 +00002564 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2565 // NOTE: This logic is duplicated in ToolChains.cpp.
2566 bool ARC = isObjCAutoRefCount(Args);
2567 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002568 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002569
John McCall24fc0de2011-07-06 00:26:06 +00002570 CmdArgs.push_back("-fobjc-arc");
2571
Chandler Carruth491db322011-11-04 07:34:47 +00002572 // FIXME: It seems like this entire block, and several around it should be
2573 // wrapped in isObjC, but for now we just use it here as this is where it
2574 // was being used previously.
2575 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2576 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2577 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2578 else
2579 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2580 }
2581
John McCall24fc0de2011-07-06 00:26:06 +00002582 // Allow the user to enable full exceptions code emission.
2583 // We define off for Objective-CC, on for Objective-C++.
2584 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2585 options::OPT_fno_objc_arc_exceptions,
2586 /*default*/ types::isCXX(InputType)))
2587 CmdArgs.push_back("-fobjc-arc-exceptions");
2588 }
2589
2590 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2591 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002592 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002593 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002594
John McCall24fc0de2011-07-06 00:26:06 +00002595 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2596 // takes precedence.
2597 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2598 if (!GCArg)
2599 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2600 if (GCArg) {
2601 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002602 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002603 << GCArg->getAsString(Args);
2604 } else if (getToolChain().SupportsObjCGC()) {
2605 GCArg->render(Args, CmdArgs);
2606 } else {
2607 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002608 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002609 << GCArg->getAsString(Args);
2610 }
2611 }
2612
John McCallb5f652e2011-06-22 00:53:57 +00002613 // Add exception args.
2614 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002615 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002616
2617 if (getToolChain().UseSjLjExceptions())
2618 CmdArgs.push_back("-fsjlj-exceptions");
2619
2620 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002621 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2622 options::OPT_fno_assume_sane_operator_new))
2623 CmdArgs.push_back("-fno-assume-sane-operator-new");
2624
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002625 // -fconstant-cfstrings is default, and may be subject to argument translation
2626 // on Darwin.
2627 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2628 options::OPT_fno_constant_cfstrings) ||
2629 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2630 options::OPT_mno_constant_cfstrings))
2631 CmdArgs.push_back("-fno-constant-cfstrings");
2632
John Thompsoned4e2952009-11-05 20:14:16 +00002633 // -fshort-wchar default varies depending on platform; only
2634 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002635 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2636 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002637
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002638 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2639 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002640 //
2641 // FIXME: This is gross; that translation should be pulled from the
2642 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002643 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002644 options::OPT_fno_pascal_strings,
2645 false) ||
2646 Args.hasFlag(options::OPT_mpascal_strings,
2647 options::OPT_mno_pascal_strings,
2648 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002649 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002650
Daniel Dunbar096ed292011-10-05 21:04:55 +00002651 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2652 // -fno-pack-struct doesn't apply to -fpack-struct=.
2653 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002654 std::string PackStructStr = "-fpack-struct=";
2655 PackStructStr += A->getValue(Args);
2656 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002657 } else if (Args.hasFlag(options::OPT_fpack_struct,
2658 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002659 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002660 }
2661
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002662 if (Args.hasArg(options::OPT_mkernel) ||
2663 Args.hasArg(options::OPT_fapple_kext)) {
2664 if (!Args.hasArg(options::OPT_fcommon))
2665 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002666 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002667 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002668
Daniel Dunbard18049a2009-04-07 21:16:11 +00002669 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002670 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002671 CmdArgs.push_back("-fno-common");
2672
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002673 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002674 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002675 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002676 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002677 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002678 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2679
Daniel Dunbar6358d682010-10-15 22:30:42 +00002680 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2681 if (!Args.hasFlag(options::OPT_ffor_scope,
2682 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002683 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002684 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2685
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002686 // -fcaret-diagnostics is default.
2687 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2688 options::OPT_fno_caret_diagnostics, true))
2689 CmdArgs.push_back("-fno-caret-diagnostics");
2690
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002691 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002692 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002693 options::OPT_fno_diagnostics_fixit_info))
2694 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002695
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002696 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002697 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002698 options::OPT_fno_diagnostics_show_option))
2699 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002700
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002701 if (const Arg *A =
2702 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2703 CmdArgs.push_back("-fdiagnostics-show-category");
2704 CmdArgs.push_back(A->getValue(Args));
2705 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002706
Douglas Gregor643c9222011-05-21 17:07:29 +00002707 if (const Arg *A =
2708 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2709 CmdArgs.push_back("-fdiagnostics-format");
2710 CmdArgs.push_back(A->getValue(Args));
2711 }
2712
Chandler Carruthb6766f02011-03-27 01:50:55 +00002713 if (Arg *A = Args.getLastArg(
2714 options::OPT_fdiagnostics_show_note_include_stack,
2715 options::OPT_fno_diagnostics_show_note_include_stack)) {
2716 if (A->getOption().matches(
2717 options::OPT_fdiagnostics_show_note_include_stack))
2718 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2719 else
2720 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2721 }
2722
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002723 // Color diagnostics are the default, unless the terminal doesn't support
2724 // them.
2725 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002726 options::OPT_fno_color_diagnostics,
2727 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002728 CmdArgs.push_back("-fcolor-diagnostics");
2729
Daniel Dunbardb097022009-06-08 21:13:54 +00002730 if (!Args.hasFlag(options::OPT_fshow_source_location,
2731 options::OPT_fno_show_source_location))
2732 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002733
Douglas Gregor643c9222011-05-21 17:07:29 +00002734 if (!Args.hasFlag(options::OPT_fshow_column,
2735 options::OPT_fno_show_column,
2736 true))
2737 CmdArgs.push_back("-fno-show-column");
2738
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002739 if (!Args.hasFlag(options::OPT_fspell_checking,
2740 options::OPT_fno_spell_checking))
2741 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002742
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002743
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002744 // Silently ignore -fasm-blocks for now.
2745 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2746 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002747
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002748 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2749 A->render(Args, CmdArgs);
2750
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002751 // -fdollars-in-identifiers default varies depending on platform and
2752 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002753 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002754 options::OPT_fno_dollars_in_identifiers)) {
2755 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002756 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002757 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002758 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002759 }
2760
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002761 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2762 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002763 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002764 options::OPT_fno_unit_at_a_time)) {
2765 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002766 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002767 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002768
Eli Friedman055c9702011-11-02 01:53:16 +00002769 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2770 options::OPT_fno_apple_pragma_pack, false))
2771 CmdArgs.push_back("-fapple-pragma-pack");
2772
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002773 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002774 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002775 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002776#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002777 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002778 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2779 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2780 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2781 CmdArgs.push_back("-fno-builtin-strcat");
2782 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2783 CmdArgs.push_back("-fno-builtin-strcpy");
2784 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002785#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002786
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002787 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002788 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002789 options::OPT_traditional_cpp)) {
2790 if (isa<PreprocessJobAction>(JA))
2791 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002792 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002793 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002794 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002795
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002796 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002797 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002798
2799 // Handle serialized diagnostics.
2800 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2801 CmdArgs.push_back("-serialize-diagnostic-file");
2802 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2803 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002804
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002805 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2806 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002807 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002808 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2809 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002810 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002811
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002812 // We translate this by hand to the -cc1 argument, since nightly test uses
2813 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002814 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002815 CmdArgs.push_back("-disable-llvm-optzns");
2816 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002817 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002818 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002819
Daniel Dunbard67a3222009-03-30 06:36:42 +00002820 if (Output.getType() == types::TY_Dependencies) {
2821 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002822 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002823 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002824 CmdArgs.push_back(Output.getFilename());
2825 } else {
2826 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002827 }
2828
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002829 for (InputInfoList::const_iterator
2830 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2831 const InputInfo &II = *it;
2832 CmdArgs.push_back("-x");
2833 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002834 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002835 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002836 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002837 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002838 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002839
Chris Lattnere9d7d782009-11-03 19:50:27 +00002840 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2841
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002842 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002843
2844 // Optionally embed the -cc1 level arguments into the debug info, for build
2845 // analysis.
2846 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002847 ArgStringList OriginalArgs;
2848 for (ArgList::const_iterator it = Args.begin(),
2849 ie = Args.end(); it != ie; ++it)
2850 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002851
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002852 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002853 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002854 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002855 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002856 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002857 }
2858 CmdArgs.push_back("-dwarf-debug-flags");
2859 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2860 }
2861
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002862 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002863
Roman Divacky178e01602011-02-10 16:52:03 +00002864 if (Arg *A = Args.getLastArg(options::OPT_pg))
2865 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002866 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002867 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002868
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002869 // Claim some arguments which clang supports automatically.
2870
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002871 // -fpch-preprocess is used with gcc to add a special marker in the output to
2872 // include the PCH file. Clang's PTH solution is completely transparent, so we
2873 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002874 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002875
Daniel Dunbar17731772009-03-23 19:03:36 +00002876 // Claim some arguments which clang doesn't support, but we don't
2877 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002878 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2879 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002880
Rafael Espindolad95a8122011-03-01 05:25:27 +00002881 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002882 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002883 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002884}
2885
Jim Grosbach576452b2012-02-10 20:37:10 +00002886void ClangAs::AddARMTargetArgs(const ArgList &Args,
2887 ArgStringList &CmdArgs) const {
2888 const Driver &D = getToolChain().getDriver();
2889 llvm::Triple Triple = getToolChain().getTriple();
2890
2891 // Set the CPU based on -march= and -mcpu=.
2892 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002893 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002894
2895 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002896 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002897 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002898
2899 // Honor -mfpmath=.
2900 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002901 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002902}
2903
John McCall5fb5df92012-06-20 06:18:46 +00002904/// Add options related to the Objective-C runtime/ABI.
2905///
2906/// Returns true if the runtime is non-fragile.
2907ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2908 ArgStringList &cmdArgs,
2909 RewriteKind rewriteKind) const {
2910 // Look for the controlling runtime option.
2911 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2912 options::OPT_fgnu_runtime,
2913 options::OPT_fobjc_runtime_EQ);
2914
2915 // Just forward -fobjc-runtime= to the frontend. This supercedes
2916 // options about fragility.
2917 if (runtimeArg &&
2918 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2919 ObjCRuntime runtime;
2920 StringRef value = runtimeArg->getValue(args);
2921 if (runtime.tryParse(value)) {
2922 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2923 << value;
2924 }
2925
2926 runtimeArg->render(args, cmdArgs);
2927 return runtime;
2928 }
2929
2930 // Otherwise, we'll need the ABI "version". Version numbers are
2931 // slightly confusing for historical reasons:
2932 // 1 - Traditional "fragile" ABI
2933 // 2 - Non-fragile ABI, version 1
2934 // 3 - Non-fragile ABI, version 2
2935 unsigned objcABIVersion = 1;
2936 // If -fobjc-abi-version= is present, use that to set the version.
2937 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2938 StringRef value = abiArg->getValue(args);
2939 if (value == "1")
2940 objcABIVersion = 1;
2941 else if (value == "2")
2942 objcABIVersion = 2;
2943 else if (value == "3")
2944 objcABIVersion = 3;
2945 else
2946 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2947 << value;
2948 } else {
2949 // Otherwise, determine if we are using the non-fragile ABI.
2950 bool nonFragileABIIsDefault =
2951 (rewriteKind == RK_NonFragile ||
2952 (rewriteKind == RK_None &&
2953 getToolChain().IsObjCNonFragileABIDefault()));
2954 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2955 options::OPT_fno_objc_nonfragile_abi,
2956 nonFragileABIIsDefault)) {
2957 // Determine the non-fragile ABI version to use.
2958#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2959 unsigned nonFragileABIVersion = 1;
2960#else
2961 unsigned nonFragileABIVersion = 2;
2962#endif
2963
2964 if (Arg *abiArg = args.getLastArg(
2965 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2966 StringRef value = abiArg->getValue(args);
2967 if (value == "1")
2968 nonFragileABIVersion = 1;
2969 else if (value == "2")
2970 nonFragileABIVersion = 2;
2971 else
2972 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2973 << value;
2974 }
2975
2976 objcABIVersion = 1 + nonFragileABIVersion;
2977 } else {
2978 objcABIVersion = 1;
2979 }
2980 }
2981
2982 // We don't actually care about the ABI version other than whether
2983 // it's non-fragile.
2984 bool isNonFragile = objcABIVersion != 1;
2985
2986 // If we have no runtime argument, ask the toolchain for its default runtime.
2987 // However, the rewriter only really supports the Mac runtime, so assume that.
2988 ObjCRuntime runtime;
2989 if (!runtimeArg) {
2990 switch (rewriteKind) {
2991 case RK_None:
2992 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2993 break;
2994 case RK_Fragile:
2995 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2996 break;
2997 case RK_NonFragile:
2998 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2999 break;
3000 }
3001
3002 // -fnext-runtime
3003 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
3004 // On Darwin, make this use the default behavior for the toolchain.
3005 if (getToolChain().getTriple().isOSDarwin()) {
3006 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3007
3008 // Otherwise, build for a generic macosx port.
3009 } else {
3010 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3011 }
3012
3013 // -fgnu-runtime
3014 } else {
3015 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003016 // Legacy behaviour is to target the gnustep runtime if we are i
3017 // non-fragile mode or the GCC runtime in fragile mode.
3018 if (isNonFragile)
3019 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3020 else
3021 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003022 }
3023
3024 cmdArgs.push_back(args.MakeArgString(
3025 "-fobjc-runtime=" + runtime.getAsString()));
3026 return runtime;
3027}
3028
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003029void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003030 const InputInfo &Output,
3031 const InputInfoList &Inputs,
3032 const ArgList &Args,
3033 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003034 ArgStringList CmdArgs;
3035
3036 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3037 const InputInfo &Input = Inputs[0];
3038
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003039 // Don't warn about "clang -w -c foo.s"
3040 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003041 // and "clang -emit-llvm -c foo.s"
3042 Args.ClaimAllArgs(options::OPT_emit_llvm);
3043 // and "clang -use-gold-plugin -c foo.s"
3044 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003045
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003046 // Invoke ourselves in -cc1as mode.
3047 //
3048 // FIXME: Implement custom jobs for internal actions.
3049 CmdArgs.push_back("-cc1as");
3050
3051 // Add the "effective" target triple.
3052 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003053 std::string TripleStr =
3054 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003055 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3056
3057 // Set the output mode, we currently only expect to be used as a real
3058 // assembler.
3059 CmdArgs.push_back("-filetype");
3060 CmdArgs.push_back("obj");
3061
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003062 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003063 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003064
Jim Grosbach576452b2012-02-10 20:37:10 +00003065 // Add target specific cpu and features flags.
3066 switch(getToolChain().getTriple().getArch()) {
3067 default:
3068 break;
3069
3070 case llvm::Triple::arm:
3071 case llvm::Triple::thumb:
3072 AddARMTargetArgs(Args, CmdArgs);
3073 break;
3074 }
3075
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003076 // Ignore explicit -force_cpusubtype_ALL option.
3077 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003078
Eric Christopherfc3ee562012-01-10 00:38:01 +00003079 // Determine the original source input.
3080 const Action *SourceAction = &JA;
3081 while (SourceAction->getKind() != Action::InputClass) {
3082 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3083 SourceAction = SourceAction->getInputs()[0];
3084 }
3085
3086 // Forward -g, assuming we are dealing with an actual assembly file.
3087 if (SourceAction->getType() == types::TY_Asm ||
3088 SourceAction->getType() == types::TY_PP_Asm) {
3089 Args.ClaimAllArgs(options::OPT_g_Group);
3090 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3091 if (!A->getOption().matches(options::OPT_g0))
3092 CmdArgs.push_back("-g");
3093 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003094
3095 // Optionally embed the -cc1as level arguments into the debug info, for build
3096 // analysis.
3097 if (getToolChain().UseDwarfDebugFlags()) {
3098 ArgStringList OriginalArgs;
3099 for (ArgList::const_iterator it = Args.begin(),
3100 ie = Args.end(); it != ie; ++it)
3101 (*it)->render(Args, OriginalArgs);
3102
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003103 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003104 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3105 Flags += Exec;
3106 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3107 Flags += " ";
3108 Flags += OriginalArgs[i];
3109 }
3110 CmdArgs.push_back("-dwarf-debug-flags");
3111 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3112 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003113
3114 // FIXME: Add -static support, once we have it.
3115
3116 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3117 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003118 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003119
3120 assert(Output.isFilename() && "Unexpected lipo output.");
3121 CmdArgs.push_back("-o");
3122 CmdArgs.push_back(Output.getFilename());
3123
Daniel Dunbarb440f562010-08-02 02:38:21 +00003124 assert(Input.isFilename() && "Invalid input.");
3125 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003126
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003127 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003128 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003129}
3130
Daniel Dunbara3246a02009-03-18 08:07:30 +00003131void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003132 const InputInfo &Output,
3133 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003134 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003135 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003136 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003137 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003138
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003139 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003140 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003141 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003142 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003143 // Don't forward any -g arguments to assembly steps.
3144 if (isa<AssembleJobAction>(JA) &&
3145 A->getOption().matches(options::OPT_g_Group))
3146 continue;
3147
Daniel Dunbar2da02722009-03-19 07:55:12 +00003148 // It is unfortunate that we have to claim here, as this means
3149 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003150 // platforms using a generic gcc, even if we are just using gcc
3151 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003152 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003153 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003154 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003155 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003156
Daniel Dunbar4e295052010-01-25 22:35:08 +00003157 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003158
3159 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003160 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003161 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003162 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003163
3164 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003165 if (Arch == "powerpc")
3166 CmdArgs.push_back("ppc");
3167 else if (Arch == "powerpc64")
3168 CmdArgs.push_back("ppc64");
3169 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003170 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003171 }
3172
Daniel Dunbar5716d872009-05-02 21:41:52 +00003173 // Try to force gcc to match the tool chain we want, if we recognize
3174 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003175 //
3176 // FIXME: The triple class should directly provide the information we want
3177 // here.
3178 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003179 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003180 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003181 CmdArgs.push_back("-m64");
3182
Daniel Dunbarb440f562010-08-02 02:38:21 +00003183 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003184 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003185 CmdArgs.push_back(Output.getFilename());
3186 } else {
3187 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003188 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003189 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003190
Tony Linthicum76329bf2011-12-12 21:14:55 +00003191 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3192 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003193
3194 // Only pass -x if gcc will understand it; otherwise hope gcc
3195 // understands the suffix correctly. The main use case this would go
3196 // wrong in is for linker inputs if they happened to have an odd
3197 // suffix; really the only way to get this to happen is a command
3198 // like '-x foobar a.c' which will treat a.c like a linker input.
3199 //
3200 // FIXME: For the linker case specifically, can we safely convert
3201 // inputs into '-Wl,' options?
3202 for (InputInfoList::const_iterator
3203 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3204 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003205
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003206 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003207 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3208 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003209 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003210 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003211 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003212 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003213 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003214
Daniel Dunbara3246a02009-03-18 08:07:30 +00003215 if (types::canTypeBeUserSpecified(II.getType())) {
3216 CmdArgs.push_back("-x");
3217 CmdArgs.push_back(types::getTypeName(II.getType()));
3218 }
3219
Daniel Dunbarb440f562010-08-02 02:38:21 +00003220 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003221 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003222 else {
3223 const Arg &A = II.getInputArg();
3224
3225 // Reverse translate some rewritten options.
3226 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3227 CmdArgs.push_back("-lstdc++");
3228 continue;
3229 }
3230
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003231 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003232 A.render(Args, CmdArgs);
3233 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003234 }
3235
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003236 const std::string customGCCName = D.getCCCGenericGCCName();
3237 const char *GCCName;
3238 if (!customGCCName.empty())
3239 GCCName = customGCCName.c_str();
3240 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003241 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003242 } else
3243 GCCName = "gcc";
3244
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003245 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003246 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003247 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003248}
3249
Daniel Dunbar4e295052010-01-25 22:35:08 +00003250void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3251 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003252 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003253}
3254
Daniel Dunbar4e295052010-01-25 22:35:08 +00003255void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3256 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003257 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003258}
3259
Daniel Dunbar4e295052010-01-25 22:35:08 +00003260void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3261 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003262 const Driver &D = getToolChain().getDriver();
3263
Daniel Dunbar4e295052010-01-25 22:35:08 +00003264 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003265 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3266 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003267 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003268 else {
3269 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003270 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003271 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003272
Daniel Dunbar4e295052010-01-25 22:35:08 +00003273 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003274 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003275}
3276
Daniel Dunbar4e295052010-01-25 22:35:08 +00003277void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3278 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003279 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003280}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003281
Daniel Dunbar4e295052010-01-25 22:35:08 +00003282void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3283 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003284 // The types are (hopefully) good enough.
3285}
3286
Tony Linthicum76329bf2011-12-12 21:14:55 +00003287// Hexagon tools start.
3288void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3289 ArgStringList &CmdArgs) const {
3290
3291}
3292void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3293 const InputInfo &Output,
3294 const InputInfoList &Inputs,
3295 const ArgList &Args,
3296 const char *LinkingOutput) const {
3297
3298 const Driver &D = getToolChain().getDriver();
3299 ArgStringList CmdArgs;
3300
3301 std::string MarchString = "-march=";
3302 MarchString += getHexagonTargetCPU(Args);
3303 CmdArgs.push_back(Args.MakeArgString(MarchString));
3304
3305 RenderExtraToolArgs(JA, CmdArgs);
3306
3307 if (Output.isFilename()) {
3308 CmdArgs.push_back("-o");
3309 CmdArgs.push_back(Output.getFilename());
3310 } else {
3311 assert(Output.isNothing() && "Unexpected output");
3312 CmdArgs.push_back("-fsyntax-only");
3313 }
3314
3315
3316 // Only pass -x if gcc will understand it; otherwise hope gcc
3317 // understands the suffix correctly. The main use case this would go
3318 // wrong in is for linker inputs if they happened to have an odd
3319 // suffix; really the only way to get this to happen is a command
3320 // like '-x foobar a.c' which will treat a.c like a linker input.
3321 //
3322 // FIXME: For the linker case specifically, can we safely convert
3323 // inputs into '-Wl,' options?
3324 for (InputInfoList::const_iterator
3325 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3326 const InputInfo &II = *it;
3327
3328 // Don't try to pass LLVM or AST inputs to a generic gcc.
3329 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3330 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3331 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3332 << getToolChain().getTripleString();
3333 else if (II.getType() == types::TY_AST)
3334 D.Diag(clang::diag::err_drv_no_ast_support)
3335 << getToolChain().getTripleString();
3336
3337 if (II.isFilename())
3338 CmdArgs.push_back(II.getFilename());
3339 else
3340 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3341 II.getInputArg().render(Args, CmdArgs);
3342 }
3343
3344 const char *GCCName = "hexagon-as";
3345 const char *Exec =
3346 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3347 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3348
3349}
3350void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3351 ArgStringList &CmdArgs) const {
3352 // The types are (hopefully) good enough.
3353}
3354
3355void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3356 const InputInfo &Output,
3357 const InputInfoList &Inputs,
3358 const ArgList &Args,
3359 const char *LinkingOutput) const {
3360
3361 const Driver &D = getToolChain().getDriver();
3362 ArgStringList CmdArgs;
3363
3364 for (ArgList::const_iterator
3365 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3366 Arg *A = *it;
3367 if (A->getOption().hasForwardToGCC()) {
3368 // Don't forward any -g arguments to assembly steps.
3369 if (isa<AssembleJobAction>(JA) &&
3370 A->getOption().matches(options::OPT_g_Group))
3371 continue;
3372
3373 // It is unfortunate that we have to claim here, as this means
3374 // we will basically never report anything interesting for
3375 // platforms using a generic gcc, even if we are just using gcc
3376 // to get to the assembler.
3377 A->claim();
3378 A->render(Args, CmdArgs);
3379 }
3380 }
3381
3382 RenderExtraToolArgs(JA, CmdArgs);
3383
3384 // Add Arch Information
3385 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003386 if ((A = getLastHexagonArchArg(Args))) {
3387 if (A->getOption().matches(options::OPT_m_Joined))
3388 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003389 else
Sebastian Pop86500282012-01-13 20:37:10 +00003390 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003391 }
Sebastian Pop86500282012-01-13 20:37:10 +00003392 else {
3393 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3394 }
3395
Tony Linthicum76329bf2011-12-12 21:14:55 +00003396 CmdArgs.push_back("-mqdsp6-compat");
3397
3398 const char *GCCName;
3399 if (C.getDriver().CCCIsCXX)
3400 GCCName = "hexagon-g++";
3401 else
3402 GCCName = "hexagon-gcc";
3403 const char *Exec =
3404 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3405
3406 if (Output.isFilename()) {
3407 CmdArgs.push_back("-o");
3408 CmdArgs.push_back(Output.getFilename());
3409 }
3410
3411 for (InputInfoList::const_iterator
3412 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3413 const InputInfo &II = *it;
3414
3415 // Don't try to pass LLVM or AST inputs to a generic gcc.
3416 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3417 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3418 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3419 << getToolChain().getTripleString();
3420 else if (II.getType() == types::TY_AST)
3421 D.Diag(clang::diag::err_drv_no_ast_support)
3422 << getToolChain().getTripleString();
3423
3424 if (II.isFilename())
3425 CmdArgs.push_back(II.getFilename());
3426 else
3427 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3428 II.getInputArg().render(Args, CmdArgs);
3429 }
3430 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3431
3432}
3433// Hexagon tools end.
3434
3435
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003436const char *darwin::CC1::getCC1Name(types::ID Type) const {
3437 switch (Type) {
3438 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003439 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003440 case types::TY_Asm:
3441 case types::TY_C: case types::TY_CHeader:
3442 case types::TY_PP_C: case types::TY_PP_CHeader:
3443 return "cc1";
3444 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003445 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3446 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003447 return "cc1obj";
3448 case types::TY_CXX: case types::TY_CXXHeader:
3449 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3450 return "cc1plus";
3451 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003452 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3453 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003454 return "cc1objplus";
3455 }
3456}
3457
David Blaikie68e081d2011-12-20 02:48:34 +00003458void darwin::CC1::anchor() {}
3459
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003460const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003461 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003462 return Args.MakeArgString(
3463 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003464}
3465
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003466const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003467 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003468 const char *Str = getBaseInputName(Args, Inputs);
3469
Chris Lattner906bb902011-01-16 08:14:11 +00003470 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003471 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003472
3473 return Str;
3474}
3475
3476const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003477darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003478 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003479 // FIXME: Think about this more.
3480 std::string Res;
3481
3482 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3483 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003484 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003485 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003486 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003487 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003488 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003489}
3490
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003491void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003492 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003493 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003494
3495 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003496 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003497
Bob Wilson7ecbd322012-02-07 01:17:55 +00003498 // Erase both -fmodule-cache-path and its argument.
3499 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3500 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003501 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003502 continue;
3503 }
3504
Bob Wilson7ecbd322012-02-07 01:17:55 +00003505 // Remove unsupported -f options.
3506 if (Option.startswith("-f")) {
3507 // Remove -f/-fno- to reduce the number of cases.
3508 if (Option.startswith("-fno-"))
3509 Option = Option.substr(5);
3510 else
3511 Option = Option.substr(2);
3512 RemoveOption = llvm::StringSwitch<bool>(Option)
3513 .Case("altivec", true)
3514 .Case("modules", true)
3515 .Case("diagnostics-show-note-include-stack", true)
3516 .Default(false);
3517 }
3518
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003519 // Handle machine specific options.
3520 if (Option.startswith("-m")) {
3521 RemoveOption = llvm::StringSwitch<bool>(Option)
3522 .Case("-mthumb", true)
3523 .Case("-mno-thumb", true)
3524 .Case("-mno-fused-madd", true)
3525 .Case("-mlong-branch", true)
3526 .Case("-mlongcall", true)
3527 .Case("-mcpu=G4", true)
3528 .Case("-mcpu=G5", true)
3529 .Default(false);
3530 }
3531
3532 // Handle warning options.
3533 if (Option.startswith("-W")) {
3534 // Remove -W/-Wno- to reduce the number of cases.
3535 if (Option.startswith("-Wno-"))
3536 Option = Option.substr(5);
3537 else
3538 Option = Option.substr(2);
3539
3540 RemoveOption = llvm::StringSwitch<bool>(Option)
3541 .Case("address-of-temporary", true)
3542 .Case("ambiguous-member-template", true)
3543 .Case("analyzer-incompatible-plugin", true)
3544 .Case("array-bounds", true)
3545 .Case("array-bounds-pointer-arithmetic", true)
3546 .Case("bind-to-temporary-copy", true)
3547 .Case("bitwise-op-parentheses", true)
3548 .Case("bool-conversions", true)
3549 .Case("builtin-macro-redefined", true)
3550 .Case("c++-hex-floats", true)
3551 .Case("c++0x-compat", true)
3552 .Case("c++0x-extensions", true)
3553 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003554 .Case("c++11-compat", true)
3555 .Case("c++11-extensions", true)
3556 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003557 .Case("conditional-uninitialized", true)
3558 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003559 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003560 .Case("CFString-literal", true)
3561 .Case("constant-logical-operand", true)
3562 .Case("custom-atomic-properties", true)
3563 .Case("default-arg-special-member", true)
3564 .Case("delegating-ctor-cycles", true)
3565 .Case("delete-non-virtual-dtor", true)
3566 .Case("deprecated-implementations", true)
3567 .Case("deprecated-writable-strings", true)
3568 .Case("distributed-object-modifiers", true)
3569 .Case("duplicate-method-arg", true)
3570 .Case("dynamic-class-memaccess", true)
3571 .Case("enum-compare", true)
3572 .Case("exit-time-destructors", true)
3573 .Case("gnu", true)
3574 .Case("gnu-designator", true)
3575 .Case("header-hygiene", true)
3576 .Case("idiomatic-parentheses", true)
3577 .Case("ignored-qualifiers", true)
3578 .Case("implicit-atomic-properties", true)
3579 .Case("incompatible-pointer-types", true)
3580 .Case("incomplete-implementation", true)
3581 .Case("initializer-overrides", true)
3582 .Case("invalid-noreturn", true)
3583 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003584 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003585 .Case("literal-conversion", true)
3586 .Case("literal-range", true)
3587 .Case("local-type-template-args", true)
3588 .Case("logical-op-parentheses", true)
3589 .Case("method-signatures", true)
3590 .Case("microsoft", true)
3591 .Case("mismatched-tags", true)
3592 .Case("missing-method-return-type", true)
3593 .Case("non-pod-varargs", true)
3594 .Case("nonfragile-abi2", true)
3595 .Case("null-arithmetic", true)
3596 .Case("null-dereference", true)
3597 .Case("out-of-line-declaration", true)
3598 .Case("overriding-method-mismatch", true)
3599 .Case("readonly-setter-attrs", true)
3600 .Case("return-stack-address", true)
3601 .Case("self-assign", true)
3602 .Case("semicolon-before-method-body", true)
3603 .Case("sentinel", true)
3604 .Case("shift-overflow", true)
3605 .Case("shift-sign-overflow", true)
3606 .Case("sign-conversion", true)
3607 .Case("sizeof-array-argument", true)
3608 .Case("sizeof-pointer-memaccess", true)
3609 .Case("string-compare", true)
3610 .Case("super-class-method-mismatch", true)
3611 .Case("tautological-compare", true)
3612 .Case("typedef-redefinition", true)
3613 .Case("typename-missing", true)
3614 .Case("undefined-reinterpret-cast", true)
3615 .Case("unknown-warning-option", true)
3616 .Case("unnamed-type-template-args", true)
3617 .Case("unneeded-internal-declaration", true)
3618 .Case("unneeded-member-function", true)
3619 .Case("unused-comparison", true)
3620 .Case("unused-exception-parameter", true)
3621 .Case("unused-member-function", true)
3622 .Case("unused-result", true)
3623 .Case("vector-conversions", true)
3624 .Case("vla", true)
3625 .Case("used-but-marked-unused", true)
3626 .Case("weak-vtables", true)
3627 .Default(false);
3628 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003629 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003630 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003631 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003632 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003633 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003634 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003635 }
3636}
3637
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003638void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003639 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003640 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003641
3642 CheckCodeGenerationOptions(D, Args);
3643
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003644 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003645 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3646 !Args.hasArg(options::OPT_mdynamic_no_pic))
3647 CmdArgs.push_back("-fPIC");
3648
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003649 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3650 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3651 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3652 CmdArgs.push_back("-fno-builtin-strcat");
3653 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3654 CmdArgs.push_back("-fno-builtin-strcpy");
3655 }
3656
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003657 if (Args.hasArg(options::OPT_g_Flag) &&
3658 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3659 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3660}
3661
3662void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3663 const InputInfoList &Inputs,
3664 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003665 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003666
3667 // Derived from cc1_options spec.
3668 if (Args.hasArg(options::OPT_fast) ||
3669 Args.hasArg(options::OPT_fastf) ||
3670 Args.hasArg(options::OPT_fastcp))
3671 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003672
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003673 if (Arg *A = Args.getLastArg(options::OPT_pg))
3674 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003675 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003676 << A->getAsString(Args) << "-fomit-frame-pointer";
3677
3678 AddCC1Args(Args, CmdArgs);
3679
3680 if (!Args.hasArg(options::OPT_Q))
3681 CmdArgs.push_back("-quiet");
3682
3683 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003684 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003685
3686 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3687
3688 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3689 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3690
3691 // FIXME: The goal is to use the user provided -o if that is our
3692 // final output, otherwise to drive from the original input
3693 // name. Find a clean way to go about this.
3694 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3695 Args.hasArg(options::OPT_o)) {
3696 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3697 CmdArgs.push_back("-auxbase-strip");
3698 CmdArgs.push_back(OutputOpt->getValue(Args));
3699 } else {
3700 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003701 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003702 }
3703
3704 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3705
3706 Args.AddAllArgs(CmdArgs, options::OPT_O);
3707 // FIXME: -Wall is getting some special treatment. Investigate.
3708 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3709 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003710 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003711 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003712 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3713 // Honor -std-default.
3714 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3715 "-std=", /*Joined=*/true);
3716 }
3717
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003718 if (Args.hasArg(options::OPT_v))
3719 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003720 if (Args.hasArg(options::OPT_pg) &&
3721 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003722 CmdArgs.push_back("-p");
3723 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003724
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003725 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003726 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3727 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3728 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3729 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3730 //
3731 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003732 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3733 options::OPT_fsyntax_only),
3734 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003735 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3736 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3737 (*it)->claim();
3738 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003739 }
3740 }
3741 } else
3742 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003743
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003744 // Claim Clang only -f options, they aren't worth warning about.
3745 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3746
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003747 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3748 if (Args.hasArg(options::OPT_Qn))
3749 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003750
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003751 // FIXME: This isn't correct.
3752 //Args.AddLastArg(CmdArgs, options::OPT__help)
3753 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3754
3755 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3756
3757 // FIXME: Still don't get what is happening here. Investigate.
3758 Args.AddAllArgs(CmdArgs, options::OPT__param);
3759
3760 if (Args.hasArg(options::OPT_fmudflap) ||
3761 Args.hasArg(options::OPT_fmudflapth)) {
3762 CmdArgs.push_back("-fno-builtin");
3763 CmdArgs.push_back("-fno-merge-constants");
3764 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003765
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003766 if (Args.hasArg(options::OPT_coverage)) {
3767 CmdArgs.push_back("-fprofile-arcs");
3768 CmdArgs.push_back("-ftest-coverage");
3769 }
3770
3771 if (types::isCXX(Inputs[0].getType()))
3772 CmdArgs.push_back("-D__private_extern__=extern");
3773}
3774
3775void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3776 const InputInfoList &Inputs,
3777 const ArgStringList &OutputArgs) const {
3778 // Derived from cpp_options
3779 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003780
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003781 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3782
3783 AddCC1Args(Args, CmdArgs);
3784
3785 // NOTE: The code below has some commonality with cpp_options, but
3786 // in classic gcc style ends up sending things in different
3787 // orders. This may be a good merge candidate once we drop pedantic
3788 // compatibility.
3789
3790 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003791 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003792 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003793 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3794 // Honor -std-default.
3795 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3796 "-std=", /*Joined=*/true);
3797 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003798 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3799 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003800
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003801 // The driver treats -fsyntax-only specially.
3802 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3803
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003804 // Claim Clang only -f options, they aren't worth warning about.
3805 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3806
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003807 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3808 !Args.hasArg(options::OPT_fno_working_directory))
3809 CmdArgs.push_back("-fworking-directory");
3810
3811 Args.AddAllArgs(CmdArgs, options::OPT_O);
3812 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3813 if (Args.hasArg(options::OPT_save_temps))
3814 CmdArgs.push_back("-fpch-preprocess");
3815}
3816
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003817void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003818 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003819 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003820 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003821
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003822 CheckPreprocessingOptions(D, Args);
3823
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003824 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003825 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3826 Args.AddLastArg(CmdArgs, options::OPT_C);
3827 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003828 if (!Args.hasArg(options::OPT_Q))
3829 CmdArgs.push_back("-quiet");
3830 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003831 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003832 Args.AddLastArg(CmdArgs, options::OPT_v);
3833 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3834 Args.AddLastArg(CmdArgs, options::OPT_P);
3835
3836 // FIXME: Handle %I properly.
3837 if (getToolChain().getArchName() == "x86_64") {
3838 CmdArgs.push_back("-imultilib");
3839 CmdArgs.push_back("x86_64");
3840 }
3841
3842 if (Args.hasArg(options::OPT_MD)) {
3843 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003844 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003845 }
3846
3847 if (Args.hasArg(options::OPT_MMD)) {
3848 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003849 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003850 }
3851
3852 Args.AddLastArg(CmdArgs, options::OPT_M);
3853 Args.AddLastArg(CmdArgs, options::OPT_MM);
3854 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3855 Args.AddLastArg(CmdArgs, options::OPT_MG);
3856 Args.AddLastArg(CmdArgs, options::OPT_MP);
3857 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3858 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3859 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3860 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3861 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3862 CmdArgs.push_back("-MQ");
3863 CmdArgs.push_back(OutputOpt->getValue(Args));
3864 }
3865 }
3866
3867 Args.AddLastArg(CmdArgs, options::OPT_remap);
3868 if (Args.hasArg(options::OPT_g3))
3869 CmdArgs.push_back("-dD");
3870 Args.AddLastArg(CmdArgs, options::OPT_H);
3871
3872 AddCPPArgs(Args, CmdArgs);
3873
3874 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3875 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3876
3877 for (InputInfoList::const_iterator
3878 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3879 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003880
Daniel Dunbarb440f562010-08-02 02:38:21 +00003881 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003882 }
3883
3884 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3885 options::OPT_Xpreprocessor);
3886
3887 if (Args.hasArg(options::OPT_fmudflap)) {
3888 CmdArgs.push_back("-D_MUDFLAP");
3889 CmdArgs.push_back("-include");
3890 CmdArgs.push_back("mf-runtime.h");
3891 }
3892
3893 if (Args.hasArg(options::OPT_fmudflapth)) {
3894 CmdArgs.push_back("-D_MUDFLAP");
3895 CmdArgs.push_back("-D_MUDFLAPTH");
3896 CmdArgs.push_back("-include");
3897 CmdArgs.push_back("mf-runtime.h");
3898 }
3899}
3900
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003901void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003902 ArgStringList &CmdArgs) const {
3903 // Derived from cpp spec.
3904
3905 if (Args.hasArg(options::OPT_static)) {
3906 // The gcc spec is broken here, it refers to dynamic but
3907 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003908
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003909 // if (!Args.hasArg(arglist.parser.dynamicOption))
3910 CmdArgs.push_back("-D__STATIC__");
3911 } else
3912 CmdArgs.push_back("-D__DYNAMIC__");
3913
3914 if (Args.hasArg(options::OPT_pthread))
3915 CmdArgs.push_back("-D_REENTRANT");
3916}
3917
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003918void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003919 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003920 const InputInfoList &Inputs,
3921 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003922 const char *LinkingOutput) const {
3923 ArgStringList CmdArgs;
3924
3925 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3926
3927 CmdArgs.push_back("-E");
3928
3929 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003930 Args.hasArg(options::OPT_traditional_cpp))
3931 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003932
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003933 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003934 assert(Output.isFilename() && "Unexpected CC1 output.");
3935 OutputArgs.push_back("-o");
3936 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003937
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003938 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003939 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3940 } else {
3941 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3942 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3943 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003944
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003945 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3946
Chad Rosierc31e48d2011-09-08 00:38:00 +00003947 RemoveCC1UnsupportedArgs(CmdArgs);
3948
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003949 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003950 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003951 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003952 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003953}
3954
3955void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003956 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003957 const InputInfoList &Inputs,
3958 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003959 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003960 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003961 ArgStringList CmdArgs;
3962
3963 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3964
Bob Wilson0090df22012-04-01 23:03:29 +00003965 // Silence warning about unused --serialize-diagnostics
3966 Args.ClaimAllArgs(options::OPT__serialize_diags);
3967
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003968 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003969 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003970 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003971 << A->getAsString(Args) << "-E";
3972
Daniel Dunbar24e52992010-06-07 23:28:45 +00003973 if (JA.getType() == types::TY_LLVM_IR ||
3974 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003975 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003976 else if (JA.getType() == types::TY_LLVM_BC ||
3977 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003978 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003979 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003980 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003981 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003982 else if (JA.getType() != types::TY_PP_Asm &&
3983 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003984 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003985 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003986
3987 ArgStringList OutputArgs;
3988 if (Output.getType() != types::TY_PCH) {
3989 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003990 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003991 OutputArgs.push_back("/dev/null");
3992 else
3993 OutputArgs.push_back(Output.getFilename());
3994 }
3995
3996 // There is no need for this level of compatibility, but it makes
3997 // diffing easier.
3998 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3999 Args.hasArg(options::OPT_S));
4000
4001 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00004002 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004003 if (OutputArgsEarly) {
4004 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4005 } else {
4006 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4007 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4008 }
4009 } else {
4010 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004011
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004012 for (InputInfoList::const_iterator
4013 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4014 const InputInfo &II = *it;
4015
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004016 // Reject AST inputs.
4017 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004018 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004019 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004020 return;
4021 }
4022
Daniel Dunbarb440f562010-08-02 02:38:21 +00004023 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004024 }
4025
4026 if (OutputArgsEarly) {
4027 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4028 } else {
4029 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4030 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4031 }
4032 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004033
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004034 if (Output.getType() == types::TY_PCH) {
4035 assert(Output.isFilename() && "Invalid PCH output.");
4036
4037 CmdArgs.push_back("-o");
4038 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4039 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004040 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004041 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004042 C.addTempFile(TmpPath);
4043 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004044
Eric Christopher84fbdb42011-08-19 00:30:14 +00004045 // If we're emitting a pch file with the last 4 characters of ".pth"
4046 // and falling back to llvm-gcc we want to use ".gch" instead.
4047 std::string OutputFile(Output.getFilename());
4048 size_t loc = OutputFile.rfind(".pth");
4049 if (loc != std::string::npos)
4050 OutputFile.replace(loc, 4, ".gch");
4051 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4052 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004053 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004054
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004055 RemoveCC1UnsupportedArgs(CmdArgs);
4056
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004057 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004058 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004059 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004060 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004061}
4062
Daniel Dunbarbe220842009-03-20 16:06:39 +00004063void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004064 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004065 const InputInfoList &Inputs,
4066 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004067 const char *LinkingOutput) const {
4068 ArgStringList CmdArgs;
4069
4070 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4071 const InputInfo &Input = Inputs[0];
4072
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004073 // Determine the original source input.
4074 const Action *SourceAction = &JA;
4075 while (SourceAction->getKind() != Action::InputClass) {
4076 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4077 SourceAction = SourceAction->getInputs()[0];
4078 }
4079
4080 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004081 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004082 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004083 if (Args.hasArg(options::OPT_gstabs))
4084 CmdArgs.push_back("--gstabs");
4085 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004086 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004087 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004088
Daniel Dunbarbe220842009-03-20 16:06:39 +00004089 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004090 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004091
Daniel Dunbar6d484762010-07-22 01:47:22 +00004092 // Use -force_cpusubtype_ALL on x86 by default.
4093 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4094 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004095 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4096 CmdArgs.push_back("-force_cpusubtype_ALL");
4097
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004098 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4099 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004100 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004101 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004102 CmdArgs.push_back("-static");
4103
Daniel Dunbarbe220842009-03-20 16:06:39 +00004104 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4105 options::OPT_Xassembler);
4106
4107 assert(Output.isFilename() && "Unexpected lipo output.");
4108 CmdArgs.push_back("-o");
4109 CmdArgs.push_back(Output.getFilename());
4110
Daniel Dunbarb440f562010-08-02 02:38:21 +00004111 assert(Input.isFilename() && "Invalid input.");
4112 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004113
4114 // asm_final spec is empty.
4115
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004116 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004117 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004118 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004119}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004120
David Blaikie68e081d2011-12-20 02:48:34 +00004121void darwin::DarwinTool::anchor() {}
4122
Daniel Dunbare9ded432009-09-09 18:36:20 +00004123void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4124 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004125 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004126
Daniel Dunbarc1964212009-03-26 16:23:12 +00004127 // Derived from darwin_arch spec.
4128 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004129 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004130
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004131 // FIXME: Is this needed anymore?
4132 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004133 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004134}
4135
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004136void darwin::Link::AddLinkArgs(Compilation &C,
4137 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004138 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004139 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004140 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004141
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004142 unsigned Version[3] = { 0, 0, 0 };
4143 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4144 bool HadExtra;
4145 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4146 Version[1], Version[2], HadExtra) ||
4147 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004148 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004149 << A->getAsString(Args);
4150 }
4151
4152 // Newer linkers support -demangle, pass it if supported and not disabled by
4153 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004154 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004155 // Don't pass -demangle to ld_classic.
4156 //
4157 // FIXME: This is a temporary workaround, ld should be handling this.
4158 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4159 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004160 if (getToolChain().getArch() == llvm::Triple::x86) {
4161 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4162 options::OPT_Wl_COMMA),
4163 ie = Args.filtered_end(); it != ie; ++it) {
4164 const Arg *A = *it;
4165 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004166 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004167 UsesLdClassic = true;
4168 }
4169 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004170 if (!UsesLdClassic)
4171 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004172 }
4173
Daniel Dunbaref889c72011-06-21 20:55:11 +00004174 // If we are using LTO, then automatically create a temporary file path for
4175 // the linker to use, so that it's lifetime will extend past a possible
4176 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004177 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004178 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004179 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004180 C.addTempFile(TmpPath);
4181 CmdArgs.push_back("-object_path_lto");
4182 CmdArgs.push_back(TmpPath);
4183 }
4184
Daniel Dunbarc1964212009-03-26 16:23:12 +00004185 // Derived from the "link" spec.
4186 Args.AddAllArgs(CmdArgs, options::OPT_static);
4187 if (!Args.hasArg(options::OPT_static))
4188 CmdArgs.push_back("-dynamic");
4189 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4190 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4191 // here. How do we wish to handle such things?
4192 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004193
Daniel Dunbarc1964212009-03-26 16:23:12 +00004194 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004195 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004196 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004197 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004198
4199 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4200 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4201 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4202
4203 Arg *A;
4204 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4205 (A = Args.getLastArg(options::OPT_current__version)) ||
4206 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004207 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004208 << A->getAsString(Args) << "-dynamiclib";
4209
4210 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4211 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4212 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4213 } else {
4214 CmdArgs.push_back("-dylib");
4215
4216 Arg *A;
4217 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4218 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4219 (A = Args.getLastArg(options::OPT_client__name)) ||
4220 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4221 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4222 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004223 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004224 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004225
Daniel Dunbarc1964212009-03-26 16:23:12 +00004226 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4227 "-dylib_compatibility_version");
4228 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4229 "-dylib_current_version");
4230
Daniel Dunbara48823f2010-01-22 02:04:52 +00004231 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004232
4233 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4234 "-dylib_install_name");
4235 }
4236
4237 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4238 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4239 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004240 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004241 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004242 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4243 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4244 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4245 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4246 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4247 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004248 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004249 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4250 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4251 Args.AddAllArgs(CmdArgs, options::OPT_init);
4252
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004253 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004254 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004255
4256 // If we had an explicit -mios-simulator-version-min argument, honor that,
4257 // otherwise use the traditional deployment targets. We can't just check the
4258 // is-sim attribute because existing code follows this path, and the linker
4259 // may not handle the argument.
4260 //
4261 // FIXME: We may be able to remove this, once we can verify no one depends on
4262 // it.
4263 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4264 CmdArgs.push_back("-ios_simulator_version_min");
4265 else if (DarwinTC.isTargetIPhoneOS())
4266 CmdArgs.push_back("-iphoneos_version_min");
4267 else
4268 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004269 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004270
Daniel Dunbarc1964212009-03-26 16:23:12 +00004271 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4272 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4273 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4274 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4275 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004276
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004277 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4278 options::OPT_fno_pie,
4279 options::OPT_fno_PIE)) {
4280 if (A->getOption().matches(options::OPT_fpie) ||
4281 A->getOption().matches(options::OPT_fPIE))
4282 CmdArgs.push_back("-pie");
4283 else
4284 CmdArgs.push_back("-no_pie");
4285 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004286
4287 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4288 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4289 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4290 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4291 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4292 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4293 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4294 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4295 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4296 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4297 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4298 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4299 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4300 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4301 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4302 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004303
Daniel Dunbar84384642011-05-02 21:03:47 +00004304 // Give --sysroot= preference, over the Apple specific behavior to also use
4305 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004306 StringRef sysroot = C.getSysRoot();
4307 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004308 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004309 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004310 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4311 CmdArgs.push_back("-syslibroot");
4312 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004313 }
4314
Daniel Dunbarc1964212009-03-26 16:23:12 +00004315 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4316 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4317 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4318 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4319 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004320 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004321 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4322 Args.AddAllArgs(CmdArgs, options::OPT_y);
4323 Args.AddLastArg(CmdArgs, options::OPT_w);
4324 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4325 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4326 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4327 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4328 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4329 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4330 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4331 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4332 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4333 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4334 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4335 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4336}
4337
4338void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004339 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004340 const InputInfoList &Inputs,
4341 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004342 const char *LinkingOutput) const {
4343 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004344
Daniel Dunbarc1964212009-03-26 16:23:12 +00004345 // The logic here is derived from gcc's behavior; most of which
4346 // comes from specs (starting with link_command). Consult gcc for
4347 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004348 ArgStringList CmdArgs;
4349
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004350 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4351 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4352 options::OPT_ccc_arcmt_migrate)) {
4353 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4354 (*I)->claim();
4355 const char *Exec =
4356 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4357 CmdArgs.push_back(Output.getFilename());
4358 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4359 return;
4360 }
4361
Daniel Dunbarc1964212009-03-26 16:23:12 +00004362 // I'm not sure why this particular decomposition exists in gcc, but
4363 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004364 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004365
Daniel Dunbarc1964212009-03-26 16:23:12 +00004366 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4367 Args.AddAllArgs(CmdArgs, options::OPT_s);
4368 Args.AddAllArgs(CmdArgs, options::OPT_t);
4369 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4370 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004371 Args.AddLastArg(CmdArgs, options::OPT_e);
4372 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4373 Args.AddAllArgs(CmdArgs, options::OPT_r);
4374
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004375 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4376 // members of static archive libraries which implement Objective-C classes or
4377 // categories.
4378 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4379 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004380
Daniel Dunbarc1964212009-03-26 16:23:12 +00004381 CmdArgs.push_back("-o");
4382 CmdArgs.push_back(Output.getFilename());
4383
Chad Rosier06fd3c62012-05-16 23:45:12 +00004384 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004385 !Args.hasArg(options::OPT_nostartfiles)) {
4386 // Derived from startfile spec.
4387 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004388 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004389 if (getDarwinToolChain().isTargetIOSSimulator()) {
4390 // The simulator doesn't have a versioned crt1 file.
4391 CmdArgs.push_back("-ldylib1.o");
4392 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004393 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4394 CmdArgs.push_back("-ldylib1.o");
4395 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004396 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004397 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004398 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004399 CmdArgs.push_back("-ldylib1.10.5.o");
4400 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004401 } else {
4402 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004403 if (!Args.hasArg(options::OPT_static)) {
4404 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004405 if (getDarwinToolChain().isTargetIOSSimulator()) {
4406 // The simulator doesn't have a versioned crt1 file.
4407 CmdArgs.push_back("-lbundle1.o");
4408 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004409 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4410 CmdArgs.push_back("-lbundle1.o");
4411 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004412 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004413 CmdArgs.push_back("-lbundle1.o");
4414 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004415 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004416 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004417 if (Args.hasArg(options::OPT_pg) &&
4418 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004419 if (Args.hasArg(options::OPT_static) ||
4420 Args.hasArg(options::OPT_object) ||
4421 Args.hasArg(options::OPT_preload)) {
4422 CmdArgs.push_back("-lgcrt0.o");
4423 } else {
4424 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004425
Daniel Dunbarc1964212009-03-26 16:23:12 +00004426 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004427 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004428 // By default on OS X 10.8 and later, we don't link with a crt1.o
4429 // file and the linker knows to use _main as the entry point. But,
4430 // when compiling with -pg, we need to link with the gcrt1.o file,
4431 // so pass the -no_new_main option to tell the linker to use the
4432 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004433 if (getDarwinToolChain().isTargetMacOS() &&
4434 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4435 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004436 } else {
4437 if (Args.hasArg(options::OPT_static) ||
4438 Args.hasArg(options::OPT_object) ||
4439 Args.hasArg(options::OPT_preload)) {
4440 CmdArgs.push_back("-lcrt0.o");
4441 } else {
4442 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004443 if (getDarwinToolChain().isTargetIOSSimulator()) {
4444 // The simulator doesn't have a versioned crt1 file.
4445 CmdArgs.push_back("-lcrt1.o");
4446 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004447 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4448 CmdArgs.push_back("-lcrt1.o");
4449 else
4450 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004451 } else {
4452 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4453 CmdArgs.push_back("-lcrt1.o");
4454 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4455 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004456 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004457 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004458
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004459 // darwin_crt2 spec is empty.
4460 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004461 }
4462 }
4463 }
4464 }
4465
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004466 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4467 Args.hasArg(options::OPT_shared_libgcc) &&
4468 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004469 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004470 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004471 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004472 }
4473 }
4474
4475 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004476
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004477 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4478 // symbols may appear. Mark all of them as dynamic_lookup.
4479 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4480 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4481 options::OPT_fno_address_sanitizer, false)) {
4482 if (Args.hasArg(options::OPT_dynamiclib) ||
4483 Args.hasArg(options::OPT_bundle)) {
4484 CmdArgs.push_back("-undefined");
4485 CmdArgs.push_back("dynamic_lookup");
4486 }
4487 }
4488
Daniel Dunbarc1964212009-03-26 16:23:12 +00004489 if (Args.hasArg(options::OPT_fopenmp))
4490 // This is more complicated in gcc...
4491 CmdArgs.push_back("-lgomp");
4492
Douglas Gregor9295df02012-05-15 21:00:27 +00004493 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4494
Bob Wilson16d93952012-05-15 18:57:39 +00004495 if (isObjCRuntimeLinked(Args) &&
4496 !Args.hasArg(options::OPT_nostdlib) &&
4497 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004498 // Avoid linking compatibility stubs on i386 mac.
4499 if (!getDarwinToolChain().isTargetMacOS() ||
4500 getDarwinToolChain().getArchName() != "i386") {
4501 // If we don't have ARC or subscripting runtime support, link in the
4502 // runtime stubs. We have to do this *before* adding any of the normal
4503 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004504 ObjCRuntime runtime =
4505 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004506 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004507 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004508 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004509 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004510 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004511 CmdArgs.push_back("-framework");
4512 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004513 // Link libobj.
4514 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004515 }
John McCall31168b02011-06-15 23:02:42 +00004516
Daniel Dunbarc1964212009-03-26 16:23:12 +00004517 if (LinkingOutput) {
4518 CmdArgs.push_back("-arch_multiple");
4519 CmdArgs.push_back("-final_output");
4520 CmdArgs.push_back(LinkingOutput);
4521 }
4522
Daniel Dunbarc1964212009-03-26 16:23:12 +00004523 if (Args.hasArg(options::OPT_fnested_functions))
4524 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004525
Daniel Dunbarc1964212009-03-26 16:23:12 +00004526 if (!Args.hasArg(options::OPT_nostdlib) &&
4527 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004528 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004529 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004530
Daniel Dunbarc1964212009-03-26 16:23:12 +00004531 // link_ssp spec is empty.
4532
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004533 // Let the tool chain choose which runtime library to link.
4534 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004535 }
4536
Chad Rosier06fd3c62012-05-16 23:45:12 +00004537 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004538 !Args.hasArg(options::OPT_nostartfiles)) {
4539 // endfile_spec is empty.
4540 }
4541
4542 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4543 Args.AddAllArgs(CmdArgs, options::OPT_F);
4544
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004545 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004546 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004547 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004548}
4549
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004550void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004551 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004552 const InputInfoList &Inputs,
4553 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004554 const char *LinkingOutput) const {
4555 ArgStringList CmdArgs;
4556
4557 CmdArgs.push_back("-create");
4558 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004559
4560 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004561 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004562
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004563 for (InputInfoList::const_iterator
4564 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4565 const InputInfo &II = *it;
4566 assert(II.isFilename() && "Unexpected lipo input.");
4567 CmdArgs.push_back(II.getFilename());
4568 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004569 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004570 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004571 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004572}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004573
Daniel Dunbar88299622010-06-04 18:28:36 +00004574void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004575 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004576 const InputInfoList &Inputs,
4577 const ArgList &Args,
4578 const char *LinkingOutput) const {
4579 ArgStringList CmdArgs;
4580
Daniel Dunbareb86b042011-05-09 17:23:16 +00004581 CmdArgs.push_back("-o");
4582 CmdArgs.push_back(Output.getFilename());
4583
Daniel Dunbar88299622010-06-04 18:28:36 +00004584 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4585 const InputInfo &Input = Inputs[0];
4586 assert(Input.isFilename() && "Unexpected dsymutil input.");
4587 CmdArgs.push_back(Input.getFilename());
4588
Daniel Dunbar88299622010-06-04 18:28:36 +00004589 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004590 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004591 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004592}
4593
Eric Christopher551ef452011-08-23 17:56:55 +00004594void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4595 const InputInfo &Output,
4596 const InputInfoList &Inputs,
4597 const ArgList &Args,
4598 const char *LinkingOutput) const {
4599 ArgStringList CmdArgs;
4600 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004601 CmdArgs.push_back("--debug-info");
4602 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004603 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004604
4605 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4606 const InputInfo &Input = Inputs[0];
4607 assert(Input.isFilename() && "Unexpected verify input");
4608
4609 // Grabbing the output of the earlier dsymutil run.
4610 CmdArgs.push_back(Input.getFilename());
4611
4612 const char *Exec =
4613 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4614 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4615}
4616
David Chisnallf571cde2012-02-15 13:39:01 +00004617void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4618 const InputInfo &Output,
4619 const InputInfoList &Inputs,
4620 const ArgList &Args,
4621 const char *LinkingOutput) const {
4622 ArgStringList CmdArgs;
4623
4624 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4625 options::OPT_Xassembler);
4626
4627 CmdArgs.push_back("-o");
4628 CmdArgs.push_back(Output.getFilename());
4629
4630 for (InputInfoList::const_iterator
4631 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4632 const InputInfo &II = *it;
4633 CmdArgs.push_back(II.getFilename());
4634 }
4635
4636 const char *Exec =
4637 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4638 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4639}
4640
4641
4642void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4643 const InputInfo &Output,
4644 const InputInfoList &Inputs,
4645 const ArgList &Args,
4646 const char *LinkingOutput) const {
4647 // FIXME: Find a real GCC, don't hard-code versions here
4648 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4649 const llvm::Triple &T = getToolChain().getTriple();
4650 std::string LibPath = "/usr/lib/";
4651 llvm::Triple::ArchType Arch = T.getArch();
4652 switch (Arch) {
4653 case llvm::Triple::x86:
4654 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4655 T.getOSName()).str() + "/4.5.2/";
4656 break;
4657 case llvm::Triple::x86_64:
4658 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4659 T.getOSName()).str();
4660 GCCLibPath += "/4.5.2/amd64/";
4661 LibPath += "amd64/";
4662 break;
4663 default:
4664 assert(0 && "Unsupported architecture");
4665 }
4666
4667 ArgStringList CmdArgs;
4668
David Chisnall272a0712012-02-29 15:06:12 +00004669 // Demangle C++ names in errors
4670 CmdArgs.push_back("-C");
4671
David Chisnallf571cde2012-02-15 13:39:01 +00004672 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4673 (!Args.hasArg(options::OPT_shared))) {
4674 CmdArgs.push_back("-e");
4675 CmdArgs.push_back("_start");
4676 }
4677
4678 if (Args.hasArg(options::OPT_static)) {
4679 CmdArgs.push_back("-Bstatic");
4680 CmdArgs.push_back("-dn");
4681 } else {
4682 CmdArgs.push_back("-Bdynamic");
4683 if (Args.hasArg(options::OPT_shared)) {
4684 CmdArgs.push_back("-shared");
4685 } else {
4686 CmdArgs.push_back("--dynamic-linker");
4687 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4688 }
4689 }
4690
4691 if (Output.isFilename()) {
4692 CmdArgs.push_back("-o");
4693 CmdArgs.push_back(Output.getFilename());
4694 } else {
4695 assert(Output.isNothing() && "Invalid output.");
4696 }
4697
4698 if (!Args.hasArg(options::OPT_nostdlib) &&
4699 !Args.hasArg(options::OPT_nostartfiles)) {
4700 if (!Args.hasArg(options::OPT_shared)) {
4701 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4702 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004703 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004704 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4705 } else {
4706 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004707 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4708 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004709 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004710 if (getToolChain().getDriver().CCCIsCXX)
4711 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004712 }
4713
4714 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4715
4716 Args.AddAllArgs(CmdArgs, options::OPT_L);
4717 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4718 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004719 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004720
4721 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4722
4723 if (!Args.hasArg(options::OPT_nostdlib) &&
4724 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004725 if (getToolChain().getDriver().CCCIsCXX)
4726 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004727 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004728 if (!Args.hasArg(options::OPT_shared)) {
4729 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004730 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004731 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004732 }
David Chisnallf571cde2012-02-15 13:39:01 +00004733 }
4734
4735 if (!Args.hasArg(options::OPT_nostdlib) &&
4736 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004737 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004738 }
David Chisnall96de9932012-02-16 16:00:47 +00004739 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004740
4741 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4742
4743 const char *Exec =
4744 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4745 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4746}
4747
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004748void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004749 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004750 const InputInfoList &Inputs,
4751 const ArgList &Args,
4752 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004753 ArgStringList CmdArgs;
4754
4755 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4756 options::OPT_Xassembler);
4757
4758 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004759 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004760
4761 for (InputInfoList::const_iterator
4762 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4763 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004764 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004765 }
4766
4767 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004768 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004769 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004770}
4771
4772void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004773 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004774 const InputInfoList &Inputs,
4775 const ArgList &Args,
4776 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004777 ArgStringList CmdArgs;
4778
4779 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004780 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004781 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004782 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004783 }
4784
4785 if (Args.hasArg(options::OPT_static)) {
4786 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004787 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004788 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004789// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004790 CmdArgs.push_back("-Bdynamic");
4791 if (Args.hasArg(options::OPT_shared)) {
4792 CmdArgs.push_back("-shared");
4793 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004794 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004795 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4796 }
4797 }
4798
Daniel Dunbarb440f562010-08-02 02:38:21 +00004799 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004800 CmdArgs.push_back("-o");
4801 CmdArgs.push_back(Output.getFilename());
4802 } else {
4803 assert(Output.isNothing() && "Invalid output.");
4804 }
4805
4806 if (!Args.hasArg(options::OPT_nostdlib) &&
4807 !Args.hasArg(options::OPT_nostartfiles)) {
4808 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004809 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004810 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004811 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004812 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004813 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004814 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004816 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004817 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004818 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004819 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004820 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004821 }
4822
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004823 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4824 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004825 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004826
4827 Args.AddAllArgs(CmdArgs, options::OPT_L);
4828 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4829 Args.AddAllArgs(CmdArgs, options::OPT_e);
4830
Daniel Dunbar54423b22010-09-17 00:24:54 +00004831 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004832
4833 if (!Args.hasArg(options::OPT_nostdlib) &&
4834 !Args.hasArg(options::OPT_nodefaultlibs)) {
4835 // FIXME: For some reason GCC passes -lgcc before adding
4836 // the default system libraries. Just mimic this for now.
4837 CmdArgs.push_back("-lgcc");
4838
4839 if (Args.hasArg(options::OPT_pthread))
4840 CmdArgs.push_back("-pthread");
4841 if (!Args.hasArg(options::OPT_shared))
4842 CmdArgs.push_back("-lc");
4843 CmdArgs.push_back("-lgcc");
4844 }
4845
4846 if (!Args.hasArg(options::OPT_nostdlib) &&
4847 !Args.hasArg(options::OPT_nostartfiles)) {
4848 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004849 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004850 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004851 }
4852
Bill Wendling08760582011-06-27 19:15:03 +00004853 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004854
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004855 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004856 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004857 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004858}
4859
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004860void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004861 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004862 const InputInfoList &Inputs,
4863 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004864 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004865 ArgStringList CmdArgs;
4866
4867 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4868 options::OPT_Xassembler);
4869
4870 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004871 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004872
4873 for (InputInfoList::const_iterator
4874 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4875 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004876 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004877 }
4878
4879 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004880 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004881 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004882}
4883
4884void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004885 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004886 const InputInfoList &Inputs,
4887 const ArgList &Args,
4888 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004889 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004890 ArgStringList CmdArgs;
4891
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004892 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004893 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004894 CmdArgs.push_back("-e");
4895 CmdArgs.push_back("__start");
4896 }
4897
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004898 if (Args.hasArg(options::OPT_static)) {
4899 CmdArgs.push_back("-Bstatic");
4900 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004901 if (Args.hasArg(options::OPT_rdynamic))
4902 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004903 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004904 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004905 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004906 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004907 } else {
4908 CmdArgs.push_back("-dynamic-linker");
4909 CmdArgs.push_back("/usr/libexec/ld.so");
4910 }
4911 }
4912
Daniel Dunbarb440f562010-08-02 02:38:21 +00004913 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004914 CmdArgs.push_back("-o");
4915 CmdArgs.push_back(Output.getFilename());
4916 } else {
4917 assert(Output.isNothing() && "Invalid output.");
4918 }
4919
4920 if (!Args.hasArg(options::OPT_nostdlib) &&
4921 !Args.hasArg(options::OPT_nostartfiles)) {
4922 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004923 if (Args.hasArg(options::OPT_pg))
4924 CmdArgs.push_back(Args.MakeArgString(
4925 getToolChain().GetFilePath("gcrt0.o")));
4926 else
4927 CmdArgs.push_back(Args.MakeArgString(
4928 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004929 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004930 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004931 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004932 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004933 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004934 }
4935 }
4936
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004937 std::string Triple = getToolChain().getTripleString();
4938 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004939 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004940 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004941 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004942
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004943 Args.AddAllArgs(CmdArgs, options::OPT_L);
4944 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4945 Args.AddAllArgs(CmdArgs, options::OPT_e);
4946
Daniel Dunbar54423b22010-09-17 00:24:54 +00004947 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004948
4949 if (!Args.hasArg(options::OPT_nostdlib) &&
4950 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004951 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004952 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004953 if (Args.hasArg(options::OPT_pg))
4954 CmdArgs.push_back("-lm_p");
4955 else
4956 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004957 }
4958
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004959 // FIXME: For some reason GCC passes -lgcc before adding
4960 // the default system libraries. Just mimic this for now.
4961 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004962
4963 if (Args.hasArg(options::OPT_pthread))
Chris Lattnerd0257f72011-02-21 18:36:51 +00004964 CmdArgs.push_back("-lpthread");
Chandler Carruth45661652011-12-17 22:32:42 +00004965 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004966 if (Args.hasArg(options::OPT_pg))
4967 CmdArgs.push_back("-lc_p");
4968 else
4969 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004970 }
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004971 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004972 }
4973
4974 if (!Args.hasArg(options::OPT_nostdlib) &&
4975 !Args.hasArg(options::OPT_nostartfiles)) {
4976 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004977 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004978 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004979 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004980 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004981 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004982 }
4983
4984 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004985 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004986 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004987}
Ed Schoutene33194b2009-04-02 19:13:12 +00004988
Eli Friedman9fa28852012-08-08 23:57:20 +00004989void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4990 const InputInfo &Output,
4991 const InputInfoList &Inputs,
4992 const ArgList &Args,
4993 const char *LinkingOutput) const {
4994 ArgStringList CmdArgs;
4995
4996 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4997 options::OPT_Xassembler);
4998
4999 CmdArgs.push_back("-o");
5000 CmdArgs.push_back(Output.getFilename());
5001
5002 for (InputInfoList::const_iterator
5003 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5004 const InputInfo &II = *it;
5005 CmdArgs.push_back(II.getFilename());
5006 }
5007
5008 const char *Exec =
5009 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5010 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5011}
5012
5013void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5014 const InputInfo &Output,
5015 const InputInfoList &Inputs,
5016 const ArgList &Args,
5017 const char *LinkingOutput) const {
5018 const Driver &D = getToolChain().getDriver();
5019 ArgStringList CmdArgs;
5020
5021 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5022 (!Args.hasArg(options::OPT_shared))) {
5023 CmdArgs.push_back("-e");
5024 CmdArgs.push_back("__start");
5025 }
5026
5027 if (Args.hasArg(options::OPT_static)) {
5028 CmdArgs.push_back("-Bstatic");
5029 } else {
5030 if (Args.hasArg(options::OPT_rdynamic))
5031 CmdArgs.push_back("-export-dynamic");
5032 CmdArgs.push_back("--eh-frame-hdr");
5033 CmdArgs.push_back("-Bdynamic");
5034 if (Args.hasArg(options::OPT_shared)) {
5035 CmdArgs.push_back("-shared");
5036 } else {
5037 CmdArgs.push_back("-dynamic-linker");
5038 CmdArgs.push_back("/usr/libexec/ld.so");
5039 }
5040 }
5041
5042 if (Output.isFilename()) {
5043 CmdArgs.push_back("-o");
5044 CmdArgs.push_back(Output.getFilename());
5045 } else {
5046 assert(Output.isNothing() && "Invalid output.");
5047 }
5048
5049 if (!Args.hasArg(options::OPT_nostdlib) &&
5050 !Args.hasArg(options::OPT_nostartfiles)) {
5051 if (!Args.hasArg(options::OPT_shared)) {
5052 if (Args.hasArg(options::OPT_pg))
5053 CmdArgs.push_back(Args.MakeArgString(
5054 getToolChain().GetFilePath("gcrt0.o")));
5055 else
5056 CmdArgs.push_back(Args.MakeArgString(
5057 getToolChain().GetFilePath("crt0.o")));
5058 CmdArgs.push_back(Args.MakeArgString(
5059 getToolChain().GetFilePath("crtbegin.o")));
5060 } else {
5061 CmdArgs.push_back(Args.MakeArgString(
5062 getToolChain().GetFilePath("crtbeginS.o")));
5063 }
5064 }
5065
5066 Args.AddAllArgs(CmdArgs, options::OPT_L);
5067 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5068 Args.AddAllArgs(CmdArgs, options::OPT_e);
5069
5070 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5071
5072 if (!Args.hasArg(options::OPT_nostdlib) &&
5073 !Args.hasArg(options::OPT_nodefaultlibs)) {
5074 if (D.CCCIsCXX) {
5075 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5076 if (Args.hasArg(options::OPT_pg))
5077 CmdArgs.push_back("-lm_p");
5078 else
5079 CmdArgs.push_back("-lm");
5080 }
5081
5082 if (Args.hasArg(options::OPT_pthread))
5083 CmdArgs.push_back("-lpthread");
5084 if (!Args.hasArg(options::OPT_shared)) {
5085 if (Args.hasArg(options::OPT_pg))
5086 CmdArgs.push_back("-lc_p");
5087 else
5088 CmdArgs.push_back("-lc");
5089 }
5090
5091 std::string myarch = "-lclang_rt.";
5092 const llvm::Triple &T = getToolChain().getTriple();
5093 llvm::Triple::ArchType Arch = T.getArch();
5094 switch (Arch) {
5095 case llvm::Triple::arm:
5096 myarch += ("arm");
5097 break;
5098 case llvm::Triple::x86:
5099 myarch += ("i386");
5100 break;
5101 case llvm::Triple::x86_64:
5102 myarch += ("amd64");
5103 break;
5104 default:
5105 assert(0 && "Unsupported architecture");
5106 }
5107 CmdArgs.push_back(Args.MakeArgString(myarch));
5108 }
5109
5110 if (!Args.hasArg(options::OPT_nostdlib) &&
5111 !Args.hasArg(options::OPT_nostartfiles)) {
5112 if (!Args.hasArg(options::OPT_shared))
5113 CmdArgs.push_back(Args.MakeArgString(
5114 getToolChain().GetFilePath("crtend.o")));
5115 else
5116 CmdArgs.push_back(Args.MakeArgString(
5117 getToolChain().GetFilePath("crtendS.o")));
5118 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005119
5120 const char *Exec =
5121 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5122 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005123}
5124
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005125void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005126 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005127 const InputInfoList &Inputs,
5128 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005129 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005130 ArgStringList CmdArgs;
5131
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005132 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5133 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005134 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005135 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005136 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005137 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005138 else if (getToolChain().getArch() == llvm::Triple::mips ||
5139 getToolChain().getArch() == llvm::Triple::mipsel ||
5140 getToolChain().getArch() == llvm::Triple::mips64 ||
5141 getToolChain().getArch() == llvm::Triple::mips64el) {
5142 StringRef CPUName;
5143 StringRef ABIName;
5144 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005145
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005146 CmdArgs.push_back("-march");
5147 CmdArgs.push_back(CPUName.data());
5148
5149 // Convert ABI name to the GNU tools acceptable variant.
5150 if (ABIName == "o32")
5151 ABIName = "32";
5152 else if (ABIName == "n64")
5153 ABIName = "64";
5154
5155 CmdArgs.push_back("-mabi");
5156 CmdArgs.push_back(ABIName.data());
5157
5158 if (getToolChain().getArch() == llvm::Triple::mips ||
5159 getToolChain().getArch() == llvm::Triple::mips64)
5160 CmdArgs.push_back("-EB");
5161 else
5162 CmdArgs.push_back("-EL");
5163
5164 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5165 options::OPT_fpic, options::OPT_fno_pic,
5166 options::OPT_fPIE, options::OPT_fno_PIE,
5167 options::OPT_fpie, options::OPT_fno_pie);
5168 if (LastPICArg &&
5169 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5170 LastPICArg->getOption().matches(options::OPT_fpic) ||
5171 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5172 LastPICArg->getOption().matches(options::OPT_fpie))) {
5173 CmdArgs.push_back("-KPIC");
5174 }
5175 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005176
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005177 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5178 options::OPT_Xassembler);
5179
5180 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005181 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005182
5183 for (InputInfoList::const_iterator
5184 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5185 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005186 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005187 }
5188
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005189 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005190 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005191 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005192}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005193
5194void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005195 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005196 const InputInfoList &Inputs,
5197 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005198 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005199 const toolchains::FreeBSD& ToolChain =
5200 static_cast<const toolchains::FreeBSD&>(getToolChain());
5201 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005202 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005203
5204 // Silence warning for "clang -g foo.o -o foo"
5205 Args.ClaimAllArgs(options::OPT_g_Group);
5206 // and "clang -emit-llvm foo.o -o foo"
5207 Args.ClaimAllArgs(options::OPT_emit_llvm);
5208 // and for "clang -w foo.o -o foo". Other warning options are already
5209 // handled somewhere else.
5210 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005211
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005212 if (!D.SysRoot.empty())
5213 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5214
Roman Divackyafe2f232012-08-28 15:09:03 +00005215 if (Args.hasArg(options::OPT_pie))
5216 CmdArgs.push_back("-pie");
5217
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005218 if (Args.hasArg(options::OPT_static)) {
5219 CmdArgs.push_back("-Bstatic");
5220 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005221 if (Args.hasArg(options::OPT_rdynamic))
5222 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005223 CmdArgs.push_back("--eh-frame-hdr");
5224 if (Args.hasArg(options::OPT_shared)) {
5225 CmdArgs.push_back("-Bshareable");
5226 } else {
5227 CmdArgs.push_back("-dynamic-linker");
5228 CmdArgs.push_back("/libexec/ld-elf.so.1");
5229 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005230 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5231 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005232 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5233 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5234 CmdArgs.push_back("--hash-style=both");
5235 }
5236 }
5237 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005238 }
5239
5240 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5241 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005242 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005243 CmdArgs.push_back("-m");
5244 CmdArgs.push_back("elf_i386_fbsd");
5245 }
5246
Roman Divackyafe2f232012-08-28 15:09:03 +00005247 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005248 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005249 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005250 }
5251
Daniel Dunbarb440f562010-08-02 02:38:21 +00005252 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005253 CmdArgs.push_back("-o");
5254 CmdArgs.push_back(Output.getFilename());
5255 } else {
5256 assert(Output.isNothing() && "Invalid output.");
5257 }
5258
5259 if (!Args.hasArg(options::OPT_nostdlib) &&
5260 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005261 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005262 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005263 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005264 crt1 = "gcrt1.o";
5265 else if (Args.hasArg(options::OPT_pie))
5266 crt1 = "Scrt1.o";
5267 else
5268 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005269 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005270 if (crt1)
5271 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5272
5273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5274
5275 const char *crtbegin = NULL;
5276 if (Args.hasArg(options::OPT_static))
5277 crtbegin = "crtbeginT.o";
5278 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5279 crtbegin = "crtbeginS.o";
5280 else
5281 crtbegin = "crtbegin.o";
5282
5283 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005284 }
5285
5286 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005287 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005288 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5289 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005290 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005291 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5292 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005293 Args.AddAllArgs(CmdArgs, options::OPT_s);
5294 Args.AddAllArgs(CmdArgs, options::OPT_t);
5295 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5296 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005297
Roman Divackyafe2f232012-08-28 15:09:03 +00005298 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005299
5300 if (!Args.hasArg(options::OPT_nostdlib) &&
5301 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005302 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005303 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005304 if (Args.hasArg(options::OPT_pg))
5305 CmdArgs.push_back("-lm_p");
5306 else
5307 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005308 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005309 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5310 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005311 if (Args.hasArg(options::OPT_pg))
5312 CmdArgs.push_back("-lgcc_p");
5313 else
5314 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005315 if (Args.hasArg(options::OPT_static)) {
5316 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005317 } else if (Args.hasArg(options::OPT_pg)) {
5318 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005319 } else {
5320 CmdArgs.push_back("--as-needed");
5321 CmdArgs.push_back("-lgcc_s");
5322 CmdArgs.push_back("--no-as-needed");
5323 }
5324
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005325 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005326 if (Args.hasArg(options::OPT_pg))
5327 CmdArgs.push_back("-lpthread_p");
5328 else
5329 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005330 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005331
Roman Divacky66f22762011-02-10 16:59:40 +00005332 if (Args.hasArg(options::OPT_pg)) {
5333 if (Args.hasArg(options::OPT_shared))
5334 CmdArgs.push_back("-lc");
5335 else
5336 CmdArgs.push_back("-lc_p");
5337 CmdArgs.push_back("-lgcc_p");
5338 } else {
5339 CmdArgs.push_back("-lc");
5340 CmdArgs.push_back("-lgcc");
5341 }
5342
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005343 if (Args.hasArg(options::OPT_static)) {
5344 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005345 } else if (Args.hasArg(options::OPT_pg)) {
5346 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005347 } else {
5348 CmdArgs.push_back("--as-needed");
5349 CmdArgs.push_back("-lgcc_s");
5350 CmdArgs.push_back("--no-as-needed");
5351 }
5352 }
5353
5354 if (!Args.hasArg(options::OPT_nostdlib) &&
5355 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005356 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005357 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005358 else
5359 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005360 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005361 }
5362
Roman Divackyafe2f232012-08-28 15:09:03 +00005363 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005364
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005365 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005366 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005367 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005368}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005369
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005370void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5371 const InputInfo &Output,
5372 const InputInfoList &Inputs,
5373 const ArgList &Args,
5374 const char *LinkingOutput) const {
5375 ArgStringList CmdArgs;
5376
5377 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5378 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005379 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005380 CmdArgs.push_back("--32");
5381
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005382 // Set byte order explicitly
5383 if (getToolChain().getArchName() == "mips")
5384 CmdArgs.push_back("-EB");
5385 else if (getToolChain().getArchName() == "mipsel")
5386 CmdArgs.push_back("-EL");
5387
5388 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5389 options::OPT_Xassembler);
5390
5391 CmdArgs.push_back("-o");
5392 CmdArgs.push_back(Output.getFilename());
5393
5394 for (InputInfoList::const_iterator
5395 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5396 const InputInfo &II = *it;
5397 CmdArgs.push_back(II.getFilename());
5398 }
5399
David Chisnallddbd68f2011-09-27 22:03:18 +00005400 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005401 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5402}
5403
5404void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5405 const InputInfo &Output,
5406 const InputInfoList &Inputs,
5407 const ArgList &Args,
5408 const char *LinkingOutput) const {
5409 const Driver &D = getToolChain().getDriver();
5410 ArgStringList CmdArgs;
5411
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005412 if (!D.SysRoot.empty())
5413 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5414
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005415 if (Args.hasArg(options::OPT_static)) {
5416 CmdArgs.push_back("-Bstatic");
5417 } else {
5418 if (Args.hasArg(options::OPT_rdynamic))
5419 CmdArgs.push_back("-export-dynamic");
5420 CmdArgs.push_back("--eh-frame-hdr");
5421 if (Args.hasArg(options::OPT_shared)) {
5422 CmdArgs.push_back("-Bshareable");
5423 } else {
5424 CmdArgs.push_back("-dynamic-linker");
5425 CmdArgs.push_back("/libexec/ld.elf_so");
5426 }
5427 }
5428
5429 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5430 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005431 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005432 CmdArgs.push_back("-m");
5433 CmdArgs.push_back("elf_i386");
5434 }
5435
5436 if (Output.isFilename()) {
5437 CmdArgs.push_back("-o");
5438 CmdArgs.push_back(Output.getFilename());
5439 } else {
5440 assert(Output.isNothing() && "Invalid output.");
5441 }
5442
5443 if (!Args.hasArg(options::OPT_nostdlib) &&
5444 !Args.hasArg(options::OPT_nostartfiles)) {
5445 if (!Args.hasArg(options::OPT_shared)) {
5446 CmdArgs.push_back(Args.MakeArgString(
5447 getToolChain().GetFilePath("crt0.o")));
5448 CmdArgs.push_back(Args.MakeArgString(
5449 getToolChain().GetFilePath("crti.o")));
5450 CmdArgs.push_back(Args.MakeArgString(
5451 getToolChain().GetFilePath("crtbegin.o")));
5452 } else {
5453 CmdArgs.push_back(Args.MakeArgString(
5454 getToolChain().GetFilePath("crti.o")));
5455 CmdArgs.push_back(Args.MakeArgString(
5456 getToolChain().GetFilePath("crtbeginS.o")));
5457 }
5458 }
5459
5460 Args.AddAllArgs(CmdArgs, options::OPT_L);
5461 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5462 Args.AddAllArgs(CmdArgs, options::OPT_e);
5463 Args.AddAllArgs(CmdArgs, options::OPT_s);
5464 Args.AddAllArgs(CmdArgs, options::OPT_t);
5465 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5466 Args.AddAllArgs(CmdArgs, options::OPT_r);
5467
5468 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5469
5470 if (!Args.hasArg(options::OPT_nostdlib) &&
5471 !Args.hasArg(options::OPT_nodefaultlibs)) {
5472 if (D.CCCIsCXX) {
5473 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5474 CmdArgs.push_back("-lm");
5475 }
5476 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5477 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005478 if (Args.hasArg(options::OPT_static)) {
5479 CmdArgs.push_back("-lgcc_eh");
5480 } else {
5481 CmdArgs.push_back("--as-needed");
5482 CmdArgs.push_back("-lgcc_s");
5483 CmdArgs.push_back("--no-as-needed");
5484 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005485 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005486
5487 if (Args.hasArg(options::OPT_pthread))
5488 CmdArgs.push_back("-lpthread");
5489 CmdArgs.push_back("-lc");
5490
5491 CmdArgs.push_back("-lgcc");
5492 if (Args.hasArg(options::OPT_static)) {
5493 CmdArgs.push_back("-lgcc_eh");
5494 } else {
5495 CmdArgs.push_back("--as-needed");
5496 CmdArgs.push_back("-lgcc_s");
5497 CmdArgs.push_back("--no-as-needed");
5498 }
5499 }
5500
5501 if (!Args.hasArg(options::OPT_nostdlib) &&
5502 !Args.hasArg(options::OPT_nostartfiles)) {
5503 if (!Args.hasArg(options::OPT_shared))
5504 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5505 "crtend.o")));
5506 else
5507 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5508 "crtendS.o")));
5509 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5510 "crtn.o")));
5511 }
5512
Bill Wendling08760582011-06-27 19:15:03 +00005513 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005514
David Chisnallddbd68f2011-09-27 22:03:18 +00005515 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005516 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5517}
5518
Rafael Espindola92b00932010-08-10 00:25:48 +00005519void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5520 const InputInfo &Output,
5521 const InputInfoList &Inputs,
5522 const ArgList &Args,
5523 const char *LinkingOutput) const {
5524 ArgStringList CmdArgs;
5525
5526 // Add --32/--64 to make sure we get the format we want.
5527 // This is incomplete
5528 if (getToolChain().getArch() == llvm::Triple::x86) {
5529 CmdArgs.push_back("--32");
5530 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5531 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005532 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5533 CmdArgs.push_back("-a32");
5534 CmdArgs.push_back("-mppc");
5535 CmdArgs.push_back("-many");
5536 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5537 CmdArgs.push_back("-a64");
5538 CmdArgs.push_back("-mppc64");
5539 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005540 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005541 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005542 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5543 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005544
5545 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5546 getToolChain().getTriple());
5547 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005548
5549 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5550 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5551 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005552 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5553 getToolChain().getArch() == llvm::Triple::mipsel ||
5554 getToolChain().getArch() == llvm::Triple::mips64 ||
5555 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005556 StringRef CPUName;
5557 StringRef ABIName;
5558 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005559
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005560 CmdArgs.push_back("-march");
5561 CmdArgs.push_back(CPUName.data());
5562
5563 // Convert ABI name to the GNU tools acceptable variant.
5564 if (ABIName == "o32")
5565 ABIName = "32";
5566 else if (ABIName == "n64")
5567 ABIName = "64";
5568
5569 CmdArgs.push_back("-mabi");
5570 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005571
5572 if (getToolChain().getArch() == llvm::Triple::mips ||
5573 getToolChain().getArch() == llvm::Triple::mips64)
5574 CmdArgs.push_back("-EB");
5575 else
5576 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005577
5578 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5579 options::OPT_fpic, options::OPT_fno_pic,
5580 options::OPT_fPIE, options::OPT_fno_PIE,
5581 options::OPT_fpie, options::OPT_fno_pie);
5582 if (LastPICArg &&
5583 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5584 LastPICArg->getOption().matches(options::OPT_fpic) ||
5585 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5586 LastPICArg->getOption().matches(options::OPT_fpie))) {
5587 CmdArgs.push_back("-KPIC");
5588 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005589 }
5590
5591 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5592 options::OPT_Xassembler);
5593
5594 CmdArgs.push_back("-o");
5595 CmdArgs.push_back(Output.getFilename());
5596
5597 for (InputInfoList::const_iterator
5598 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5599 const InputInfo &II = *it;
5600 CmdArgs.push_back(II.getFilename());
5601 }
5602
5603 const char *Exec =
5604 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5605 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5606}
5607
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005608static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5609 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005610 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005611 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005612 Args.hasArg(options::OPT_static_libgcc);
5613 if (!D.CCCIsCXX)
5614 CmdArgs.push_back("-lgcc");
5615
5616 if (StaticLibgcc) {
5617 if (D.CCCIsCXX)
5618 CmdArgs.push_back("-lgcc");
5619 } else {
5620 if (!D.CCCIsCXX)
5621 CmdArgs.push_back("--as-needed");
5622 CmdArgs.push_back("-lgcc_s");
5623 if (!D.CCCIsCXX)
5624 CmdArgs.push_back("--no-as-needed");
5625 }
5626
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005627 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005628 CmdArgs.push_back("-lgcc_eh");
5629 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5630 CmdArgs.push_back("-lgcc");
5631}
5632
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005633void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5634 const InputInfo &Output,
5635 const InputInfoList &Inputs,
5636 const ArgList &Args,
5637 const char *LinkingOutput) const {
5638 const toolchains::Linux& ToolChain =
5639 static_cast<const toolchains::Linux&>(getToolChain());
5640 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005641 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005642 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005643
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005644 ArgStringList CmdArgs;
5645
Rafael Espindolad1002f62010-11-15 18:28:16 +00005646 // Silence warning for "clang -g foo.o -o foo"
5647 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005648 // and "clang -emit-llvm foo.o -o foo"
5649 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005650 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005651 // handled somewhere else.
5652 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005653
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005654 if (!D.SysRoot.empty())
5655 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005656
Rafael Espindolad47ac232010-11-17 22:26:15 +00005657 if (Args.hasArg(options::OPT_pie))
5658 CmdArgs.push_back("-pie");
5659
Rafael Espindola1c76c592010-11-07 22:57:16 +00005660 if (Args.hasArg(options::OPT_rdynamic))
5661 CmdArgs.push_back("-export-dynamic");
5662
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005663 if (Args.hasArg(options::OPT_s))
5664 CmdArgs.push_back("-s");
5665
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005666 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5667 e = ToolChain.ExtraOpts.end();
5668 i != e; ++i)
5669 CmdArgs.push_back(i->c_str());
5670
5671 if (!Args.hasArg(options::OPT_static)) {
5672 CmdArgs.push_back("--eh-frame-hdr");
5673 }
5674
5675 CmdArgs.push_back("-m");
5676 if (ToolChain.getArch() == llvm::Triple::x86)
5677 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005678 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005679 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005680 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005681 else if (ToolChain.getArch() == llvm::Triple::ppc)
5682 CmdArgs.push_back("elf32ppclinux");
5683 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5684 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005685 else if (ToolChain.getArch() == llvm::Triple::mips)
5686 CmdArgs.push_back("elf32btsmip");
5687 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5688 CmdArgs.push_back("elf32ltsmip");
5689 else if (ToolChain.getArch() == llvm::Triple::mips64)
5690 CmdArgs.push_back("elf64btsmip");
5691 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5692 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005693 else
5694 CmdArgs.push_back("elf_x86_64");
5695
5696 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005697 if (ToolChain.getArch() == llvm::Triple::arm
5698 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005699 CmdArgs.push_back("-Bstatic");
5700 else
5701 CmdArgs.push_back("-static");
5702 } else if (Args.hasArg(options::OPT_shared)) {
5703 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005704 if ((ToolChain.getArch() == llvm::Triple::arm
5705 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5706 CmdArgs.push_back("-Bsymbolic");
5707 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005708 }
5709
5710 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 (!Args.hasArg(options::OPT_static) &&
5713 !Args.hasArg(options::OPT_shared))) {
5714 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005715 if (isAndroid)
5716 CmdArgs.push_back("/system/bin/linker");
5717 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005718 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005719 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005720 ToolChain.getArch() == llvm::Triple::thumb) {
5721 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5722 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5723 else
5724 CmdArgs.push_back("/lib/ld-linux.so.3");
5725 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005726 else if (ToolChain.getArch() == llvm::Triple::mips ||
5727 ToolChain.getArch() == llvm::Triple::mipsel)
5728 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005729 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5730 ToolChain.getArch() == llvm::Triple::mips64el)
5731 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005732 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005733 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005734 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005735 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005736 else
5737 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5738 }
5739
5740 CmdArgs.push_back("-o");
5741 CmdArgs.push_back(Output.getFilename());
5742
Rafael Espindola81937ec2010-12-01 01:52:43 +00005743 if (!Args.hasArg(options::OPT_nostdlib) &&
5744 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005745 if (!isAndroid) {
5746 const char *crt1 = NULL;
5747 if (!Args.hasArg(options::OPT_shared)){
5748 if (Args.hasArg(options::OPT_pie))
5749 crt1 = "Scrt1.o";
5750 else
5751 crt1 = "crt1.o";
5752 }
5753 if (crt1)
5754 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005755
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005756 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5757 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005758
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005759 const char *crtbegin;
5760 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005761 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Rafael Espindolad47ac232010-11-17 22:26:15 +00005762 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005763 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005764 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005765 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005766 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5767 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005768
5769 Args.AddAllArgs(CmdArgs, options::OPT_L);
5770
5771 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5772
Roman Divackyee8188a2011-03-01 17:53:14 +00005773 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5774 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005775 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005776
Rafael Espindola9446d762012-04-09 23:53:34 +00005777 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5778 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5779 // forward.
5780 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5781 CmdArgs.push_back("-plugin");
5782 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5783 CmdArgs.push_back(Args.MakeArgString(Plugin));
5784 }
5785
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005786 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5787 CmdArgs.push_back("--no-demangle");
5788
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005789 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5790
Chandler Carruth94a32012012-05-14 18:31:18 +00005791 if (D.CCCIsCXX &&
5792 !Args.hasArg(options::OPT_nostdlib) &&
5793 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005794 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5795 !Args.hasArg(options::OPT_static);
5796 if (OnlyLibstdcxxStatic)
5797 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005798 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005799 if (OnlyLibstdcxxStatic)
5800 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005801 CmdArgs.push_back("-lm");
5802 }
5803
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005804 // Call this before we add the C run-time.
5805 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005806 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005807
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005808 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005809 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5810 if (Args.hasArg(options::OPT_static))
5811 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005812
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005813 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005814
Chandler Carruth94a32012012-05-14 18:31:18 +00005815 if (Args.hasArg(options::OPT_pthread) ||
5816 Args.hasArg(options::OPT_pthreads))
5817 CmdArgs.push_back("-lpthread");
5818
5819 CmdArgs.push_back("-lc");
5820
5821 if (Args.hasArg(options::OPT_static))
5822 CmdArgs.push_back("--end-group");
5823 else
5824 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5825 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005826
Rafael Espindola81937ec2010-12-01 01:52:43 +00005827 if (!Args.hasArg(options::OPT_nostartfiles)) {
5828 const char *crtend;
5829 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005830 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005831 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005832 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005833
Rafael Espindola81937ec2010-12-01 01:52:43 +00005834 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005835 if (!isAndroid)
5836 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005837 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005838 }
5839
Bill Wendling08760582011-06-27 19:15:03 +00005840 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005841
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005842 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5843}
Rafael Espindola92b00932010-08-10 00:25:48 +00005844
Chris Lattner3e2ee142010-07-07 16:01:42 +00005845void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005846 const InputInfo &Output,
5847 const InputInfoList &Inputs,
5848 const ArgList &Args,
5849 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005850 ArgStringList CmdArgs;
5851
5852 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5853 options::OPT_Xassembler);
5854
5855 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005856 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005857
5858 for (InputInfoList::const_iterator
5859 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5860 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005861 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005862 }
5863
5864 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005865 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005866 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005867}
5868
5869void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005870 const InputInfo &Output,
5871 const InputInfoList &Inputs,
5872 const ArgList &Args,
5873 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005874 const Driver &D = getToolChain().getDriver();
5875 ArgStringList CmdArgs;
5876
Daniel Dunbarb440f562010-08-02 02:38:21 +00005877 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005878 CmdArgs.push_back("-o");
5879 CmdArgs.push_back(Output.getFilename());
5880 } else {
5881 assert(Output.isNothing() && "Invalid output.");
5882 }
5883
5884 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005885 !Args.hasArg(options::OPT_nostartfiles)) {
5886 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5887 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5888 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5889 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5890 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005891
5892 Args.AddAllArgs(CmdArgs, options::OPT_L);
5893 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5894 Args.AddAllArgs(CmdArgs, options::OPT_e);
5895
Daniel Dunbar54423b22010-09-17 00:24:54 +00005896 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005897
Eli Friedman83de5132011-12-08 23:54:21 +00005898 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5899
Chris Lattner3e2ee142010-07-07 16:01:42 +00005900 if (!Args.hasArg(options::OPT_nostdlib) &&
5901 !Args.hasArg(options::OPT_nodefaultlibs)) {
5902 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005903 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005904 CmdArgs.push_back("-lm");
5905 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005906 }
5907
5908 if (!Args.hasArg(options::OPT_nostdlib) &&
5909 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005910 if (Args.hasArg(options::OPT_pthread))
5911 CmdArgs.push_back("-lpthread");
5912 CmdArgs.push_back("-lc");
5913 CmdArgs.push_back("-lCompilerRT-Generic");
5914 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5915 CmdArgs.push_back(
5916 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005917 }
5918
Eli Friedman83de5132011-12-08 23:54:21 +00005919 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005920 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005921}
5922
Daniel Dunbarcc912342009-05-02 18:28:39 +00005923/// DragonFly Tools
5924
5925// For now, DragonFly Assemble does just about the same as for
5926// FreeBSD, but this may change soon.
5927void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005928 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005929 const InputInfoList &Inputs,
5930 const ArgList &Args,
5931 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005932 ArgStringList CmdArgs;
5933
5934 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5935 // instruct as in the base system to assemble 32-bit code.
5936 if (getToolChain().getArchName() == "i386")
5937 CmdArgs.push_back("--32");
5938
5939 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5940 options::OPT_Xassembler);
5941
5942 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005943 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005944
5945 for (InputInfoList::const_iterator
5946 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5947 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005948 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005949 }
5950
5951 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005952 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005953 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005954}
5955
5956void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005957 const InputInfo &Output,
5958 const InputInfoList &Inputs,
5959 const ArgList &Args,
5960 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005961 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005962 ArgStringList CmdArgs;
5963
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005964 if (!D.SysRoot.empty())
5965 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5966
Daniel Dunbarcc912342009-05-02 18:28:39 +00005967 if (Args.hasArg(options::OPT_static)) {
5968 CmdArgs.push_back("-Bstatic");
5969 } else {
5970 if (Args.hasArg(options::OPT_shared))
5971 CmdArgs.push_back("-Bshareable");
5972 else {
5973 CmdArgs.push_back("-dynamic-linker");
5974 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5975 }
5976 }
5977
5978 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5979 // instruct ld in the base system to link 32-bit code.
5980 if (getToolChain().getArchName() == "i386") {
5981 CmdArgs.push_back("-m");
5982 CmdArgs.push_back("elf_i386");
5983 }
5984
Daniel Dunbarb440f562010-08-02 02:38:21 +00005985 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005986 CmdArgs.push_back("-o");
5987 CmdArgs.push_back(Output.getFilename());
5988 } else {
5989 assert(Output.isNothing() && "Invalid output.");
5990 }
5991
5992 if (!Args.hasArg(options::OPT_nostdlib) &&
5993 !Args.hasArg(options::OPT_nostartfiles)) {
5994 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005995 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005996 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005997 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005998 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005999 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006000 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006001 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006002 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006003 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006004 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006005 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006006 }
6007 }
6008
6009 Args.AddAllArgs(CmdArgs, options::OPT_L);
6010 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6011 Args.AddAllArgs(CmdArgs, options::OPT_e);
6012
Daniel Dunbar54423b22010-09-17 00:24:54 +00006013 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006014
6015 if (!Args.hasArg(options::OPT_nostdlib) &&
6016 !Args.hasArg(options::OPT_nodefaultlibs)) {
6017 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6018 // rpaths
6019 CmdArgs.push_back("-L/usr/lib/gcc41");
6020
6021 if (!Args.hasArg(options::OPT_static)) {
6022 CmdArgs.push_back("-rpath");
6023 CmdArgs.push_back("/usr/lib/gcc41");
6024
6025 CmdArgs.push_back("-rpath-link");
6026 CmdArgs.push_back("/usr/lib/gcc41");
6027
6028 CmdArgs.push_back("-rpath");
6029 CmdArgs.push_back("/usr/lib");
6030
6031 CmdArgs.push_back("-rpath-link");
6032 CmdArgs.push_back("/usr/lib");
6033 }
6034
Rafael Espindola38360b32010-07-20 12:59:03 +00006035 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006036 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006037 CmdArgs.push_back("-lm");
6038 }
6039
Daniel Dunbarcc912342009-05-02 18:28:39 +00006040 if (Args.hasArg(options::OPT_shared)) {
6041 CmdArgs.push_back("-lgcc_pic");
6042 } else {
6043 CmdArgs.push_back("-lgcc");
6044 }
6045
6046
6047 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006048 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006049
6050 if (!Args.hasArg(options::OPT_nolibc)) {
6051 CmdArgs.push_back("-lc");
6052 }
6053
6054 if (Args.hasArg(options::OPT_shared)) {
6055 CmdArgs.push_back("-lgcc_pic");
6056 } else {
6057 CmdArgs.push_back("-lgcc");
6058 }
6059 }
6060
6061 if (!Args.hasArg(options::OPT_nostdlib) &&
6062 !Args.hasArg(options::OPT_nostartfiles)) {
6063 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006064 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006065 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006066 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006067 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006068 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006069 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006070 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006071 }
6072
Bill Wendling08760582011-06-27 19:15:03 +00006073 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006074
Daniel Dunbarcc912342009-05-02 18:28:39 +00006075 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006076 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006077 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006078}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006079
6080void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6081 const InputInfo &Output,
6082 const InputInfoList &Inputs,
6083 const ArgList &Args,
6084 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006085 ArgStringList CmdArgs;
6086
6087 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006088 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6089 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006090 } else {
6091 assert(Output.isNothing() && "Invalid output.");
6092 }
6093
6094 if (!Args.hasArg(options::OPT_nostdlib) &&
6095 !Args.hasArg(options::OPT_nostartfiles)) {
6096 CmdArgs.push_back("-defaultlib:libcmt");
6097 }
6098
6099 CmdArgs.push_back("-nologo");
6100
Michael J. Spencere2f49362012-06-18 16:56:04 +00006101 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6102
6103 // Add filenames immediately.
6104 for (InputInfoList::const_iterator
6105 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6106 if (it->isFilename())
6107 CmdArgs.push_back(it->getFilename());
6108 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006109
6110 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006111 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006112 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6113}