blob: 4336d9ee261305952598df8a82757f8038776142 [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;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000646 case llvm::Triple::ANDROIDEABI: {
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()) {
683 case llvm::Triple::ANDROIDEABI:
684 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;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001409 if(TC.getTriple().getEnvironment() == llvm::Triple::ANDROIDEABI) {
1410 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");
2018 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
Nick Lewycky480cb992011-05-04 20:46:58 +00002019 }
2020 }
2021
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002022 // Pass options for controlling the default header search paths.
2023 if (Args.hasArg(options::OPT_nostdinc)) {
2024 CmdArgs.push_back("-nostdsysteminc");
2025 CmdArgs.push_back("-nobuiltininc");
2026 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002027 if (Args.hasArg(options::OPT_nostdlibinc))
2028 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002029 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2030 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2031 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002032
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002033 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002034 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002035 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002036
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002037 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2038
Ted Kremenekf7639e12012-03-06 20:06:33 +00002039 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002040 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002041 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002042 options::OPT_ccc_arcmt_modify,
2043 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002044 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002045 switch (A->getOption().getID()) {
2046 default:
2047 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002048 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002049 CmdArgs.push_back("-arcmt-check");
2050 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002051 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002052 CmdArgs.push_back("-arcmt-modify");
2053 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002054 case options::OPT_ccc_arcmt_migrate:
2055 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002056 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002057 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002058
2059 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2060 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002061 break;
John McCalld70fb982011-06-15 23:25:17 +00002062 }
2063 }
2064 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002065
Ted Kremenekf7639e12012-03-06 20:06:33 +00002066 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2067 if (ARCMTEnabled) {
2068 D.Diag(diag::err_drv_argument_not_allowed_with)
2069 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2070 }
2071 CmdArgs.push_back("-mt-migrate-directory");
2072 CmdArgs.push_back(A->getValue(Args));
2073
2074 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2075 options::OPT_objcmt_migrate_subscripting)) {
2076 // None specified, means enable them all.
2077 CmdArgs.push_back("-objcmt-migrate-literals");
2078 CmdArgs.push_back("-objcmt-migrate-subscripting");
2079 } else {
2080 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2081 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2082 }
2083 }
2084
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002085 // Add preprocessing options like -I, -D, etc. if we are using the
2086 // preprocessor.
2087 //
2088 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002089 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002090 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002091
Rafael Espindolaa7431922011-07-21 23:40:37 +00002092 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2093 // that "The compiler can only warn and ignore the option if not recognized".
2094 // When building with ccache, it will pass -D options to clang even on
2095 // preprocessed inputs and configure concludes that -fPIC is not supported.
2096 Args.ClaimAllArgs(options::OPT_D);
2097
Daniel Dunbar58f78332009-09-17 06:53:36 +00002098 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002099 // others.
2100 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002101 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002102 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002103 else if (A->getOption().matches(options::OPT_O) &&
2104 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002105 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002106 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002107 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002108 }
2109
Daniel Dunbar945577c2009-10-29 02:24:45 +00002110 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002111 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2112 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002113 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002114 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002115
2116 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2117 // (-ansi is equivalent to -std=c89).
2118 //
2119 // If a std is supplied, only add -trigraphs if it follows the
2120 // option.
2121 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2122 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002123 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002124 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002125 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002126 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002127 else
2128 Std->render(Args, CmdArgs);
2129
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002130 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2131 options::OPT_trigraphs))
2132 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002133 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002134 } else {
2135 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002136 //
2137 // FIXME: Clang doesn't correctly handle -std= when the input language
2138 // doesn't match. For the time being just ignore this for C++ inputs;
2139 // eventually we want to do all the standard defaulting here instead of
2140 // splitting it between the driver and clang -cc1.
2141 if (!types::isCXX(InputType))
NAKAMURA Takumie5494ff2012-07-12 03:14:56 +00002142 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2143 "-std=", /*Joined=*/true);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002144 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002145 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002146
Chandler Carruthb009b142011-04-23 06:30:43 +00002147 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2148 // '-fconst-strings'; this better indicates its actual behavior.
2149 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2150 false)) {
2151 // For perfect compatibility with GCC, we do this even in the presence of
2152 // '-w'. This flag names something other than a warning for GCC.
2153 CmdArgs.push_back("-fconst-strings");
2154 }
2155
Chandler Carruth61fbf622011-04-23 09:27:53 +00002156 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002157 // during C++ compilation, which it is by default. GCC keeps this define even
2158 // in the presence of '-w', match this behavior bug-for-bug.
2159 if (types::isCXX(InputType) &&
2160 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2161 true)) {
2162 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002163 }
2164
Chandler Carruthe0391482010-05-22 02:21:53 +00002165 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2166 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2167 if (Asm->getOption().matches(options::OPT_fasm))
2168 CmdArgs.push_back("-fgnu-keywords");
2169 else
2170 CmdArgs.push_back("-fno-gnu-keywords");
2171 }
2172
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002173 if (ShouldDisableCFI(Args, getToolChain()))
2174 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002175
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002176 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2177 CmdArgs.push_back("-fno-dwarf-directory-asm");
2178
Nick Lewyckyba743b72011-10-21 02:32:14 +00002179 if (const char *pwd = ::getenv("PWD")) {
2180 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2181 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002182 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002183 std::string CompDir = pwd;
2184 CmdArgs.push_back("-fdebug-compilation-dir");
2185 CmdArgs.push_back(Args.MakeArgString(CompDir));
2186 }
2187 }
2188
Richard Smith9a568822011-11-21 19:36:32 +00002189 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2190 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002191 CmdArgs.push_back("-ftemplate-depth");
2192 CmdArgs.push_back(A->getValue(Args));
2193 }
2194
Richard Smith9a568822011-11-21 19:36:32 +00002195 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2196 CmdArgs.push_back("-fconstexpr-depth");
2197 CmdArgs.push_back(A->getValue(Args));
2198 }
2199
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002200 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2201 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002202 if (A->getNumValues()) {
2203 StringRef bytes = A->getValue(Args);
2204 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2205 } else
2206 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002207 }
2208
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002209 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2210 options::OPT_fbounds_checking_EQ)) {
2211 if (A->getNumValues()) {
2212 StringRef val = A->getValue(Args);
2213 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2214 } else
2215 CmdArgs.push_back("-fbounds-checking=1");
2216 }
2217
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002218 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002219 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002220
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002221 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2222 CmdArgs.push_back("-fconstant-string-class");
2223 CmdArgs.push_back(A->getValue(Args));
2224 }
David Chisnall5778fce2009-08-31 16:41:57 +00002225
Chris Lattnere23003d2010-01-09 21:54:33 +00002226 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2227 CmdArgs.push_back("-ftabstop");
2228 CmdArgs.push_back(A->getValue(Args));
2229 }
2230
Chris Lattnerb35583d2010-04-07 20:49:23 +00002231 CmdArgs.push_back("-ferror-limit");
2232 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2233 CmdArgs.push_back(A->getValue(Args));
2234 else
2235 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002236
Chandler Carrutha77a7272010-05-06 04:55:18 +00002237 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2238 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002239 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002240 }
2241
2242 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2243 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002244 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002245 }
2246
Richard Smithf6f003a2011-12-16 19:06:07 +00002247 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2248 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2249 CmdArgs.push_back(A->getValue(Args));
2250 }
2251
Daniel Dunbar2c978472009-11-04 06:24:47 +00002252 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002253 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002254 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002255 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002256 } else {
2257 // If -fmessage-length=N was not specified, determine whether this is a
2258 // terminal and, if so, implicitly define -fmessage-length appropriately.
2259 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002260 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002261 }
2262
Daniel Dunbare357d562009-12-03 18:42:11 +00002263 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2264 CmdArgs.push_back("-fvisibility");
2265 CmdArgs.push_back(A->getValue(Args));
2266 }
2267
Douglas Gregor08329632010-06-15 17:05:35 +00002268 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002269
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002270 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2271
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002272 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002273 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2274 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002275 CmdArgs.push_back("-ffreestanding");
2276
Daniel Dunbare357d562009-12-03 18:42:11 +00002277 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002278 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002279 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002280 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002281 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002282 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002283 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002284 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002285 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2286 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002287
2288 // Report and error for -faltivec on anything other then PowerPC.
2289 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2290 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2291 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2292 D.Diag(diag::err_drv_argument_only_allowed_with)
2293 << A->getAsString(Args) << "ppc/ppc64";
2294
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002295 if (getToolChain().SupportsProfiling())
2296 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002297
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002298 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2299 options::OPT_fno_address_sanitizer, false))
2300 CmdArgs.push_back("-faddress-sanitizer");
2301
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002302 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2303 options::OPT_fno_thread_sanitizer, false))
2304 CmdArgs.push_back("-fthread-sanitizer");
2305
Daniel Dunbar35621a92010-03-16 16:57:46 +00002306 // -flax-vector-conversions is default.
2307 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2308 options::OPT_fno_lax_vector_conversions))
2309 CmdArgs.push_back("-fno-lax-vector-conversions");
2310
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002311 if (Args.getLastArg(options::OPT_fapple_kext))
2312 CmdArgs.push_back("-fapple-kext");
2313
David Blaikie690f21e2012-06-14 18:55:27 +00002314 if (Args.hasFlag(options::OPT_frewrite_includes,
2315 options::OPT_fno_rewrite_includes, false))
2316 CmdArgs.push_back("-frewrite-includes");
2317
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002318 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002319 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002320 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002321 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2322 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002323
2324 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2325 CmdArgs.push_back("-ftrapv-handler");
2326 CmdArgs.push_back(A->getValue(Args));
2327 }
2328
Bob Wilson14adb362012-02-03 06:27:22 +00002329 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002330
Chandler Carruth6e501032011-03-27 00:04:55 +00002331 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2332 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2333 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2334 options::OPT_fno_wrapv)) {
2335 if (A->getOption().matches(options::OPT_fwrapv))
2336 CmdArgs.push_back("-fwrapv");
2337 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2338 options::OPT_fno_strict_overflow)) {
2339 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2340 CmdArgs.push_back("-fwrapv");
2341 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002342 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002343 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002344
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002345 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2346
Daniel Dunbar4930e332009-11-17 08:07:36 +00002347 // -stack-protector=0 is default.
2348 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002349 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2350 options::OPT_fstack_protector_all,
2351 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002352 if (A->getOption().matches(options::OPT_fstack_protector))
2353 StackProtectorLevel = 1;
2354 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2355 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002356 } else {
2357 StackProtectorLevel =
2358 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2359 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002360 if (StackProtectorLevel) {
2361 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002362 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002363
2364 // --param ssp-buffer-size=
2365 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2366 ie = Args.filtered_end(); it != ie; ++it) {
2367 StringRef Str((*it)->getValue(Args));
2368 if (Str.startswith("ssp-buffer-size=")) {
2369 CmdArgs.push_back("-stack-protector-buffer-size");
2370 // FIXME: Verify the argument is a valid integer.
2371 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
2372 (*it)->claim();
2373 }
2374 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002375 }
2376
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002377 // Translate -mstackrealign
2378 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2379 false)) {
2380 CmdArgs.push_back("-backend-option");
2381 CmdArgs.push_back("-force-align-stack");
2382 }
2383 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2384 false)) {
2385 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2386 }
2387
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002388 if (Args.hasArg(options::OPT_mstack_alignment)) {
2389 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2390 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002391 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002392
Daniel Dunbard18049a2009-04-07 21:16:11 +00002393 // Forward -f options with positive and negative forms; we translate
2394 // these by hand.
2395
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002396 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002397 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002398 CmdArgs.push_back("-fapple-kext");
2399 if (!Args.hasArg(options::OPT_fbuiltin))
2400 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002401 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002402 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002403 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002404 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002405 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002406
Nuno Lopes13c88c72009-12-16 16:59:22 +00002407 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2408 options::OPT_fno_assume_sane_operator_new))
2409 CmdArgs.push_back("-fno-assume-sane-operator-new");
2410
Daniel Dunbar4930e332009-11-17 08:07:36 +00002411 // -fblocks=0 is default.
2412 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002413 getToolChain().IsBlocksDefault()) ||
2414 (Args.hasArg(options::OPT_fgnu_runtime) &&
2415 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2416 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002417 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002418
2419 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2420 !getToolChain().hasBlocksRuntime())
2421 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002422 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002423
Douglas Gregor226173a2012-01-18 15:19:58 +00002424 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2425 // users must also pass -fcxx-modules. The latter flag will disappear once the
2426 // modules implementation is solid for C++/Objective-C++ programs as well.
2427 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2428 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2429 options::OPT_fno_cxx_modules,
2430 false);
2431 if (AllowedInCXX || !types::isCXX(InputType))
2432 CmdArgs.push_back("-fmodules");
2433 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002434
John McCalldfea9982010-04-09 19:12:06 +00002435 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002436 if (Args.hasFlag(options::OPT_fno_access_control,
2437 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002438 false))
John McCall3155f572010-04-09 19:03:51 +00002439 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002440
Anders Carlssond470fef2010-11-21 00:09:52 +00002441 // -felide-constructors is the default.
2442 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2443 options::OPT_felide_constructors,
2444 false))
2445 CmdArgs.push_back("-fno-elide-constructors");
2446
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002447 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002448 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2449 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002450 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002451
Tony Linthicum76329bf2011-12-12 21:14:55 +00002452 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002453 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002454 options::OPT_fno_short_enums,
2455 getToolChain().getTriple().getArch() ==
2456 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002457 CmdArgs.push_back("-fshort-enums");
2458
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002459 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002460 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002461 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002462 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002463
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002464 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002465 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002466 options::OPT_fno_threadsafe_statics))
2467 CmdArgs.push_back("-fno-threadsafe-statics");
2468
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002469 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002470 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2471 options::OPT_fno_use_cxa_atexit,
2472 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002473 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002474 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2475 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002476 CmdArgs.push_back("-fno-use-cxa-atexit");
2477
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002478 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002479 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002480 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2481 CmdArgs.push_back("-fms-extensions");
2482
Chad Rosiered943242012-07-20 21:20:33 +00002483 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002484 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2485 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002486
Francois Pichet1b4f1632011-09-17 04:32:15 +00002487 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002488 if (Args.hasFlag(options::OPT_fms_compatibility,
2489 options::OPT_fno_ms_compatibility,
2490 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2491 Args.hasFlag(options::OPT_fms_extensions,
2492 options::OPT_fno_ms_extensions,
2493 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002494 CmdArgs.push_back("-fms-compatibility");
2495
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002496 // -fmsc-version=1300 is default.
2497 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2498 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2499 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002500 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002501 if (msc_ver.empty())
2502 CmdArgs.push_back("-fmsc-version=1300");
2503 else
2504 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2505 }
2506
2507
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002508 // -fborland-extensions=0 is default.
2509 if (Args.hasFlag(options::OPT_fborland_extensions,
2510 options::OPT_fno_borland_extensions, false))
2511 CmdArgs.push_back("-fborland-extensions");
2512
Francois Pichet02744872011-09-01 16:38:08 +00002513 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2514 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002515 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2516 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002517 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002518 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002519
Chandler Carruthe03aa552010-04-17 20:17:31 +00002520 // -fgnu-keywords default varies depending on language; only pass if
2521 // specified.
2522 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002523 options::OPT_fno_gnu_keywords))
2524 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002525
Rafael Espindola922a6242011-06-02 17:30:53 +00002526 if (Args.hasFlag(options::OPT_fgnu89_inline,
2527 options::OPT_fno_gnu89_inline,
2528 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002529 CmdArgs.push_back("-fgnu89-inline");
2530
Chad Rosier9c76d242012-03-15 22:31:42 +00002531 if (Args.hasArg(options::OPT_fno_inline))
2532 CmdArgs.push_back("-fno-inline");
2533
Chad Rosier64d6be92012-03-06 21:17:19 +00002534 if (Args.hasArg(options::OPT_fno_inline_functions))
2535 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002536
John McCall5fb5df92012-06-20 06:18:46 +00002537 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002538
John McCall5fb5df92012-06-20 06:18:46 +00002539 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2540 // legacy is the default.
2541 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002542 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2543 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002544 objcRuntime.isLegacyDispatchDefaultForArch(
2545 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002546 if (getToolChain().UseObjCMixedDispatch())
2547 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2548 else
2549 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2550 }
2551 }
2552
Nico Weber97bd94b2012-03-09 21:19:44 +00002553 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2554 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002555 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002556 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2557 }
2558
John McCall24fc0de2011-07-06 00:26:06 +00002559 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2560 // NOTE: This logic is duplicated in ToolChains.cpp.
2561 bool ARC = isObjCAutoRefCount(Args);
2562 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002563 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002564
John McCall24fc0de2011-07-06 00:26:06 +00002565 CmdArgs.push_back("-fobjc-arc");
2566
Chandler Carruth491db322011-11-04 07:34:47 +00002567 // FIXME: It seems like this entire block, and several around it should be
2568 // wrapped in isObjC, but for now we just use it here as this is where it
2569 // was being used previously.
2570 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2571 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2572 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2573 else
2574 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2575 }
2576
John McCall24fc0de2011-07-06 00:26:06 +00002577 // Allow the user to enable full exceptions code emission.
2578 // We define off for Objective-CC, on for Objective-C++.
2579 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2580 options::OPT_fno_objc_arc_exceptions,
2581 /*default*/ types::isCXX(InputType)))
2582 CmdArgs.push_back("-fobjc-arc-exceptions");
2583 }
2584
2585 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2586 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002587 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002588 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002589
John McCall24fc0de2011-07-06 00:26:06 +00002590 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2591 // takes precedence.
2592 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2593 if (!GCArg)
2594 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2595 if (GCArg) {
2596 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002597 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002598 << GCArg->getAsString(Args);
2599 } else if (getToolChain().SupportsObjCGC()) {
2600 GCArg->render(Args, CmdArgs);
2601 } else {
2602 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002603 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002604 << GCArg->getAsString(Args);
2605 }
2606 }
2607
John McCallb5f652e2011-06-22 00:53:57 +00002608 // Add exception args.
2609 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002610 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002611
2612 if (getToolChain().UseSjLjExceptions())
2613 CmdArgs.push_back("-fsjlj-exceptions");
2614
2615 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002616 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2617 options::OPT_fno_assume_sane_operator_new))
2618 CmdArgs.push_back("-fno-assume-sane-operator-new");
2619
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002620 // -fconstant-cfstrings is default, and may be subject to argument translation
2621 // on Darwin.
2622 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2623 options::OPT_fno_constant_cfstrings) ||
2624 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2625 options::OPT_mno_constant_cfstrings))
2626 CmdArgs.push_back("-fno-constant-cfstrings");
2627
John Thompsoned4e2952009-11-05 20:14:16 +00002628 // -fshort-wchar default varies depending on platform; only
2629 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002630 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2631 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002632
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002633 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2634 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002635 //
2636 // FIXME: This is gross; that translation should be pulled from the
2637 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002638 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002639 options::OPT_fno_pascal_strings,
2640 false) ||
2641 Args.hasFlag(options::OPT_mpascal_strings,
2642 options::OPT_mno_pascal_strings,
2643 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002644 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002645
Daniel Dunbar096ed292011-10-05 21:04:55 +00002646 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2647 // -fno-pack-struct doesn't apply to -fpack-struct=.
2648 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002649 std::string PackStructStr = "-fpack-struct=";
2650 PackStructStr += A->getValue(Args);
2651 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002652 } else if (Args.hasFlag(options::OPT_fpack_struct,
2653 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002654 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002655 }
2656
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002657 if (Args.hasArg(options::OPT_mkernel) ||
2658 Args.hasArg(options::OPT_fapple_kext)) {
2659 if (!Args.hasArg(options::OPT_fcommon))
2660 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002661 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002662 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002663
Daniel Dunbard18049a2009-04-07 21:16:11 +00002664 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002665 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002666 CmdArgs.push_back("-fno-common");
2667
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002668 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002669 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002670 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002671 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002672 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002673 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2674
Daniel Dunbar6358d682010-10-15 22:30:42 +00002675 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2676 if (!Args.hasFlag(options::OPT_ffor_scope,
2677 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002678 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002679 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2680
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002681 // -fcaret-diagnostics is default.
2682 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2683 options::OPT_fno_caret_diagnostics, true))
2684 CmdArgs.push_back("-fno-caret-diagnostics");
2685
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002686 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002687 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002688 options::OPT_fno_diagnostics_fixit_info))
2689 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002690
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002691 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002692 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002693 options::OPT_fno_diagnostics_show_option))
2694 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002695
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002696 if (const Arg *A =
2697 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2698 CmdArgs.push_back("-fdiagnostics-show-category");
2699 CmdArgs.push_back(A->getValue(Args));
2700 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002701
Douglas Gregor643c9222011-05-21 17:07:29 +00002702 if (const Arg *A =
2703 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2704 CmdArgs.push_back("-fdiagnostics-format");
2705 CmdArgs.push_back(A->getValue(Args));
2706 }
2707
Chandler Carruthb6766f02011-03-27 01:50:55 +00002708 if (Arg *A = Args.getLastArg(
2709 options::OPT_fdiagnostics_show_note_include_stack,
2710 options::OPT_fno_diagnostics_show_note_include_stack)) {
2711 if (A->getOption().matches(
2712 options::OPT_fdiagnostics_show_note_include_stack))
2713 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2714 else
2715 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2716 }
2717
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002718 // Color diagnostics are the default, unless the terminal doesn't support
2719 // them.
2720 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002721 options::OPT_fno_color_diagnostics,
2722 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002723 CmdArgs.push_back("-fcolor-diagnostics");
2724
Daniel Dunbardb097022009-06-08 21:13:54 +00002725 if (!Args.hasFlag(options::OPT_fshow_source_location,
2726 options::OPT_fno_show_source_location))
2727 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002728
Douglas Gregor643c9222011-05-21 17:07:29 +00002729 if (!Args.hasFlag(options::OPT_fshow_column,
2730 options::OPT_fno_show_column,
2731 true))
2732 CmdArgs.push_back("-fno-show-column");
2733
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002734 if (!Args.hasFlag(options::OPT_fspell_checking,
2735 options::OPT_fno_spell_checking))
2736 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002737
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002738
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002739 // Silently ignore -fasm-blocks for now.
2740 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2741 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002742
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002743 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2744 A->render(Args, CmdArgs);
2745
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002746 // -fdollars-in-identifiers default varies depending on platform and
2747 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002748 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002749 options::OPT_fno_dollars_in_identifiers)) {
2750 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002751 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002752 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002753 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002754 }
2755
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002756 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2757 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002758 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002759 options::OPT_fno_unit_at_a_time)) {
2760 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002761 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002762 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002763
Eli Friedman055c9702011-11-02 01:53:16 +00002764 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2765 options::OPT_fno_apple_pragma_pack, false))
2766 CmdArgs.push_back("-fapple-pragma-pack");
2767
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002768 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002769 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002770 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002771#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002772 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002773 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2774 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2775 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2776 CmdArgs.push_back("-fno-builtin-strcat");
2777 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2778 CmdArgs.push_back("-fno-builtin-strcpy");
2779 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002780#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002781
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002782 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002783 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002784 options::OPT_traditional_cpp)) {
2785 if (isa<PreprocessJobAction>(JA))
2786 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002787 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002788 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002789 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002790
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002791 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002792 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002793
2794 // Handle serialized diagnostics.
2795 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2796 CmdArgs.push_back("-serialize-diagnostic-file");
2797 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2798 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002799
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002800 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2801 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002802 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002803 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2804 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002805 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002806
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002807 // We translate this by hand to the -cc1 argument, since nightly test uses
2808 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002809 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002810 CmdArgs.push_back("-disable-llvm-optzns");
2811 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002812 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002813 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002814
Daniel Dunbard67a3222009-03-30 06:36:42 +00002815 if (Output.getType() == types::TY_Dependencies) {
2816 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002817 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002818 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002819 CmdArgs.push_back(Output.getFilename());
2820 } else {
2821 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002822 }
2823
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002824 for (InputInfoList::const_iterator
2825 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2826 const InputInfo &II = *it;
2827 CmdArgs.push_back("-x");
2828 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002829 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002830 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002831 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002832 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002833 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002834
Chris Lattnere9d7d782009-11-03 19:50:27 +00002835 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2836
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002837 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002838
2839 // Optionally embed the -cc1 level arguments into the debug info, for build
2840 // analysis.
2841 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002842 ArgStringList OriginalArgs;
2843 for (ArgList::const_iterator it = Args.begin(),
2844 ie = Args.end(); it != ie; ++it)
2845 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002846
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002847 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002848 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002849 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002850 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002851 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002852 }
2853 CmdArgs.push_back("-dwarf-debug-flags");
2854 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2855 }
2856
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002857 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002858
Roman Divacky178e01602011-02-10 16:52:03 +00002859 if (Arg *A = Args.getLastArg(options::OPT_pg))
2860 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002861 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002862 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002863
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002864 // Claim some arguments which clang supports automatically.
2865
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002866 // -fpch-preprocess is used with gcc to add a special marker in the output to
2867 // include the PCH file. Clang's PTH solution is completely transparent, so we
2868 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002869 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002870
Daniel Dunbar17731772009-03-23 19:03:36 +00002871 // Claim some arguments which clang doesn't support, but we don't
2872 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002873 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2874 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002875
Rafael Espindolad95a8122011-03-01 05:25:27 +00002876 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002877 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002878 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002879}
2880
Jim Grosbach576452b2012-02-10 20:37:10 +00002881void ClangAs::AddARMTargetArgs(const ArgList &Args,
2882 ArgStringList &CmdArgs) const {
2883 const Driver &D = getToolChain().getDriver();
2884 llvm::Triple Triple = getToolChain().getTriple();
2885
2886 // Set the CPU based on -march= and -mcpu=.
2887 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002888 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002889
2890 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002891 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002892 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002893
2894 // Honor -mfpmath=.
2895 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002896 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002897}
2898
John McCall5fb5df92012-06-20 06:18:46 +00002899/// Add options related to the Objective-C runtime/ABI.
2900///
2901/// Returns true if the runtime is non-fragile.
2902ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2903 ArgStringList &cmdArgs,
2904 RewriteKind rewriteKind) const {
2905 // Look for the controlling runtime option.
2906 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2907 options::OPT_fgnu_runtime,
2908 options::OPT_fobjc_runtime_EQ);
2909
2910 // Just forward -fobjc-runtime= to the frontend. This supercedes
2911 // options about fragility.
2912 if (runtimeArg &&
2913 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2914 ObjCRuntime runtime;
2915 StringRef value = runtimeArg->getValue(args);
2916 if (runtime.tryParse(value)) {
2917 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2918 << value;
2919 }
2920
2921 runtimeArg->render(args, cmdArgs);
2922 return runtime;
2923 }
2924
2925 // Otherwise, we'll need the ABI "version". Version numbers are
2926 // slightly confusing for historical reasons:
2927 // 1 - Traditional "fragile" ABI
2928 // 2 - Non-fragile ABI, version 1
2929 // 3 - Non-fragile ABI, version 2
2930 unsigned objcABIVersion = 1;
2931 // If -fobjc-abi-version= is present, use that to set the version.
2932 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2933 StringRef value = abiArg->getValue(args);
2934 if (value == "1")
2935 objcABIVersion = 1;
2936 else if (value == "2")
2937 objcABIVersion = 2;
2938 else if (value == "3")
2939 objcABIVersion = 3;
2940 else
2941 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2942 << value;
2943 } else {
2944 // Otherwise, determine if we are using the non-fragile ABI.
2945 bool nonFragileABIIsDefault =
2946 (rewriteKind == RK_NonFragile ||
2947 (rewriteKind == RK_None &&
2948 getToolChain().IsObjCNonFragileABIDefault()));
2949 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2950 options::OPT_fno_objc_nonfragile_abi,
2951 nonFragileABIIsDefault)) {
2952 // Determine the non-fragile ABI version to use.
2953#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2954 unsigned nonFragileABIVersion = 1;
2955#else
2956 unsigned nonFragileABIVersion = 2;
2957#endif
2958
2959 if (Arg *abiArg = args.getLastArg(
2960 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2961 StringRef value = abiArg->getValue(args);
2962 if (value == "1")
2963 nonFragileABIVersion = 1;
2964 else if (value == "2")
2965 nonFragileABIVersion = 2;
2966 else
2967 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2968 << value;
2969 }
2970
2971 objcABIVersion = 1 + nonFragileABIVersion;
2972 } else {
2973 objcABIVersion = 1;
2974 }
2975 }
2976
2977 // We don't actually care about the ABI version other than whether
2978 // it's non-fragile.
2979 bool isNonFragile = objcABIVersion != 1;
2980
2981 // If we have no runtime argument, ask the toolchain for its default runtime.
2982 // However, the rewriter only really supports the Mac runtime, so assume that.
2983 ObjCRuntime runtime;
2984 if (!runtimeArg) {
2985 switch (rewriteKind) {
2986 case RK_None:
2987 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2988 break;
2989 case RK_Fragile:
2990 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2991 break;
2992 case RK_NonFragile:
2993 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2994 break;
2995 }
2996
2997 // -fnext-runtime
2998 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2999 // On Darwin, make this use the default behavior for the toolchain.
3000 if (getToolChain().getTriple().isOSDarwin()) {
3001 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
3002
3003 // Otherwise, build for a generic macosx port.
3004 } else {
3005 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
3006 }
3007
3008 // -fgnu-runtime
3009 } else {
3010 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00003011 // Legacy behaviour is to target the gnustep runtime if we are i
3012 // non-fragile mode or the GCC runtime in fragile mode.
3013 if (isNonFragile)
3014 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3015 else
3016 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003017 }
3018
3019 cmdArgs.push_back(args.MakeArgString(
3020 "-fobjc-runtime=" + runtime.getAsString()));
3021 return runtime;
3022}
3023
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003024void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003025 const InputInfo &Output,
3026 const InputInfoList &Inputs,
3027 const ArgList &Args,
3028 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003029 ArgStringList CmdArgs;
3030
3031 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3032 const InputInfo &Input = Inputs[0];
3033
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003034 // Don't warn about "clang -w -c foo.s"
3035 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003036 // and "clang -emit-llvm -c foo.s"
3037 Args.ClaimAllArgs(options::OPT_emit_llvm);
3038 // and "clang -use-gold-plugin -c foo.s"
3039 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003040
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003041 // Invoke ourselves in -cc1as mode.
3042 //
3043 // FIXME: Implement custom jobs for internal actions.
3044 CmdArgs.push_back("-cc1as");
3045
3046 // Add the "effective" target triple.
3047 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003048 std::string TripleStr =
3049 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003050 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3051
3052 // Set the output mode, we currently only expect to be used as a real
3053 // assembler.
3054 CmdArgs.push_back("-filetype");
3055 CmdArgs.push_back("obj");
3056
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003057 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003058 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003059
Jim Grosbach576452b2012-02-10 20:37:10 +00003060 // Add target specific cpu and features flags.
3061 switch(getToolChain().getTriple().getArch()) {
3062 default:
3063 break;
3064
3065 case llvm::Triple::arm:
3066 case llvm::Triple::thumb:
3067 AddARMTargetArgs(Args, CmdArgs);
3068 break;
3069 }
3070
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003071 // Ignore explicit -force_cpusubtype_ALL option.
3072 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003073
Eric Christopherfc3ee562012-01-10 00:38:01 +00003074 // Determine the original source input.
3075 const Action *SourceAction = &JA;
3076 while (SourceAction->getKind() != Action::InputClass) {
3077 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3078 SourceAction = SourceAction->getInputs()[0];
3079 }
3080
3081 // Forward -g, assuming we are dealing with an actual assembly file.
3082 if (SourceAction->getType() == types::TY_Asm ||
3083 SourceAction->getType() == types::TY_PP_Asm) {
3084 Args.ClaimAllArgs(options::OPT_g_Group);
3085 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3086 if (!A->getOption().matches(options::OPT_g0))
3087 CmdArgs.push_back("-g");
3088 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003089
3090 // Optionally embed the -cc1as level arguments into the debug info, for build
3091 // analysis.
3092 if (getToolChain().UseDwarfDebugFlags()) {
3093 ArgStringList OriginalArgs;
3094 for (ArgList::const_iterator it = Args.begin(),
3095 ie = Args.end(); it != ie; ++it)
3096 (*it)->render(Args, OriginalArgs);
3097
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003098 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003099 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3100 Flags += Exec;
3101 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3102 Flags += " ";
3103 Flags += OriginalArgs[i];
3104 }
3105 CmdArgs.push_back("-dwarf-debug-flags");
3106 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3107 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003108
3109 // FIXME: Add -static support, once we have it.
3110
3111 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3112 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003113 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003114
3115 assert(Output.isFilename() && "Unexpected lipo output.");
3116 CmdArgs.push_back("-o");
3117 CmdArgs.push_back(Output.getFilename());
3118
Daniel Dunbarb440f562010-08-02 02:38:21 +00003119 assert(Input.isFilename() && "Invalid input.");
3120 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003121
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003122 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003123 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003124}
3125
Daniel Dunbara3246a02009-03-18 08:07:30 +00003126void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003127 const InputInfo &Output,
3128 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003129 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003130 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003131 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003132 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003133
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003134 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003135 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003136 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003137 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003138 // Don't forward any -g arguments to assembly steps.
3139 if (isa<AssembleJobAction>(JA) &&
3140 A->getOption().matches(options::OPT_g_Group))
3141 continue;
3142
Daniel Dunbar2da02722009-03-19 07:55:12 +00003143 // It is unfortunate that we have to claim here, as this means
3144 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003145 // platforms using a generic gcc, even if we are just using gcc
3146 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003147 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003148 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003149 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003150 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003151
Daniel Dunbar4e295052010-01-25 22:35:08 +00003152 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003153
3154 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003155 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003156 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003157 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003158
3159 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003160 if (Arch == "powerpc")
3161 CmdArgs.push_back("ppc");
3162 else if (Arch == "powerpc64")
3163 CmdArgs.push_back("ppc64");
3164 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003165 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003166 }
3167
Daniel Dunbar5716d872009-05-02 21:41:52 +00003168 // Try to force gcc to match the tool chain we want, if we recognize
3169 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003170 //
3171 // FIXME: The triple class should directly provide the information we want
3172 // here.
3173 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003174 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003175 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003176 CmdArgs.push_back("-m64");
3177
Daniel Dunbarb440f562010-08-02 02:38:21 +00003178 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003179 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003180 CmdArgs.push_back(Output.getFilename());
3181 } else {
3182 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003183 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003184 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003185
Tony Linthicum76329bf2011-12-12 21:14:55 +00003186 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3187 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003188
3189 // Only pass -x if gcc will understand it; otherwise hope gcc
3190 // understands the suffix correctly. The main use case this would go
3191 // wrong in is for linker inputs if they happened to have an odd
3192 // suffix; really the only way to get this to happen is a command
3193 // like '-x foobar a.c' which will treat a.c like a linker input.
3194 //
3195 // FIXME: For the linker case specifically, can we safely convert
3196 // inputs into '-Wl,' options?
3197 for (InputInfoList::const_iterator
3198 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3199 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003200
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003201 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003202 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3203 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003204 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003205 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003206 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003207 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003208 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003209
Daniel Dunbara3246a02009-03-18 08:07:30 +00003210 if (types::canTypeBeUserSpecified(II.getType())) {
3211 CmdArgs.push_back("-x");
3212 CmdArgs.push_back(types::getTypeName(II.getType()));
3213 }
3214
Daniel Dunbarb440f562010-08-02 02:38:21 +00003215 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003216 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003217 else {
3218 const Arg &A = II.getInputArg();
3219
3220 // Reverse translate some rewritten options.
3221 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3222 CmdArgs.push_back("-lstdc++");
3223 continue;
3224 }
3225
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003226 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003227 A.render(Args, CmdArgs);
3228 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003229 }
3230
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003231 const std::string customGCCName = D.getCCCGenericGCCName();
3232 const char *GCCName;
3233 if (!customGCCName.empty())
3234 GCCName = customGCCName.c_str();
3235 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003236 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003237 } else
3238 GCCName = "gcc";
3239
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003240 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003241 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003242 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003243}
3244
Daniel Dunbar4e295052010-01-25 22:35:08 +00003245void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3246 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003247 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003248}
3249
Daniel Dunbar4e295052010-01-25 22:35:08 +00003250void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3251 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003252 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003253}
3254
Daniel Dunbar4e295052010-01-25 22:35:08 +00003255void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3256 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003257 const Driver &D = getToolChain().getDriver();
3258
Daniel Dunbar4e295052010-01-25 22:35:08 +00003259 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003260 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3261 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003262 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003263 else {
3264 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003265 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003266 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003267
Daniel Dunbar4e295052010-01-25 22:35:08 +00003268 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003269 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003270}
3271
Daniel Dunbar4e295052010-01-25 22:35:08 +00003272void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3273 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003274 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003275}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003276
Daniel Dunbar4e295052010-01-25 22:35:08 +00003277void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3278 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003279 // The types are (hopefully) good enough.
3280}
3281
Tony Linthicum76329bf2011-12-12 21:14:55 +00003282// Hexagon tools start.
3283void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3284 ArgStringList &CmdArgs) const {
3285
3286}
3287void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3288 const InputInfo &Output,
3289 const InputInfoList &Inputs,
3290 const ArgList &Args,
3291 const char *LinkingOutput) const {
3292
3293 const Driver &D = getToolChain().getDriver();
3294 ArgStringList CmdArgs;
3295
3296 std::string MarchString = "-march=";
3297 MarchString += getHexagonTargetCPU(Args);
3298 CmdArgs.push_back(Args.MakeArgString(MarchString));
3299
3300 RenderExtraToolArgs(JA, CmdArgs);
3301
3302 if (Output.isFilename()) {
3303 CmdArgs.push_back("-o");
3304 CmdArgs.push_back(Output.getFilename());
3305 } else {
3306 assert(Output.isNothing() && "Unexpected output");
3307 CmdArgs.push_back("-fsyntax-only");
3308 }
3309
3310
3311 // Only pass -x if gcc will understand it; otherwise hope gcc
3312 // understands the suffix correctly. The main use case this would go
3313 // wrong in is for linker inputs if they happened to have an odd
3314 // suffix; really the only way to get this to happen is a command
3315 // like '-x foobar a.c' which will treat a.c like a linker input.
3316 //
3317 // FIXME: For the linker case specifically, can we safely convert
3318 // inputs into '-Wl,' options?
3319 for (InputInfoList::const_iterator
3320 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3321 const InputInfo &II = *it;
3322
3323 // Don't try to pass LLVM or AST inputs to a generic gcc.
3324 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3325 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3326 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3327 << getToolChain().getTripleString();
3328 else if (II.getType() == types::TY_AST)
3329 D.Diag(clang::diag::err_drv_no_ast_support)
3330 << getToolChain().getTripleString();
3331
3332 if (II.isFilename())
3333 CmdArgs.push_back(II.getFilename());
3334 else
3335 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3336 II.getInputArg().render(Args, CmdArgs);
3337 }
3338
3339 const char *GCCName = "hexagon-as";
3340 const char *Exec =
3341 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3342 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3343
3344}
3345void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3346 ArgStringList &CmdArgs) const {
3347 // The types are (hopefully) good enough.
3348}
3349
3350void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3351 const InputInfo &Output,
3352 const InputInfoList &Inputs,
3353 const ArgList &Args,
3354 const char *LinkingOutput) const {
3355
3356 const Driver &D = getToolChain().getDriver();
3357 ArgStringList CmdArgs;
3358
3359 for (ArgList::const_iterator
3360 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3361 Arg *A = *it;
3362 if (A->getOption().hasForwardToGCC()) {
3363 // Don't forward any -g arguments to assembly steps.
3364 if (isa<AssembleJobAction>(JA) &&
3365 A->getOption().matches(options::OPT_g_Group))
3366 continue;
3367
3368 // It is unfortunate that we have to claim here, as this means
3369 // we will basically never report anything interesting for
3370 // platforms using a generic gcc, even if we are just using gcc
3371 // to get to the assembler.
3372 A->claim();
3373 A->render(Args, CmdArgs);
3374 }
3375 }
3376
3377 RenderExtraToolArgs(JA, CmdArgs);
3378
3379 // Add Arch Information
3380 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003381 if ((A = getLastHexagonArchArg(Args))) {
3382 if (A->getOption().matches(options::OPT_m_Joined))
3383 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003384 else
Sebastian Pop86500282012-01-13 20:37:10 +00003385 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003386 }
Sebastian Pop86500282012-01-13 20:37:10 +00003387 else {
3388 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3389 }
3390
Tony Linthicum76329bf2011-12-12 21:14:55 +00003391 CmdArgs.push_back("-mqdsp6-compat");
3392
3393 const char *GCCName;
3394 if (C.getDriver().CCCIsCXX)
3395 GCCName = "hexagon-g++";
3396 else
3397 GCCName = "hexagon-gcc";
3398 const char *Exec =
3399 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3400
3401 if (Output.isFilename()) {
3402 CmdArgs.push_back("-o");
3403 CmdArgs.push_back(Output.getFilename());
3404 }
3405
3406 for (InputInfoList::const_iterator
3407 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3408 const InputInfo &II = *it;
3409
3410 // Don't try to pass LLVM or AST inputs to a generic gcc.
3411 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3412 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3413 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3414 << getToolChain().getTripleString();
3415 else if (II.getType() == types::TY_AST)
3416 D.Diag(clang::diag::err_drv_no_ast_support)
3417 << getToolChain().getTripleString();
3418
3419 if (II.isFilename())
3420 CmdArgs.push_back(II.getFilename());
3421 else
3422 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3423 II.getInputArg().render(Args, CmdArgs);
3424 }
3425 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3426
3427}
3428// Hexagon tools end.
3429
3430
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003431const char *darwin::CC1::getCC1Name(types::ID Type) const {
3432 switch (Type) {
3433 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003434 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003435 case types::TY_Asm:
3436 case types::TY_C: case types::TY_CHeader:
3437 case types::TY_PP_C: case types::TY_PP_CHeader:
3438 return "cc1";
3439 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003440 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3441 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003442 return "cc1obj";
3443 case types::TY_CXX: case types::TY_CXXHeader:
3444 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3445 return "cc1plus";
3446 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003447 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3448 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003449 return "cc1objplus";
3450 }
3451}
3452
David Blaikie68e081d2011-12-20 02:48:34 +00003453void darwin::CC1::anchor() {}
3454
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003455const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003456 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003457 return Args.MakeArgString(
3458 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003459}
3460
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003461const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003462 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003463 const char *Str = getBaseInputName(Args, Inputs);
3464
Chris Lattner906bb902011-01-16 08:14:11 +00003465 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003466 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003467
3468 return Str;
3469}
3470
3471const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003472darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003473 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003474 // FIXME: Think about this more.
3475 std::string Res;
3476
3477 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3478 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003479 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003480 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003481 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003482 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003483 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003484}
3485
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003486void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003487 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003488 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003489
3490 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003491 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003492
Bob Wilson7ecbd322012-02-07 01:17:55 +00003493 // Erase both -fmodule-cache-path and its argument.
3494 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3495 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003496 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003497 continue;
3498 }
3499
Bob Wilson7ecbd322012-02-07 01:17:55 +00003500 // Remove unsupported -f options.
3501 if (Option.startswith("-f")) {
3502 // Remove -f/-fno- to reduce the number of cases.
3503 if (Option.startswith("-fno-"))
3504 Option = Option.substr(5);
3505 else
3506 Option = Option.substr(2);
3507 RemoveOption = llvm::StringSwitch<bool>(Option)
3508 .Case("altivec", true)
3509 .Case("modules", true)
3510 .Case("diagnostics-show-note-include-stack", true)
3511 .Default(false);
3512 }
3513
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003514 // Handle machine specific options.
3515 if (Option.startswith("-m")) {
3516 RemoveOption = llvm::StringSwitch<bool>(Option)
3517 .Case("-mthumb", true)
3518 .Case("-mno-thumb", true)
3519 .Case("-mno-fused-madd", true)
3520 .Case("-mlong-branch", true)
3521 .Case("-mlongcall", true)
3522 .Case("-mcpu=G4", true)
3523 .Case("-mcpu=G5", true)
3524 .Default(false);
3525 }
3526
3527 // Handle warning options.
3528 if (Option.startswith("-W")) {
3529 // Remove -W/-Wno- to reduce the number of cases.
3530 if (Option.startswith("-Wno-"))
3531 Option = Option.substr(5);
3532 else
3533 Option = Option.substr(2);
3534
3535 RemoveOption = llvm::StringSwitch<bool>(Option)
3536 .Case("address-of-temporary", true)
3537 .Case("ambiguous-member-template", true)
3538 .Case("analyzer-incompatible-plugin", true)
3539 .Case("array-bounds", true)
3540 .Case("array-bounds-pointer-arithmetic", true)
3541 .Case("bind-to-temporary-copy", true)
3542 .Case("bitwise-op-parentheses", true)
3543 .Case("bool-conversions", true)
3544 .Case("builtin-macro-redefined", true)
3545 .Case("c++-hex-floats", true)
3546 .Case("c++0x-compat", true)
3547 .Case("c++0x-extensions", true)
3548 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003549 .Case("c++11-compat", true)
3550 .Case("c++11-extensions", true)
3551 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003552 .Case("conditional-uninitialized", true)
3553 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003554 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003555 .Case("CFString-literal", true)
3556 .Case("constant-logical-operand", true)
3557 .Case("custom-atomic-properties", true)
3558 .Case("default-arg-special-member", true)
3559 .Case("delegating-ctor-cycles", true)
3560 .Case("delete-non-virtual-dtor", true)
3561 .Case("deprecated-implementations", true)
3562 .Case("deprecated-writable-strings", true)
3563 .Case("distributed-object-modifiers", true)
3564 .Case("duplicate-method-arg", true)
3565 .Case("dynamic-class-memaccess", true)
3566 .Case("enum-compare", true)
3567 .Case("exit-time-destructors", true)
3568 .Case("gnu", true)
3569 .Case("gnu-designator", true)
3570 .Case("header-hygiene", true)
3571 .Case("idiomatic-parentheses", true)
3572 .Case("ignored-qualifiers", true)
3573 .Case("implicit-atomic-properties", true)
3574 .Case("incompatible-pointer-types", true)
3575 .Case("incomplete-implementation", true)
3576 .Case("initializer-overrides", true)
3577 .Case("invalid-noreturn", true)
3578 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003579 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003580 .Case("literal-conversion", true)
3581 .Case("literal-range", true)
3582 .Case("local-type-template-args", true)
3583 .Case("logical-op-parentheses", true)
3584 .Case("method-signatures", true)
3585 .Case("microsoft", true)
3586 .Case("mismatched-tags", true)
3587 .Case("missing-method-return-type", true)
3588 .Case("non-pod-varargs", true)
3589 .Case("nonfragile-abi2", true)
3590 .Case("null-arithmetic", true)
3591 .Case("null-dereference", true)
3592 .Case("out-of-line-declaration", true)
3593 .Case("overriding-method-mismatch", true)
3594 .Case("readonly-setter-attrs", true)
3595 .Case("return-stack-address", true)
3596 .Case("self-assign", true)
3597 .Case("semicolon-before-method-body", true)
3598 .Case("sentinel", true)
3599 .Case("shift-overflow", true)
3600 .Case("shift-sign-overflow", true)
3601 .Case("sign-conversion", true)
3602 .Case("sizeof-array-argument", true)
3603 .Case("sizeof-pointer-memaccess", true)
3604 .Case("string-compare", true)
3605 .Case("super-class-method-mismatch", true)
3606 .Case("tautological-compare", true)
3607 .Case("typedef-redefinition", true)
3608 .Case("typename-missing", true)
3609 .Case("undefined-reinterpret-cast", true)
3610 .Case("unknown-warning-option", true)
3611 .Case("unnamed-type-template-args", true)
3612 .Case("unneeded-internal-declaration", true)
3613 .Case("unneeded-member-function", true)
3614 .Case("unused-comparison", true)
3615 .Case("unused-exception-parameter", true)
3616 .Case("unused-member-function", true)
3617 .Case("unused-result", true)
3618 .Case("vector-conversions", true)
3619 .Case("vla", true)
3620 .Case("used-but-marked-unused", true)
3621 .Case("weak-vtables", true)
3622 .Default(false);
3623 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003624 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003625 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003626 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003627 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003628 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003629 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003630 }
3631}
3632
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003633void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003634 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003635 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003636
3637 CheckCodeGenerationOptions(D, Args);
3638
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003639 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003640 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3641 !Args.hasArg(options::OPT_mdynamic_no_pic))
3642 CmdArgs.push_back("-fPIC");
3643
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003644 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3645 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3646 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3647 CmdArgs.push_back("-fno-builtin-strcat");
3648 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3649 CmdArgs.push_back("-fno-builtin-strcpy");
3650 }
3651
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003652 if (Args.hasArg(options::OPT_g_Flag) &&
3653 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3654 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3655}
3656
3657void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3658 const InputInfoList &Inputs,
3659 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003660 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003661
3662 // Derived from cc1_options spec.
3663 if (Args.hasArg(options::OPT_fast) ||
3664 Args.hasArg(options::OPT_fastf) ||
3665 Args.hasArg(options::OPT_fastcp))
3666 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003667
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003668 if (Arg *A = Args.getLastArg(options::OPT_pg))
3669 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003670 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003671 << A->getAsString(Args) << "-fomit-frame-pointer";
3672
3673 AddCC1Args(Args, CmdArgs);
3674
3675 if (!Args.hasArg(options::OPT_Q))
3676 CmdArgs.push_back("-quiet");
3677
3678 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003679 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003680
3681 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3682
3683 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3684 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3685
3686 // FIXME: The goal is to use the user provided -o if that is our
3687 // final output, otherwise to drive from the original input
3688 // name. Find a clean way to go about this.
3689 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3690 Args.hasArg(options::OPT_o)) {
3691 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3692 CmdArgs.push_back("-auxbase-strip");
3693 CmdArgs.push_back(OutputOpt->getValue(Args));
3694 } else {
3695 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003696 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003697 }
3698
3699 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3700
3701 Args.AddAllArgs(CmdArgs, options::OPT_O);
3702 // FIXME: -Wall is getting some special treatment. Investigate.
3703 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3704 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003705 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003706 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003707 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3708 // Honor -std-default.
3709 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3710 "-std=", /*Joined=*/true);
3711 }
3712
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003713 if (Args.hasArg(options::OPT_v))
3714 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003715 if (Args.hasArg(options::OPT_pg) &&
3716 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003717 CmdArgs.push_back("-p");
3718 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003719
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003720 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003721 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3722 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3723 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3724 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3725 //
3726 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003727 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3728 options::OPT_fsyntax_only),
3729 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003730 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3731 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3732 (*it)->claim();
3733 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003734 }
3735 }
3736 } else
3737 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003738
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003739 // Claim Clang only -f options, they aren't worth warning about.
3740 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3741
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003742 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3743 if (Args.hasArg(options::OPT_Qn))
3744 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003745
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003746 // FIXME: This isn't correct.
3747 //Args.AddLastArg(CmdArgs, options::OPT__help)
3748 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3749
3750 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3751
3752 // FIXME: Still don't get what is happening here. Investigate.
3753 Args.AddAllArgs(CmdArgs, options::OPT__param);
3754
3755 if (Args.hasArg(options::OPT_fmudflap) ||
3756 Args.hasArg(options::OPT_fmudflapth)) {
3757 CmdArgs.push_back("-fno-builtin");
3758 CmdArgs.push_back("-fno-merge-constants");
3759 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003760
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003761 if (Args.hasArg(options::OPT_coverage)) {
3762 CmdArgs.push_back("-fprofile-arcs");
3763 CmdArgs.push_back("-ftest-coverage");
3764 }
3765
3766 if (types::isCXX(Inputs[0].getType()))
3767 CmdArgs.push_back("-D__private_extern__=extern");
3768}
3769
3770void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3771 const InputInfoList &Inputs,
3772 const ArgStringList &OutputArgs) const {
3773 // Derived from cpp_options
3774 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003775
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003776 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3777
3778 AddCC1Args(Args, CmdArgs);
3779
3780 // NOTE: The code below has some commonality with cpp_options, but
3781 // in classic gcc style ends up sending things in different
3782 // orders. This may be a good merge candidate once we drop pedantic
3783 // compatibility.
3784
3785 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003786 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003787 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003788 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3789 // Honor -std-default.
3790 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3791 "-std=", /*Joined=*/true);
3792 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003793 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3794 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003795
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003796 // The driver treats -fsyntax-only specially.
3797 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3798
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003799 // Claim Clang only -f options, they aren't worth warning about.
3800 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3801
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003802 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3803 !Args.hasArg(options::OPT_fno_working_directory))
3804 CmdArgs.push_back("-fworking-directory");
3805
3806 Args.AddAllArgs(CmdArgs, options::OPT_O);
3807 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3808 if (Args.hasArg(options::OPT_save_temps))
3809 CmdArgs.push_back("-fpch-preprocess");
3810}
3811
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003812void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003813 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003814 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003815 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003816
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003817 CheckPreprocessingOptions(D, Args);
3818
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003819 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003820 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3821 Args.AddLastArg(CmdArgs, options::OPT_C);
3822 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003823 if (!Args.hasArg(options::OPT_Q))
3824 CmdArgs.push_back("-quiet");
3825 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003826 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003827 Args.AddLastArg(CmdArgs, options::OPT_v);
3828 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3829 Args.AddLastArg(CmdArgs, options::OPT_P);
3830
3831 // FIXME: Handle %I properly.
3832 if (getToolChain().getArchName() == "x86_64") {
3833 CmdArgs.push_back("-imultilib");
3834 CmdArgs.push_back("x86_64");
3835 }
3836
3837 if (Args.hasArg(options::OPT_MD)) {
3838 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003839 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003840 }
3841
3842 if (Args.hasArg(options::OPT_MMD)) {
3843 CmdArgs.push_back("-MMD");
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 Args.AddLastArg(CmdArgs, options::OPT_M);
3848 Args.AddLastArg(CmdArgs, options::OPT_MM);
3849 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3850 Args.AddLastArg(CmdArgs, options::OPT_MG);
3851 Args.AddLastArg(CmdArgs, options::OPT_MP);
3852 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3853 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3854 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3855 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3856 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3857 CmdArgs.push_back("-MQ");
3858 CmdArgs.push_back(OutputOpt->getValue(Args));
3859 }
3860 }
3861
3862 Args.AddLastArg(CmdArgs, options::OPT_remap);
3863 if (Args.hasArg(options::OPT_g3))
3864 CmdArgs.push_back("-dD");
3865 Args.AddLastArg(CmdArgs, options::OPT_H);
3866
3867 AddCPPArgs(Args, CmdArgs);
3868
3869 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3870 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3871
3872 for (InputInfoList::const_iterator
3873 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3874 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003875
Daniel Dunbarb440f562010-08-02 02:38:21 +00003876 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003877 }
3878
3879 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3880 options::OPT_Xpreprocessor);
3881
3882 if (Args.hasArg(options::OPT_fmudflap)) {
3883 CmdArgs.push_back("-D_MUDFLAP");
3884 CmdArgs.push_back("-include");
3885 CmdArgs.push_back("mf-runtime.h");
3886 }
3887
3888 if (Args.hasArg(options::OPT_fmudflapth)) {
3889 CmdArgs.push_back("-D_MUDFLAP");
3890 CmdArgs.push_back("-D_MUDFLAPTH");
3891 CmdArgs.push_back("-include");
3892 CmdArgs.push_back("mf-runtime.h");
3893 }
3894}
3895
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003896void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003897 ArgStringList &CmdArgs) const {
3898 // Derived from cpp spec.
3899
3900 if (Args.hasArg(options::OPT_static)) {
3901 // The gcc spec is broken here, it refers to dynamic but
3902 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003903
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003904 // if (!Args.hasArg(arglist.parser.dynamicOption))
3905 CmdArgs.push_back("-D__STATIC__");
3906 } else
3907 CmdArgs.push_back("-D__DYNAMIC__");
3908
3909 if (Args.hasArg(options::OPT_pthread))
3910 CmdArgs.push_back("-D_REENTRANT");
3911}
3912
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003913void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003914 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003915 const InputInfoList &Inputs,
3916 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003917 const char *LinkingOutput) const {
3918 ArgStringList CmdArgs;
3919
3920 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3921
3922 CmdArgs.push_back("-E");
3923
3924 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003925 Args.hasArg(options::OPT_traditional_cpp))
3926 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003927
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003928 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003929 assert(Output.isFilename() && "Unexpected CC1 output.");
3930 OutputArgs.push_back("-o");
3931 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003932
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003933 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003934 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3935 } else {
3936 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3937 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3938 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003939
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003940 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3941
Chad Rosierc31e48d2011-09-08 00:38:00 +00003942 RemoveCC1UnsupportedArgs(CmdArgs);
3943
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003944 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003945 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003946 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003947 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003948}
3949
3950void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003951 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003952 const InputInfoList &Inputs,
3953 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003954 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003955 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003956 ArgStringList CmdArgs;
3957
3958 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3959
Bob Wilson0090df22012-04-01 23:03:29 +00003960 // Silence warning about unused --serialize-diagnostics
3961 Args.ClaimAllArgs(options::OPT__serialize_diags);
3962
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003963 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003964 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003965 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003966 << A->getAsString(Args) << "-E";
3967
Daniel Dunbar24e52992010-06-07 23:28:45 +00003968 if (JA.getType() == types::TY_LLVM_IR ||
3969 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003970 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003971 else if (JA.getType() == types::TY_LLVM_BC ||
3972 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003973 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003974 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003975 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003976 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003977 else if (JA.getType() != types::TY_PP_Asm &&
3978 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003979 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003980 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003981
3982 ArgStringList OutputArgs;
3983 if (Output.getType() != types::TY_PCH) {
3984 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003985 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003986 OutputArgs.push_back("/dev/null");
3987 else
3988 OutputArgs.push_back(Output.getFilename());
3989 }
3990
3991 // There is no need for this level of compatibility, but it makes
3992 // diffing easier.
3993 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3994 Args.hasArg(options::OPT_S));
3995
3996 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003997 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003998 if (OutputArgsEarly) {
3999 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4000 } else {
4001 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4002 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4003 }
4004 } else {
4005 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004006
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004007 for (InputInfoList::const_iterator
4008 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4009 const InputInfo &II = *it;
4010
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004011 // Reject AST inputs.
4012 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004013 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004014 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004015 return;
4016 }
4017
Daniel Dunbarb440f562010-08-02 02:38:21 +00004018 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004019 }
4020
4021 if (OutputArgsEarly) {
4022 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4023 } else {
4024 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4025 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4026 }
4027 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004028
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004029 if (Output.getType() == types::TY_PCH) {
4030 assert(Output.isFilename() && "Invalid PCH output.");
4031
4032 CmdArgs.push_back("-o");
4033 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4034 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004035 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004036 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004037 C.addTempFile(TmpPath);
4038 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004039
Eric Christopher84fbdb42011-08-19 00:30:14 +00004040 // If we're emitting a pch file with the last 4 characters of ".pth"
4041 // and falling back to llvm-gcc we want to use ".gch" instead.
4042 std::string OutputFile(Output.getFilename());
4043 size_t loc = OutputFile.rfind(".pth");
4044 if (loc != std::string::npos)
4045 OutputFile.replace(loc, 4, ".gch");
4046 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4047 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004048 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004049
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004050 RemoveCC1UnsupportedArgs(CmdArgs);
4051
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004052 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004053 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004054 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004055 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004056}
4057
Daniel Dunbarbe220842009-03-20 16:06:39 +00004058void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004059 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004060 const InputInfoList &Inputs,
4061 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004062 const char *LinkingOutput) const {
4063 ArgStringList CmdArgs;
4064
4065 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4066 const InputInfo &Input = Inputs[0];
4067
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004068 // Determine the original source input.
4069 const Action *SourceAction = &JA;
4070 while (SourceAction->getKind() != Action::InputClass) {
4071 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4072 SourceAction = SourceAction->getInputs()[0];
4073 }
4074
4075 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004076 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004077 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004078 if (Args.hasArg(options::OPT_gstabs))
4079 CmdArgs.push_back("--gstabs");
4080 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004081 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004082 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004083
Daniel Dunbarbe220842009-03-20 16:06:39 +00004084 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004085 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004086
Daniel Dunbar6d484762010-07-22 01:47:22 +00004087 // Use -force_cpusubtype_ALL on x86 by default.
4088 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4089 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004090 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4091 CmdArgs.push_back("-force_cpusubtype_ALL");
4092
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004093 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4094 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004095 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004096 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004097 CmdArgs.push_back("-static");
4098
Daniel Dunbarbe220842009-03-20 16:06:39 +00004099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4100 options::OPT_Xassembler);
4101
4102 assert(Output.isFilename() && "Unexpected lipo output.");
4103 CmdArgs.push_back("-o");
4104 CmdArgs.push_back(Output.getFilename());
4105
Daniel Dunbarb440f562010-08-02 02:38:21 +00004106 assert(Input.isFilename() && "Invalid input.");
4107 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004108
4109 // asm_final spec is empty.
4110
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004111 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004112 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004113 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004114}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004115
David Blaikie68e081d2011-12-20 02:48:34 +00004116void darwin::DarwinTool::anchor() {}
4117
Daniel Dunbare9ded432009-09-09 18:36:20 +00004118void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4119 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004120 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004121
Daniel Dunbarc1964212009-03-26 16:23:12 +00004122 // Derived from darwin_arch spec.
4123 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004124 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004125
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004126 // FIXME: Is this needed anymore?
4127 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004128 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004129}
4130
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004131void darwin::Link::AddLinkArgs(Compilation &C,
4132 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004133 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004134 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004135 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004136
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004137 unsigned Version[3] = { 0, 0, 0 };
4138 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4139 bool HadExtra;
4140 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4141 Version[1], Version[2], HadExtra) ||
4142 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004143 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004144 << A->getAsString(Args);
4145 }
4146
4147 // Newer linkers support -demangle, pass it if supported and not disabled by
4148 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004149 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004150 // Don't pass -demangle to ld_classic.
4151 //
4152 // FIXME: This is a temporary workaround, ld should be handling this.
4153 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4154 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004155 if (getToolChain().getArch() == llvm::Triple::x86) {
4156 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4157 options::OPT_Wl_COMMA),
4158 ie = Args.filtered_end(); it != ie; ++it) {
4159 const Arg *A = *it;
4160 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004161 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004162 UsesLdClassic = true;
4163 }
4164 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004165 if (!UsesLdClassic)
4166 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004167 }
4168
Daniel Dunbaref889c72011-06-21 20:55:11 +00004169 // If we are using LTO, then automatically create a temporary file path for
4170 // the linker to use, so that it's lifetime will extend past a possible
4171 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004172 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004173 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004174 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004175 C.addTempFile(TmpPath);
4176 CmdArgs.push_back("-object_path_lto");
4177 CmdArgs.push_back(TmpPath);
4178 }
4179
Daniel Dunbarc1964212009-03-26 16:23:12 +00004180 // Derived from the "link" spec.
4181 Args.AddAllArgs(CmdArgs, options::OPT_static);
4182 if (!Args.hasArg(options::OPT_static))
4183 CmdArgs.push_back("-dynamic");
4184 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4185 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4186 // here. How do we wish to handle such things?
4187 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004188
Daniel Dunbarc1964212009-03-26 16:23:12 +00004189 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004190 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004191 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004192 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004193
4194 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4195 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4196 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4197
4198 Arg *A;
4199 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4200 (A = Args.getLastArg(options::OPT_current__version)) ||
4201 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004202 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004203 << A->getAsString(Args) << "-dynamiclib";
4204
4205 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4206 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4207 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4208 } else {
4209 CmdArgs.push_back("-dylib");
4210
4211 Arg *A;
4212 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4213 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4214 (A = Args.getLastArg(options::OPT_client__name)) ||
4215 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4216 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4217 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004218 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004219 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004220
Daniel Dunbarc1964212009-03-26 16:23:12 +00004221 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4222 "-dylib_compatibility_version");
4223 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4224 "-dylib_current_version");
4225
Daniel Dunbara48823f2010-01-22 02:04:52 +00004226 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004227
4228 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4229 "-dylib_install_name");
4230 }
4231
4232 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4233 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4234 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004235 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004236 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004237 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4238 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4239 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4240 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4241 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4242 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004243 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004244 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4245 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4246 Args.AddAllArgs(CmdArgs, options::OPT_init);
4247
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004248 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004249 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004250
4251 // If we had an explicit -mios-simulator-version-min argument, honor that,
4252 // otherwise use the traditional deployment targets. We can't just check the
4253 // is-sim attribute because existing code follows this path, and the linker
4254 // may not handle the argument.
4255 //
4256 // FIXME: We may be able to remove this, once we can verify no one depends on
4257 // it.
4258 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4259 CmdArgs.push_back("-ios_simulator_version_min");
4260 else if (DarwinTC.isTargetIPhoneOS())
4261 CmdArgs.push_back("-iphoneos_version_min");
4262 else
4263 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004264 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004265
Daniel Dunbarc1964212009-03-26 16:23:12 +00004266 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4267 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4268 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4269 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4270 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004271
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004272 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4273 options::OPT_fno_pie,
4274 options::OPT_fno_PIE)) {
4275 if (A->getOption().matches(options::OPT_fpie) ||
4276 A->getOption().matches(options::OPT_fPIE))
4277 CmdArgs.push_back("-pie");
4278 else
4279 CmdArgs.push_back("-no_pie");
4280 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004281
4282 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4283 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4284 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4285 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4286 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4287 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4288 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4289 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4290 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4291 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4292 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4293 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4294 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4295 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4296 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4297 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004298
Daniel Dunbar84384642011-05-02 21:03:47 +00004299 // Give --sysroot= preference, over the Apple specific behavior to also use
4300 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004301 StringRef sysroot = C.getSysRoot();
4302 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004303 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004304 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004305 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4306 CmdArgs.push_back("-syslibroot");
4307 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004308 }
4309
Daniel Dunbarc1964212009-03-26 16:23:12 +00004310 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4311 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4312 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4313 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4314 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004315 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004316 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4317 Args.AddAllArgs(CmdArgs, options::OPT_y);
4318 Args.AddLastArg(CmdArgs, options::OPT_w);
4319 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4320 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4321 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4322 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4323 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4324 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4325 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4326 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4327 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4328 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4329 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4330 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4331}
4332
4333void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004334 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004335 const InputInfoList &Inputs,
4336 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004337 const char *LinkingOutput) const {
4338 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004339
Daniel Dunbarc1964212009-03-26 16:23:12 +00004340 // The logic here is derived from gcc's behavior; most of which
4341 // comes from specs (starting with link_command). Consult gcc for
4342 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004343 ArgStringList CmdArgs;
4344
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004345 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4346 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4347 options::OPT_ccc_arcmt_migrate)) {
4348 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4349 (*I)->claim();
4350 const char *Exec =
4351 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4352 CmdArgs.push_back(Output.getFilename());
4353 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4354 return;
4355 }
4356
Daniel Dunbarc1964212009-03-26 16:23:12 +00004357 // I'm not sure why this particular decomposition exists in gcc, but
4358 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004359 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004360
Daniel Dunbarc1964212009-03-26 16:23:12 +00004361 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4362 Args.AddAllArgs(CmdArgs, options::OPT_s);
4363 Args.AddAllArgs(CmdArgs, options::OPT_t);
4364 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4365 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004366 Args.AddLastArg(CmdArgs, options::OPT_e);
4367 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4368 Args.AddAllArgs(CmdArgs, options::OPT_r);
4369
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004370 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4371 // members of static archive libraries which implement Objective-C classes or
4372 // categories.
4373 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4374 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004375
Daniel Dunbarc1964212009-03-26 16:23:12 +00004376 CmdArgs.push_back("-o");
4377 CmdArgs.push_back(Output.getFilename());
4378
Chad Rosier06fd3c62012-05-16 23:45:12 +00004379 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004380 !Args.hasArg(options::OPT_nostartfiles)) {
4381 // Derived from startfile spec.
4382 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004383 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004384 if (getDarwinToolChain().isTargetIOSSimulator()) {
4385 // The simulator doesn't have a versioned crt1 file.
4386 CmdArgs.push_back("-ldylib1.o");
4387 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004388 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4389 CmdArgs.push_back("-ldylib1.o");
4390 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004391 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004392 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004393 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004394 CmdArgs.push_back("-ldylib1.10.5.o");
4395 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004396 } else {
4397 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004398 if (!Args.hasArg(options::OPT_static)) {
4399 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004400 if (getDarwinToolChain().isTargetIOSSimulator()) {
4401 // The simulator doesn't have a versioned crt1 file.
4402 CmdArgs.push_back("-lbundle1.o");
4403 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004404 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4405 CmdArgs.push_back("-lbundle1.o");
4406 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004407 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004408 CmdArgs.push_back("-lbundle1.o");
4409 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004410 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004411 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004412 if (Args.hasArg(options::OPT_pg) &&
4413 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004414 if (Args.hasArg(options::OPT_static) ||
4415 Args.hasArg(options::OPT_object) ||
4416 Args.hasArg(options::OPT_preload)) {
4417 CmdArgs.push_back("-lgcrt0.o");
4418 } else {
4419 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004420
Daniel Dunbarc1964212009-03-26 16:23:12 +00004421 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004422 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004423 // By default on OS X 10.8 and later, we don't link with a crt1.o
4424 // file and the linker knows to use _main as the entry point. But,
4425 // when compiling with -pg, we need to link with the gcrt1.o file,
4426 // so pass the -no_new_main option to tell the linker to use the
4427 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004428 if (getDarwinToolChain().isTargetMacOS() &&
4429 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4430 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004431 } else {
4432 if (Args.hasArg(options::OPT_static) ||
4433 Args.hasArg(options::OPT_object) ||
4434 Args.hasArg(options::OPT_preload)) {
4435 CmdArgs.push_back("-lcrt0.o");
4436 } else {
4437 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004438 if (getDarwinToolChain().isTargetIOSSimulator()) {
4439 // The simulator doesn't have a versioned crt1 file.
4440 CmdArgs.push_back("-lcrt1.o");
4441 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004442 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4443 CmdArgs.push_back("-lcrt1.o");
4444 else
4445 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004446 } else {
4447 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4448 CmdArgs.push_back("-lcrt1.o");
4449 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4450 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004451 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004452 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004453
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004454 // darwin_crt2 spec is empty.
4455 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004456 }
4457 }
4458 }
4459 }
4460
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004461 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4462 Args.hasArg(options::OPT_shared_libgcc) &&
4463 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004464 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004465 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004466 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004467 }
4468 }
4469
4470 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004471
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004472 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4473 // symbols may appear. Mark all of them as dynamic_lookup.
4474 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4475 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4476 options::OPT_fno_address_sanitizer, false)) {
4477 if (Args.hasArg(options::OPT_dynamiclib) ||
4478 Args.hasArg(options::OPT_bundle)) {
4479 CmdArgs.push_back("-undefined");
4480 CmdArgs.push_back("dynamic_lookup");
4481 }
4482 }
4483
Daniel Dunbarc1964212009-03-26 16:23:12 +00004484 if (Args.hasArg(options::OPT_fopenmp))
4485 // This is more complicated in gcc...
4486 CmdArgs.push_back("-lgomp");
4487
Douglas Gregor9295df02012-05-15 21:00:27 +00004488 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4489
Bob Wilson16d93952012-05-15 18:57:39 +00004490 if (isObjCRuntimeLinked(Args) &&
4491 !Args.hasArg(options::OPT_nostdlib) &&
4492 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004493 // Avoid linking compatibility stubs on i386 mac.
4494 if (!getDarwinToolChain().isTargetMacOS() ||
4495 getDarwinToolChain().getArchName() != "i386") {
4496 // If we don't have ARC or subscripting runtime support, link in the
4497 // runtime stubs. We have to do this *before* adding any of the normal
4498 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004499 ObjCRuntime runtime =
4500 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004501 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004502 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004503 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004504 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004505 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004506 CmdArgs.push_back("-framework");
4507 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004508 // Link libobj.
4509 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004510 }
John McCall31168b02011-06-15 23:02:42 +00004511
Daniel Dunbarc1964212009-03-26 16:23:12 +00004512 if (LinkingOutput) {
4513 CmdArgs.push_back("-arch_multiple");
4514 CmdArgs.push_back("-final_output");
4515 CmdArgs.push_back(LinkingOutput);
4516 }
4517
Daniel Dunbarc1964212009-03-26 16:23:12 +00004518 if (Args.hasArg(options::OPT_fnested_functions))
4519 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004520
Daniel Dunbarc1964212009-03-26 16:23:12 +00004521 if (!Args.hasArg(options::OPT_nostdlib) &&
4522 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004523 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004524 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004525
Daniel Dunbarc1964212009-03-26 16:23:12 +00004526 // link_ssp spec is empty.
4527
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004528 // Let the tool chain choose which runtime library to link.
4529 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004530 }
4531
Chad Rosier06fd3c62012-05-16 23:45:12 +00004532 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004533 !Args.hasArg(options::OPT_nostartfiles)) {
4534 // endfile_spec is empty.
4535 }
4536
4537 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4538 Args.AddAllArgs(CmdArgs, options::OPT_F);
4539
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004540 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004541 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004542 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004543}
4544
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004545void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004546 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004547 const InputInfoList &Inputs,
4548 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004549 const char *LinkingOutput) const {
4550 ArgStringList CmdArgs;
4551
4552 CmdArgs.push_back("-create");
4553 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004554
4555 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004556 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004557
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004558 for (InputInfoList::const_iterator
4559 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4560 const InputInfo &II = *it;
4561 assert(II.isFilename() && "Unexpected lipo input.");
4562 CmdArgs.push_back(II.getFilename());
4563 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004564 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004565 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004566 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004567}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004568
Daniel Dunbar88299622010-06-04 18:28:36 +00004569void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004570 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004571 const InputInfoList &Inputs,
4572 const ArgList &Args,
4573 const char *LinkingOutput) const {
4574 ArgStringList CmdArgs;
4575
Daniel Dunbareb86b042011-05-09 17:23:16 +00004576 CmdArgs.push_back("-o");
4577 CmdArgs.push_back(Output.getFilename());
4578
Daniel Dunbar88299622010-06-04 18:28:36 +00004579 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4580 const InputInfo &Input = Inputs[0];
4581 assert(Input.isFilename() && "Unexpected dsymutil input.");
4582 CmdArgs.push_back(Input.getFilename());
4583
Daniel Dunbar88299622010-06-04 18:28:36 +00004584 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004585 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004586 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004587}
4588
Eric Christopher551ef452011-08-23 17:56:55 +00004589void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4590 const InputInfo &Output,
4591 const InputInfoList &Inputs,
4592 const ArgList &Args,
4593 const char *LinkingOutput) const {
4594 ArgStringList CmdArgs;
4595 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004596 CmdArgs.push_back("--debug-info");
4597 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004598 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004599
4600 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4601 const InputInfo &Input = Inputs[0];
4602 assert(Input.isFilename() && "Unexpected verify input");
4603
4604 // Grabbing the output of the earlier dsymutil run.
4605 CmdArgs.push_back(Input.getFilename());
4606
4607 const char *Exec =
4608 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4609 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4610}
4611
David Chisnallf571cde2012-02-15 13:39:01 +00004612void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4613 const InputInfo &Output,
4614 const InputInfoList &Inputs,
4615 const ArgList &Args,
4616 const char *LinkingOutput) const {
4617 ArgStringList CmdArgs;
4618
4619 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4620 options::OPT_Xassembler);
4621
4622 CmdArgs.push_back("-o");
4623 CmdArgs.push_back(Output.getFilename());
4624
4625 for (InputInfoList::const_iterator
4626 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4627 const InputInfo &II = *it;
4628 CmdArgs.push_back(II.getFilename());
4629 }
4630
4631 const char *Exec =
4632 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4633 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4634}
4635
4636
4637void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4638 const InputInfo &Output,
4639 const InputInfoList &Inputs,
4640 const ArgList &Args,
4641 const char *LinkingOutput) const {
4642 // FIXME: Find a real GCC, don't hard-code versions here
4643 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4644 const llvm::Triple &T = getToolChain().getTriple();
4645 std::string LibPath = "/usr/lib/";
4646 llvm::Triple::ArchType Arch = T.getArch();
4647 switch (Arch) {
4648 case llvm::Triple::x86:
4649 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4650 T.getOSName()).str() + "/4.5.2/";
4651 break;
4652 case llvm::Triple::x86_64:
4653 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4654 T.getOSName()).str();
4655 GCCLibPath += "/4.5.2/amd64/";
4656 LibPath += "amd64/";
4657 break;
4658 default:
4659 assert(0 && "Unsupported architecture");
4660 }
4661
4662 ArgStringList CmdArgs;
4663
David Chisnall272a0712012-02-29 15:06:12 +00004664 // Demangle C++ names in errors
4665 CmdArgs.push_back("-C");
4666
David Chisnallf571cde2012-02-15 13:39:01 +00004667 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4668 (!Args.hasArg(options::OPT_shared))) {
4669 CmdArgs.push_back("-e");
4670 CmdArgs.push_back("_start");
4671 }
4672
4673 if (Args.hasArg(options::OPT_static)) {
4674 CmdArgs.push_back("-Bstatic");
4675 CmdArgs.push_back("-dn");
4676 } else {
4677 CmdArgs.push_back("-Bdynamic");
4678 if (Args.hasArg(options::OPT_shared)) {
4679 CmdArgs.push_back("-shared");
4680 } else {
4681 CmdArgs.push_back("--dynamic-linker");
4682 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4683 }
4684 }
4685
4686 if (Output.isFilename()) {
4687 CmdArgs.push_back("-o");
4688 CmdArgs.push_back(Output.getFilename());
4689 } else {
4690 assert(Output.isNothing() && "Invalid output.");
4691 }
4692
4693 if (!Args.hasArg(options::OPT_nostdlib) &&
4694 !Args.hasArg(options::OPT_nostartfiles)) {
4695 if (!Args.hasArg(options::OPT_shared)) {
4696 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4697 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004698 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004699 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4700 } else {
4701 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004702 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4703 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004704 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004705 if (getToolChain().getDriver().CCCIsCXX)
4706 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004707 }
4708
4709 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4710
4711 Args.AddAllArgs(CmdArgs, options::OPT_L);
4712 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4713 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004714 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004715
4716 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4717
4718 if (!Args.hasArg(options::OPT_nostdlib) &&
4719 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004720 if (getToolChain().getDriver().CCCIsCXX)
4721 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004722 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004723 if (!Args.hasArg(options::OPT_shared)) {
4724 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004725 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004726 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004727 }
David Chisnallf571cde2012-02-15 13:39:01 +00004728 }
4729
4730 if (!Args.hasArg(options::OPT_nostdlib) &&
4731 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004732 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004733 }
David Chisnall96de9932012-02-16 16:00:47 +00004734 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004735
4736 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4737
4738 const char *Exec =
4739 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4740 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4741}
4742
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004743void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004744 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004745 const InputInfoList &Inputs,
4746 const ArgList &Args,
4747 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004748 ArgStringList CmdArgs;
4749
4750 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4751 options::OPT_Xassembler);
4752
4753 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004754 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004755
4756 for (InputInfoList::const_iterator
4757 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4758 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004759 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004760 }
4761
4762 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004763 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004764 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004765}
4766
4767void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004768 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004769 const InputInfoList &Inputs,
4770 const ArgList &Args,
4771 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004772 ArgStringList CmdArgs;
4773
4774 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004775 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004776 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004777 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004778 }
4779
4780 if (Args.hasArg(options::OPT_static)) {
4781 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004782 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004783 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004784// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004785 CmdArgs.push_back("-Bdynamic");
4786 if (Args.hasArg(options::OPT_shared)) {
4787 CmdArgs.push_back("-shared");
4788 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004789 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004790 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4791 }
4792 }
4793
Daniel Dunbarb440f562010-08-02 02:38:21 +00004794 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004795 CmdArgs.push_back("-o");
4796 CmdArgs.push_back(Output.getFilename());
4797 } else {
4798 assert(Output.isNothing() && "Invalid output.");
4799 }
4800
4801 if (!Args.hasArg(options::OPT_nostdlib) &&
4802 !Args.hasArg(options::OPT_nostartfiles)) {
4803 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004804 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004805 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004806 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004807 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004808 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004809 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004810 } else {
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")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004813 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004814 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004815 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004816 }
4817
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004818 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4819 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004820 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004821
4822 Args.AddAllArgs(CmdArgs, options::OPT_L);
4823 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4824 Args.AddAllArgs(CmdArgs, options::OPT_e);
4825
Daniel Dunbar54423b22010-09-17 00:24:54 +00004826 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004827
4828 if (!Args.hasArg(options::OPT_nostdlib) &&
4829 !Args.hasArg(options::OPT_nodefaultlibs)) {
4830 // FIXME: For some reason GCC passes -lgcc before adding
4831 // the default system libraries. Just mimic this for now.
4832 CmdArgs.push_back("-lgcc");
4833
4834 if (Args.hasArg(options::OPT_pthread))
4835 CmdArgs.push_back("-pthread");
4836 if (!Args.hasArg(options::OPT_shared))
4837 CmdArgs.push_back("-lc");
4838 CmdArgs.push_back("-lgcc");
4839 }
4840
4841 if (!Args.hasArg(options::OPT_nostdlib) &&
4842 !Args.hasArg(options::OPT_nostartfiles)) {
4843 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004844 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004845 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004846 }
4847
Bill Wendling08760582011-06-27 19:15:03 +00004848 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004849
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004850 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004851 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004852 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004853}
4854
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004855void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004856 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004857 const InputInfoList &Inputs,
4858 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004859 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004860 ArgStringList CmdArgs;
4861
4862 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4863 options::OPT_Xassembler);
4864
4865 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004866 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004867
4868 for (InputInfoList::const_iterator
4869 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4870 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004871 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004872 }
4873
4874 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004875 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004876 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004877}
4878
4879void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004880 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004881 const InputInfoList &Inputs,
4882 const ArgList &Args,
4883 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004884 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004885 ArgStringList CmdArgs;
4886
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004887 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004888 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004889 CmdArgs.push_back("-e");
4890 CmdArgs.push_back("__start");
4891 }
4892
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004893 if (Args.hasArg(options::OPT_static)) {
4894 CmdArgs.push_back("-Bstatic");
4895 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004896 if (Args.hasArg(options::OPT_rdynamic))
4897 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004898 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004899 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004900 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004901 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004902 } else {
4903 CmdArgs.push_back("-dynamic-linker");
4904 CmdArgs.push_back("/usr/libexec/ld.so");
4905 }
4906 }
4907
Daniel Dunbarb440f562010-08-02 02:38:21 +00004908 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004909 CmdArgs.push_back("-o");
4910 CmdArgs.push_back(Output.getFilename());
4911 } else {
4912 assert(Output.isNothing() && "Invalid output.");
4913 }
4914
4915 if (!Args.hasArg(options::OPT_nostdlib) &&
4916 !Args.hasArg(options::OPT_nostartfiles)) {
4917 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004918 if (Args.hasArg(options::OPT_pg))
4919 CmdArgs.push_back(Args.MakeArgString(
4920 getToolChain().GetFilePath("gcrt0.o")));
4921 else
4922 CmdArgs.push_back(Args.MakeArgString(
4923 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004924 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004925 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004926 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004927 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004928 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004929 }
4930 }
4931
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004932 std::string Triple = getToolChain().getTripleString();
4933 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004934 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004935 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004936 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004937
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004938 Args.AddAllArgs(CmdArgs, options::OPT_L);
4939 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4940 Args.AddAllArgs(CmdArgs, options::OPT_e);
4941
Daniel Dunbar54423b22010-09-17 00:24:54 +00004942 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004943
4944 if (!Args.hasArg(options::OPT_nostdlib) &&
4945 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004946 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004947 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004948 if (Args.hasArg(options::OPT_pg))
4949 CmdArgs.push_back("-lm_p");
4950 else
4951 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004952 }
4953
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004954 // FIXME: For some reason GCC passes -lgcc before adding
4955 // the default system libraries. Just mimic this for now.
4956 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004957
4958 if (Args.hasArg(options::OPT_pthread))
Chris Lattnerd0257f72011-02-21 18:36:51 +00004959 CmdArgs.push_back("-lpthread");
Chandler Carruth45661652011-12-17 22:32:42 +00004960 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004961 if (Args.hasArg(options::OPT_pg))
4962 CmdArgs.push_back("-lc_p");
4963 else
4964 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004965 }
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004966 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004967 }
4968
4969 if (!Args.hasArg(options::OPT_nostdlib) &&
4970 !Args.hasArg(options::OPT_nostartfiles)) {
4971 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004972 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004973 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004974 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004975 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004976 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004977 }
4978
4979 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004980 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004981 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004982}
Ed Schoutene33194b2009-04-02 19:13:12 +00004983
Eli Friedman9fa28852012-08-08 23:57:20 +00004984void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4985 const InputInfo &Output,
4986 const InputInfoList &Inputs,
4987 const ArgList &Args,
4988 const char *LinkingOutput) const {
4989 ArgStringList CmdArgs;
4990
4991 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4992 options::OPT_Xassembler);
4993
4994 CmdArgs.push_back("-o");
4995 CmdArgs.push_back(Output.getFilename());
4996
4997 for (InputInfoList::const_iterator
4998 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4999 const InputInfo &II = *it;
5000 CmdArgs.push_back(II.getFilename());
5001 }
5002
5003 const char *Exec =
5004 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5005 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5006}
5007
5008void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5009 const InputInfo &Output,
5010 const InputInfoList &Inputs,
5011 const ArgList &Args,
5012 const char *LinkingOutput) const {
5013 const Driver &D = getToolChain().getDriver();
5014 ArgStringList CmdArgs;
5015
5016 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5017 (!Args.hasArg(options::OPT_shared))) {
5018 CmdArgs.push_back("-e");
5019 CmdArgs.push_back("__start");
5020 }
5021
5022 if (Args.hasArg(options::OPT_static)) {
5023 CmdArgs.push_back("-Bstatic");
5024 } else {
5025 if (Args.hasArg(options::OPT_rdynamic))
5026 CmdArgs.push_back("-export-dynamic");
5027 CmdArgs.push_back("--eh-frame-hdr");
5028 CmdArgs.push_back("-Bdynamic");
5029 if (Args.hasArg(options::OPT_shared)) {
5030 CmdArgs.push_back("-shared");
5031 } else {
5032 CmdArgs.push_back("-dynamic-linker");
5033 CmdArgs.push_back("/usr/libexec/ld.so");
5034 }
5035 }
5036
5037 if (Output.isFilename()) {
5038 CmdArgs.push_back("-o");
5039 CmdArgs.push_back(Output.getFilename());
5040 } else {
5041 assert(Output.isNothing() && "Invalid output.");
5042 }
5043
5044 if (!Args.hasArg(options::OPT_nostdlib) &&
5045 !Args.hasArg(options::OPT_nostartfiles)) {
5046 if (!Args.hasArg(options::OPT_shared)) {
5047 if (Args.hasArg(options::OPT_pg))
5048 CmdArgs.push_back(Args.MakeArgString(
5049 getToolChain().GetFilePath("gcrt0.o")));
5050 else
5051 CmdArgs.push_back(Args.MakeArgString(
5052 getToolChain().GetFilePath("crt0.o")));
5053 CmdArgs.push_back(Args.MakeArgString(
5054 getToolChain().GetFilePath("crtbegin.o")));
5055 } else {
5056 CmdArgs.push_back(Args.MakeArgString(
5057 getToolChain().GetFilePath("crtbeginS.o")));
5058 }
5059 }
5060
5061 Args.AddAllArgs(CmdArgs, options::OPT_L);
5062 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5063 Args.AddAllArgs(CmdArgs, options::OPT_e);
5064
5065 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5066
5067 if (!Args.hasArg(options::OPT_nostdlib) &&
5068 !Args.hasArg(options::OPT_nodefaultlibs)) {
5069 if (D.CCCIsCXX) {
5070 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5071 if (Args.hasArg(options::OPT_pg))
5072 CmdArgs.push_back("-lm_p");
5073 else
5074 CmdArgs.push_back("-lm");
5075 }
5076
5077 if (Args.hasArg(options::OPT_pthread))
5078 CmdArgs.push_back("-lpthread");
5079 if (!Args.hasArg(options::OPT_shared)) {
5080 if (Args.hasArg(options::OPT_pg))
5081 CmdArgs.push_back("-lc_p");
5082 else
5083 CmdArgs.push_back("-lc");
5084 }
5085
5086 std::string myarch = "-lclang_rt.";
5087 const llvm::Triple &T = getToolChain().getTriple();
5088 llvm::Triple::ArchType Arch = T.getArch();
5089 switch (Arch) {
5090 case llvm::Triple::arm:
5091 myarch += ("arm");
5092 break;
5093 case llvm::Triple::x86:
5094 myarch += ("i386");
5095 break;
5096 case llvm::Triple::x86_64:
5097 myarch += ("amd64");
5098 break;
5099 default:
5100 assert(0 && "Unsupported architecture");
5101 }
5102 CmdArgs.push_back(Args.MakeArgString(myarch));
5103 }
5104
5105 if (!Args.hasArg(options::OPT_nostdlib) &&
5106 !Args.hasArg(options::OPT_nostartfiles)) {
5107 if (!Args.hasArg(options::OPT_shared))
5108 CmdArgs.push_back(Args.MakeArgString(
5109 getToolChain().GetFilePath("crtend.o")));
5110 else
5111 CmdArgs.push_back(Args.MakeArgString(
5112 getToolChain().GetFilePath("crtendS.o")));
5113 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005114
5115 const char *Exec =
5116 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5117 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005118}
5119
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005120void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005121 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005122 const InputInfoList &Inputs,
5123 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005124 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005125 ArgStringList CmdArgs;
5126
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005127 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5128 // instruct as in the base system to assemble 32-bit code.
5129 if (getToolChain().getArchName() == "i386")
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005130 CmdArgs.push_back("--32");
5131
Roman Divacky00859c22011-06-04 07:37:31 +00005132 if (getToolChain().getArchName() == "powerpc")
5133 CmdArgs.push_back("-a32");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005134
Eric Christopher0b26a612010-03-02 02:41:08 +00005135 // Set byte order explicitly
5136 if (getToolChain().getArchName() == "mips")
5137 CmdArgs.push_back("-EB");
5138 else if (getToolChain().getArchName() == "mipsel")
5139 CmdArgs.push_back("-EL");
5140
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005141 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5142 options::OPT_Xassembler);
5143
5144 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005145 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005146
5147 for (InputInfoList::const_iterator
5148 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5149 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005150 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005151 }
5152
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005153 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005154 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005155 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005156}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005157
5158void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005159 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005160 const InputInfoList &Inputs,
5161 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005162 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005163 const toolchains::FreeBSD& ToolChain =
5164 static_cast<const toolchains::FreeBSD&>(getToolChain());
5165 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005166 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005167
5168 // Silence warning for "clang -g foo.o -o foo"
5169 Args.ClaimAllArgs(options::OPT_g_Group);
5170 // and "clang -emit-llvm foo.o -o foo"
5171 Args.ClaimAllArgs(options::OPT_emit_llvm);
5172 // and for "clang -w foo.o -o foo". Other warning options are already
5173 // handled somewhere else.
5174 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005175
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005176 if (!D.SysRoot.empty())
5177 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5178
Roman Divackyafe2f232012-08-28 15:09:03 +00005179 if (Args.hasArg(options::OPT_pie))
5180 CmdArgs.push_back("-pie");
5181
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005182 if (Args.hasArg(options::OPT_static)) {
5183 CmdArgs.push_back("-Bstatic");
5184 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005185 if (Args.hasArg(options::OPT_rdynamic))
5186 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005187 CmdArgs.push_back("--eh-frame-hdr");
5188 if (Args.hasArg(options::OPT_shared)) {
5189 CmdArgs.push_back("-Bshareable");
5190 } else {
5191 CmdArgs.push_back("-dynamic-linker");
5192 CmdArgs.push_back("/libexec/ld-elf.so.1");
5193 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005194 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5195 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005196 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5197 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5198 CmdArgs.push_back("--hash-style=both");
5199 }
5200 }
5201 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005202 }
5203
5204 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5205 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005206 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005207 CmdArgs.push_back("-m");
5208 CmdArgs.push_back("elf_i386_fbsd");
5209 }
5210
Roman Divackyafe2f232012-08-28 15:09:03 +00005211 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005212 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005213 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005214 }
5215
Daniel Dunbarb440f562010-08-02 02:38:21 +00005216 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005217 CmdArgs.push_back("-o");
5218 CmdArgs.push_back(Output.getFilename());
5219 } else {
5220 assert(Output.isNothing() && "Invalid output.");
5221 }
5222
5223 if (!Args.hasArg(options::OPT_nostdlib) &&
5224 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005225 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005226 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005227 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005228 crt1 = "gcrt1.o";
5229 else if (Args.hasArg(options::OPT_pie))
5230 crt1 = "Scrt1.o";
5231 else
5232 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005233 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005234 if (crt1)
5235 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5236
5237 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5238
5239 const char *crtbegin = NULL;
5240 if (Args.hasArg(options::OPT_static))
5241 crtbegin = "crtbeginT.o";
5242 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5243 crtbegin = "crtbeginS.o";
5244 else
5245 crtbegin = "crtbegin.o";
5246
5247 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005248 }
5249
5250 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005251 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005252 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5253 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005254 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005255 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5256 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005257 Args.AddAllArgs(CmdArgs, options::OPT_s);
5258 Args.AddAllArgs(CmdArgs, options::OPT_t);
5259 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5260 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005261
Roman Divackyafe2f232012-08-28 15:09:03 +00005262 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005263
5264 if (!Args.hasArg(options::OPT_nostdlib) &&
5265 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005266 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005267 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005268 if (Args.hasArg(options::OPT_pg))
5269 CmdArgs.push_back("-lm_p");
5270 else
5271 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005272 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005273 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5274 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005275 if (Args.hasArg(options::OPT_pg))
5276 CmdArgs.push_back("-lgcc_p");
5277 else
5278 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005279 if (Args.hasArg(options::OPT_static)) {
5280 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005281 } else if (Args.hasArg(options::OPT_pg)) {
5282 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005283 } else {
5284 CmdArgs.push_back("--as-needed");
5285 CmdArgs.push_back("-lgcc_s");
5286 CmdArgs.push_back("--no-as-needed");
5287 }
5288
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005289 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005290 if (Args.hasArg(options::OPT_pg))
5291 CmdArgs.push_back("-lpthread_p");
5292 else
5293 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005294 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005295
Roman Divacky66f22762011-02-10 16:59:40 +00005296 if (Args.hasArg(options::OPT_pg)) {
5297 if (Args.hasArg(options::OPT_shared))
5298 CmdArgs.push_back("-lc");
5299 else
5300 CmdArgs.push_back("-lc_p");
5301 CmdArgs.push_back("-lgcc_p");
5302 } else {
5303 CmdArgs.push_back("-lc");
5304 CmdArgs.push_back("-lgcc");
5305 }
5306
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005307 if (Args.hasArg(options::OPT_static)) {
5308 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005309 } else if (Args.hasArg(options::OPT_pg)) {
5310 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005311 } else {
5312 CmdArgs.push_back("--as-needed");
5313 CmdArgs.push_back("-lgcc_s");
5314 CmdArgs.push_back("--no-as-needed");
5315 }
5316 }
5317
5318 if (!Args.hasArg(options::OPT_nostdlib) &&
5319 !Args.hasArg(options::OPT_nostartfiles)) {
5320 if (!Args.hasArg(options::OPT_shared))
Roman Divackyafe2f232012-08-28 15:09:03 +00005321 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005322 else
Roman Divackyafe2f232012-08-28 15:09:03 +00005323 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
5324 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005325 }
5326
Roman Divackyafe2f232012-08-28 15:09:03 +00005327 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005328
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005329 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005330 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005331 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005332}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005333
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005334void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5335 const InputInfo &Output,
5336 const InputInfoList &Inputs,
5337 const ArgList &Args,
5338 const char *LinkingOutput) const {
5339 ArgStringList CmdArgs;
5340
5341 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5342 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005343 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005344 CmdArgs.push_back("--32");
5345
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005346 // Set byte order explicitly
5347 if (getToolChain().getArchName() == "mips")
5348 CmdArgs.push_back("-EB");
5349 else if (getToolChain().getArchName() == "mipsel")
5350 CmdArgs.push_back("-EL");
5351
5352 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5353 options::OPT_Xassembler);
5354
5355 CmdArgs.push_back("-o");
5356 CmdArgs.push_back(Output.getFilename());
5357
5358 for (InputInfoList::const_iterator
5359 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5360 const InputInfo &II = *it;
5361 CmdArgs.push_back(II.getFilename());
5362 }
5363
David Chisnallddbd68f2011-09-27 22:03:18 +00005364 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005365 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5366}
5367
5368void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5369 const InputInfo &Output,
5370 const InputInfoList &Inputs,
5371 const ArgList &Args,
5372 const char *LinkingOutput) const {
5373 const Driver &D = getToolChain().getDriver();
5374 ArgStringList CmdArgs;
5375
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005376 if (!D.SysRoot.empty())
5377 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5378
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005379 if (Args.hasArg(options::OPT_static)) {
5380 CmdArgs.push_back("-Bstatic");
5381 } else {
5382 if (Args.hasArg(options::OPT_rdynamic))
5383 CmdArgs.push_back("-export-dynamic");
5384 CmdArgs.push_back("--eh-frame-hdr");
5385 if (Args.hasArg(options::OPT_shared)) {
5386 CmdArgs.push_back("-Bshareable");
5387 } else {
5388 CmdArgs.push_back("-dynamic-linker");
5389 CmdArgs.push_back("/libexec/ld.elf_so");
5390 }
5391 }
5392
5393 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5394 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005395 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005396 CmdArgs.push_back("-m");
5397 CmdArgs.push_back("elf_i386");
5398 }
5399
5400 if (Output.isFilename()) {
5401 CmdArgs.push_back("-o");
5402 CmdArgs.push_back(Output.getFilename());
5403 } else {
5404 assert(Output.isNothing() && "Invalid output.");
5405 }
5406
5407 if (!Args.hasArg(options::OPT_nostdlib) &&
5408 !Args.hasArg(options::OPT_nostartfiles)) {
5409 if (!Args.hasArg(options::OPT_shared)) {
5410 CmdArgs.push_back(Args.MakeArgString(
5411 getToolChain().GetFilePath("crt0.o")));
5412 CmdArgs.push_back(Args.MakeArgString(
5413 getToolChain().GetFilePath("crti.o")));
5414 CmdArgs.push_back(Args.MakeArgString(
5415 getToolChain().GetFilePath("crtbegin.o")));
5416 } else {
5417 CmdArgs.push_back(Args.MakeArgString(
5418 getToolChain().GetFilePath("crti.o")));
5419 CmdArgs.push_back(Args.MakeArgString(
5420 getToolChain().GetFilePath("crtbeginS.o")));
5421 }
5422 }
5423
5424 Args.AddAllArgs(CmdArgs, options::OPT_L);
5425 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5426 Args.AddAllArgs(CmdArgs, options::OPT_e);
5427 Args.AddAllArgs(CmdArgs, options::OPT_s);
5428 Args.AddAllArgs(CmdArgs, options::OPT_t);
5429 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5430 Args.AddAllArgs(CmdArgs, options::OPT_r);
5431
5432 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5433
5434 if (!Args.hasArg(options::OPT_nostdlib) &&
5435 !Args.hasArg(options::OPT_nodefaultlibs)) {
5436 if (D.CCCIsCXX) {
5437 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5438 CmdArgs.push_back("-lm");
5439 }
5440 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5441 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005442 if (Args.hasArg(options::OPT_static)) {
5443 CmdArgs.push_back("-lgcc_eh");
5444 } else {
5445 CmdArgs.push_back("--as-needed");
5446 CmdArgs.push_back("-lgcc_s");
5447 CmdArgs.push_back("--no-as-needed");
5448 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005449 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005450
5451 if (Args.hasArg(options::OPT_pthread))
5452 CmdArgs.push_back("-lpthread");
5453 CmdArgs.push_back("-lc");
5454
5455 CmdArgs.push_back("-lgcc");
5456 if (Args.hasArg(options::OPT_static)) {
5457 CmdArgs.push_back("-lgcc_eh");
5458 } else {
5459 CmdArgs.push_back("--as-needed");
5460 CmdArgs.push_back("-lgcc_s");
5461 CmdArgs.push_back("--no-as-needed");
5462 }
5463 }
5464
5465 if (!Args.hasArg(options::OPT_nostdlib) &&
5466 !Args.hasArg(options::OPT_nostartfiles)) {
5467 if (!Args.hasArg(options::OPT_shared))
5468 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5469 "crtend.o")));
5470 else
5471 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5472 "crtendS.o")));
5473 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5474 "crtn.o")));
5475 }
5476
Bill Wendling08760582011-06-27 19:15:03 +00005477 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005478
David Chisnallddbd68f2011-09-27 22:03:18 +00005479 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005480 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5481}
5482
Rafael Espindola92b00932010-08-10 00:25:48 +00005483void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5484 const InputInfo &Output,
5485 const InputInfoList &Inputs,
5486 const ArgList &Args,
5487 const char *LinkingOutput) const {
5488 ArgStringList CmdArgs;
5489
5490 // Add --32/--64 to make sure we get the format we want.
5491 // This is incomplete
5492 if (getToolChain().getArch() == llvm::Triple::x86) {
5493 CmdArgs.push_back("--32");
5494 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5495 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005496 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5497 CmdArgs.push_back("-a32");
5498 CmdArgs.push_back("-mppc");
5499 CmdArgs.push_back("-many");
5500 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5501 CmdArgs.push_back("-a64");
5502 CmdArgs.push_back("-mppc64");
5503 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005504 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005505 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005506 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5507 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005508
5509 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5510 getToolChain().getTriple());
5511 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005512
5513 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5514 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5515 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005516 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5517 getToolChain().getArch() == llvm::Triple::mipsel ||
5518 getToolChain().getArch() == llvm::Triple::mips64 ||
5519 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005520 StringRef CPUName;
5521 StringRef ABIName;
5522 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005523
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005524 CmdArgs.push_back("-march");
5525 CmdArgs.push_back(CPUName.data());
5526
5527 // Convert ABI name to the GNU tools acceptable variant.
5528 if (ABIName == "o32")
5529 ABIName = "32";
5530 else if (ABIName == "n64")
5531 ABIName = "64";
5532
5533 CmdArgs.push_back("-mabi");
5534 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005535
5536 if (getToolChain().getArch() == llvm::Triple::mips ||
5537 getToolChain().getArch() == llvm::Triple::mips64)
5538 CmdArgs.push_back("-EB");
5539 else
5540 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005541
5542 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5543 options::OPT_fpic, options::OPT_fno_pic,
5544 options::OPT_fPIE, options::OPT_fno_PIE,
5545 options::OPT_fpie, options::OPT_fno_pie);
5546 if (LastPICArg &&
5547 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5548 LastPICArg->getOption().matches(options::OPT_fpic) ||
5549 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5550 LastPICArg->getOption().matches(options::OPT_fpie))) {
5551 CmdArgs.push_back("-KPIC");
5552 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005553 }
5554
5555 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5556 options::OPT_Xassembler);
5557
5558 CmdArgs.push_back("-o");
5559 CmdArgs.push_back(Output.getFilename());
5560
5561 for (InputInfoList::const_iterator
5562 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5563 const InputInfo &II = *it;
5564 CmdArgs.push_back(II.getFilename());
5565 }
5566
5567 const char *Exec =
5568 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5569 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5570}
5571
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005572static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5573 ArgStringList &CmdArgs, const ArgList &Args) {
5574 bool isAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI;
5575 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005576 Args.hasArg(options::OPT_static_libgcc);
5577 if (!D.CCCIsCXX)
5578 CmdArgs.push_back("-lgcc");
5579
5580 if (StaticLibgcc) {
5581 if (D.CCCIsCXX)
5582 CmdArgs.push_back("-lgcc");
5583 } else {
5584 if (!D.CCCIsCXX)
5585 CmdArgs.push_back("--as-needed");
5586 CmdArgs.push_back("-lgcc_s");
5587 if (!D.CCCIsCXX)
5588 CmdArgs.push_back("--no-as-needed");
5589 }
5590
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005591 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005592 CmdArgs.push_back("-lgcc_eh");
5593 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5594 CmdArgs.push_back("-lgcc");
5595}
5596
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005597void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5598 const InputInfo &Output,
5599 const InputInfoList &Inputs,
5600 const ArgList &Args,
5601 const char *LinkingOutput) const {
5602 const toolchains::Linux& ToolChain =
5603 static_cast<const toolchains::Linux&>(getToolChain());
5604 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005605 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
5606 llvm::Triple::ANDROIDEABI;
5607
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005608 ArgStringList CmdArgs;
5609
Rafael Espindolad1002f62010-11-15 18:28:16 +00005610 // Silence warning for "clang -g foo.o -o foo"
5611 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005612 // and "clang -emit-llvm foo.o -o foo"
5613 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005614 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005615 // handled somewhere else.
5616 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005617
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005618 if (!D.SysRoot.empty())
5619 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005620
Rafael Espindolad47ac232010-11-17 22:26:15 +00005621 if (Args.hasArg(options::OPT_pie))
5622 CmdArgs.push_back("-pie");
5623
Rafael Espindola1c76c592010-11-07 22:57:16 +00005624 if (Args.hasArg(options::OPT_rdynamic))
5625 CmdArgs.push_back("-export-dynamic");
5626
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005627 if (Args.hasArg(options::OPT_s))
5628 CmdArgs.push_back("-s");
5629
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005630 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5631 e = ToolChain.ExtraOpts.end();
5632 i != e; ++i)
5633 CmdArgs.push_back(i->c_str());
5634
5635 if (!Args.hasArg(options::OPT_static)) {
5636 CmdArgs.push_back("--eh-frame-hdr");
5637 }
5638
5639 CmdArgs.push_back("-m");
5640 if (ToolChain.getArch() == llvm::Triple::x86)
5641 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005642 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005643 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005644 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005645 else if (ToolChain.getArch() == llvm::Triple::ppc)
5646 CmdArgs.push_back("elf32ppclinux");
5647 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5648 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005649 else if (ToolChain.getArch() == llvm::Triple::mips)
5650 CmdArgs.push_back("elf32btsmip");
5651 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5652 CmdArgs.push_back("elf32ltsmip");
5653 else if (ToolChain.getArch() == llvm::Triple::mips64)
5654 CmdArgs.push_back("elf64btsmip");
5655 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5656 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005657 else
5658 CmdArgs.push_back("elf_x86_64");
5659
5660 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005661 if (ToolChain.getArch() == llvm::Triple::arm
5662 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005663 CmdArgs.push_back("-Bstatic");
5664 else
5665 CmdArgs.push_back("-static");
5666 } else if (Args.hasArg(options::OPT_shared)) {
5667 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005668 if ((ToolChain.getArch() == llvm::Triple::arm
5669 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5670 CmdArgs.push_back("-Bsymbolic");
5671 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005672 }
5673
5674 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005675 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005676 (!Args.hasArg(options::OPT_static) &&
5677 !Args.hasArg(options::OPT_shared))) {
5678 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005679 if (isAndroid)
5680 CmdArgs.push_back("/system/bin/linker");
5681 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005682 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005683 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005684 ToolChain.getArch() == llvm::Triple::thumb) {
5685 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5686 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5687 else
5688 CmdArgs.push_back("/lib/ld-linux.so.3");
5689 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005690 else if (ToolChain.getArch() == llvm::Triple::mips ||
5691 ToolChain.getArch() == llvm::Triple::mipsel)
5692 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005693 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5694 ToolChain.getArch() == llvm::Triple::mips64el)
5695 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005696 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005697 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005698 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005699 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005700 else
5701 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5702 }
5703
5704 CmdArgs.push_back("-o");
5705 CmdArgs.push_back(Output.getFilename());
5706
Rafael Espindola81937ec2010-12-01 01:52:43 +00005707 if (!Args.hasArg(options::OPT_nostdlib) &&
5708 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005709 if (!isAndroid) {
5710 const char *crt1 = NULL;
5711 if (!Args.hasArg(options::OPT_shared)){
5712 if (Args.hasArg(options::OPT_pie))
5713 crt1 = "Scrt1.o";
5714 else
5715 crt1 = "crt1.o";
5716 }
5717 if (crt1)
5718 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005719
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005720 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5721 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005722
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005723 const char *crtbegin;
5724 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005725 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Rafael Espindolad47ac232010-11-17 22:26:15 +00005726 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005727 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005728 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005729 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005730 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5731 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005732
5733 Args.AddAllArgs(CmdArgs, options::OPT_L);
5734
5735 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5736
Roman Divackyee8188a2011-03-01 17:53:14 +00005737 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5738 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005739 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005740
Rafael Espindola9446d762012-04-09 23:53:34 +00005741 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5742 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5743 // forward.
5744 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5745 CmdArgs.push_back("-plugin");
5746 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5747 CmdArgs.push_back(Args.MakeArgString(Plugin));
5748 }
5749
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005750 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5751 CmdArgs.push_back("--no-demangle");
5752
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005753 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5754
Chandler Carruth94a32012012-05-14 18:31:18 +00005755 if (D.CCCIsCXX &&
5756 !Args.hasArg(options::OPT_nostdlib) &&
5757 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005758 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5759 !Args.hasArg(options::OPT_static);
5760 if (OnlyLibstdcxxStatic)
5761 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005762 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005763 if (OnlyLibstdcxxStatic)
5764 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005765 CmdArgs.push_back("-lm");
5766 }
5767
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005768 // Call this before we add the C run-time.
5769 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005770 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005771
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005772 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005773 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5774 if (Args.hasArg(options::OPT_static))
5775 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005776
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005777 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005778
Chandler Carruth94a32012012-05-14 18:31:18 +00005779 if (Args.hasArg(options::OPT_pthread) ||
5780 Args.hasArg(options::OPT_pthreads))
5781 CmdArgs.push_back("-lpthread");
5782
5783 CmdArgs.push_back("-lc");
5784
5785 if (Args.hasArg(options::OPT_static))
5786 CmdArgs.push_back("--end-group");
5787 else
5788 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5789 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005790
Rafael Espindola81937ec2010-12-01 01:52:43 +00005791 if (!Args.hasArg(options::OPT_nostartfiles)) {
5792 const char *crtend;
5793 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005794 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005795 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005796 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005797
Rafael Espindola81937ec2010-12-01 01:52:43 +00005798 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005799 if (!isAndroid)
5800 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005801 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005802 }
5803
Bill Wendling08760582011-06-27 19:15:03 +00005804 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005805
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005806 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5807}
Rafael Espindola92b00932010-08-10 00:25:48 +00005808
Chris Lattner3e2ee142010-07-07 16:01:42 +00005809void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005810 const InputInfo &Output,
5811 const InputInfoList &Inputs,
5812 const ArgList &Args,
5813 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005814 ArgStringList CmdArgs;
5815
5816 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5817 options::OPT_Xassembler);
5818
5819 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005820 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005821
5822 for (InputInfoList::const_iterator
5823 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5824 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005825 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005826 }
5827
5828 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005829 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005830 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005831}
5832
5833void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005834 const InputInfo &Output,
5835 const InputInfoList &Inputs,
5836 const ArgList &Args,
5837 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005838 const Driver &D = getToolChain().getDriver();
5839 ArgStringList CmdArgs;
5840
Daniel Dunbarb440f562010-08-02 02:38:21 +00005841 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005842 CmdArgs.push_back("-o");
5843 CmdArgs.push_back(Output.getFilename());
5844 } else {
5845 assert(Output.isNothing() && "Invalid output.");
5846 }
5847
5848 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005849 !Args.hasArg(options::OPT_nostartfiles)) {
5850 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5851 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5852 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5853 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5854 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005855
5856 Args.AddAllArgs(CmdArgs, options::OPT_L);
5857 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5858 Args.AddAllArgs(CmdArgs, options::OPT_e);
5859
Daniel Dunbar54423b22010-09-17 00:24:54 +00005860 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005861
Eli Friedman83de5132011-12-08 23:54:21 +00005862 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5863
Chris Lattner3e2ee142010-07-07 16:01:42 +00005864 if (!Args.hasArg(options::OPT_nostdlib) &&
5865 !Args.hasArg(options::OPT_nodefaultlibs)) {
5866 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005867 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005868 CmdArgs.push_back("-lm");
5869 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005870 }
5871
5872 if (!Args.hasArg(options::OPT_nostdlib) &&
5873 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005874 if (Args.hasArg(options::OPT_pthread))
5875 CmdArgs.push_back("-lpthread");
5876 CmdArgs.push_back("-lc");
5877 CmdArgs.push_back("-lCompilerRT-Generic");
5878 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5879 CmdArgs.push_back(
5880 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005881 }
5882
Eli Friedman83de5132011-12-08 23:54:21 +00005883 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005884 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005885}
5886
Daniel Dunbarcc912342009-05-02 18:28:39 +00005887/// DragonFly Tools
5888
5889// For now, DragonFly Assemble does just about the same as for
5890// FreeBSD, but this may change soon.
5891void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005892 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005893 const InputInfoList &Inputs,
5894 const ArgList &Args,
5895 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005896 ArgStringList CmdArgs;
5897
5898 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5899 // instruct as in the base system to assemble 32-bit code.
5900 if (getToolChain().getArchName() == "i386")
5901 CmdArgs.push_back("--32");
5902
5903 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5904 options::OPT_Xassembler);
5905
5906 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005907 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005908
5909 for (InputInfoList::const_iterator
5910 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5911 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005912 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005913 }
5914
5915 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005916 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005917 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005918}
5919
5920void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005921 const InputInfo &Output,
5922 const InputInfoList &Inputs,
5923 const ArgList &Args,
5924 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005925 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005926 ArgStringList CmdArgs;
5927
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005928 if (!D.SysRoot.empty())
5929 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5930
Daniel Dunbarcc912342009-05-02 18:28:39 +00005931 if (Args.hasArg(options::OPT_static)) {
5932 CmdArgs.push_back("-Bstatic");
5933 } else {
5934 if (Args.hasArg(options::OPT_shared))
5935 CmdArgs.push_back("-Bshareable");
5936 else {
5937 CmdArgs.push_back("-dynamic-linker");
5938 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5939 }
5940 }
5941
5942 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5943 // instruct ld in the base system to link 32-bit code.
5944 if (getToolChain().getArchName() == "i386") {
5945 CmdArgs.push_back("-m");
5946 CmdArgs.push_back("elf_i386");
5947 }
5948
Daniel Dunbarb440f562010-08-02 02:38:21 +00005949 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005950 CmdArgs.push_back("-o");
5951 CmdArgs.push_back(Output.getFilename());
5952 } else {
5953 assert(Output.isNothing() && "Invalid output.");
5954 }
5955
5956 if (!Args.hasArg(options::OPT_nostdlib) &&
5957 !Args.hasArg(options::OPT_nostartfiles)) {
5958 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005959 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005960 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005961 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005962 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005963 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005964 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005965 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005966 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005967 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005968 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005969 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005970 }
5971 }
5972
5973 Args.AddAllArgs(CmdArgs, options::OPT_L);
5974 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5975 Args.AddAllArgs(CmdArgs, options::OPT_e);
5976
Daniel Dunbar54423b22010-09-17 00:24:54 +00005977 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00005978
5979 if (!Args.hasArg(options::OPT_nostdlib) &&
5980 !Args.hasArg(options::OPT_nodefaultlibs)) {
5981 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
5982 // rpaths
5983 CmdArgs.push_back("-L/usr/lib/gcc41");
5984
5985 if (!Args.hasArg(options::OPT_static)) {
5986 CmdArgs.push_back("-rpath");
5987 CmdArgs.push_back("/usr/lib/gcc41");
5988
5989 CmdArgs.push_back("-rpath-link");
5990 CmdArgs.push_back("/usr/lib/gcc41");
5991
5992 CmdArgs.push_back("-rpath");
5993 CmdArgs.push_back("/usr/lib");
5994
5995 CmdArgs.push_back("-rpath-link");
5996 CmdArgs.push_back("/usr/lib");
5997 }
5998
Rafael Espindola38360b32010-07-20 12:59:03 +00005999 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006000 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006001 CmdArgs.push_back("-lm");
6002 }
6003
Daniel Dunbarcc912342009-05-02 18:28:39 +00006004 if (Args.hasArg(options::OPT_shared)) {
6005 CmdArgs.push_back("-lgcc_pic");
6006 } else {
6007 CmdArgs.push_back("-lgcc");
6008 }
6009
6010
6011 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006012 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006013
6014 if (!Args.hasArg(options::OPT_nolibc)) {
6015 CmdArgs.push_back("-lc");
6016 }
6017
6018 if (Args.hasArg(options::OPT_shared)) {
6019 CmdArgs.push_back("-lgcc_pic");
6020 } else {
6021 CmdArgs.push_back("-lgcc");
6022 }
6023 }
6024
6025 if (!Args.hasArg(options::OPT_nostdlib) &&
6026 !Args.hasArg(options::OPT_nostartfiles)) {
6027 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006028 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006029 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006030 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006031 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006032 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006033 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006034 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006035 }
6036
Bill Wendling08760582011-06-27 19:15:03 +00006037 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006038
Daniel Dunbarcc912342009-05-02 18:28:39 +00006039 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006040 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006041 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006042}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006043
6044void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6045 const InputInfo &Output,
6046 const InputInfoList &Inputs,
6047 const ArgList &Args,
6048 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006049 ArgStringList CmdArgs;
6050
6051 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006052 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6053 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006054 } else {
6055 assert(Output.isNothing() && "Invalid output.");
6056 }
6057
6058 if (!Args.hasArg(options::OPT_nostdlib) &&
6059 !Args.hasArg(options::OPT_nostartfiles)) {
6060 CmdArgs.push_back("-defaultlib:libcmt");
6061 }
6062
6063 CmdArgs.push_back("-nologo");
6064
Michael J. Spencere2f49362012-06-18 16:56:04 +00006065 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6066
6067 // Add filenames immediately.
6068 for (InputInfoList::const_iterator
6069 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6070 if (it->isFilename())
6071 CmdArgs.push_back(it->getFilename());
6072 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006073
6074 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006075 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006076 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6077}