blob: 1549d3dad19e3f48e242d4ff37b17e94cbd9bf27 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
11
Daniel Dunbara2aedc62009-03-18 10:01:51 +000012#include "clang/Driver/Action.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000013#include "clang/Driver/Arg.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000014#include "clang/Driver/ArgList.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000015#include "clang/Driver/Driver.h"
16#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000017#include "clang/Driver/Compilation.h"
18#include "clang/Driver/Job.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000019#include "clang/Driver/Option.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000021#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Util.h"
John McCall5fb5df92012-06-20 06:18:46 +000023#include "clang/Basic/ObjCRuntime.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000026#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000027#include "llvm/ADT/Twine.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000029#include "llvm/Support/Format.h"
30#include "llvm/Support/raw_ostream.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Host.h"
32#include "llvm/Support/Process.h"
John McCall31168b02011-06-15 23:02:42 +000033#include "llvm/Support/ErrorHandling.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000034
35#include "InputInfo.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000036#include "ToolChains.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000037
Daniel Dunbar1a093d22009-03-18 06:00:36 +000038using namespace clang::driver;
39using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000041
Daniel Dunbar64198ef2009-09-10 01:21:05 +000042/// CheckPreprocessingOptions - Perform some validation of preprocessing
43/// arguments that is shared with gcc.
44static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
45 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +000046 if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
Chris Lattner0e62c1c2011-07-23 10:55:15 +000047 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbar64198ef2009-09-10 01:21:05 +000048 << A->getAsString(Args) << "-E";
49}
50
Daniel Dunbar4eadb602009-09-10 01:21:12 +000051/// CheckCodeGenerationOptions - Perform some validation of code generation
52/// arguments that is shared with gcc.
53static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
54 // In gcc, only ARM checks this, but it seems reasonable to check universally.
55 if (Args.hasArg(options::OPT_static))
56 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
57 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000058 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000059 << A->getAsString(Args) << "-static";
60}
61
Chris Lattnerbf2803f2010-03-29 17:55:58 +000062// Quote target names for inclusion in GNU Make dependency files.
63// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000064static void QuoteTarget(StringRef Target,
65 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000066 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
67 switch (Target[i]) {
68 case ' ':
69 case '\t':
70 // Escape the preceding backslashes
71 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
72 Res.push_back('\\');
73
74 // Escape the space/tab
75 Res.push_back('\\');
76 break;
77 case '$':
78 Res.push_back('$');
79 break;
80 case '#':
81 Res.push_back('\\');
82 break;
83 default:
84 break;
85 }
86
87 Res.push_back(Target[i]);
88 }
89}
90
Bill Wendlingc0938f32012-03-12 22:10:06 +000091static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +000092 ArgStringList &CmdArgs,
93 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +000094 const char *EnvVar) {
95 const char *DirList = ::getenv(EnvVar);
Bill Wendling281ca292012-03-12 21:22:35 +000096 if (!DirList)
97 return; // Nothing to do.
98
99 StringRef Dirs(DirList);
100 if (Dirs.empty()) // Empty string should not add '.'.
101 return;
102
103 StringRef::size_type Delim;
104 while ((Delim = Dirs.find(llvm::sys::PathSeparator)) != StringRef::npos) {
105 if (Delim == 0) { // Leading colon.
106 CmdArgs.push_back(ArgName);
107 CmdArgs.push_back(".");
108 } else {
109 CmdArgs.push_back(ArgName);
Nico Weber89355782012-03-19 15:00:03 +0000110 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
Bill Wendling281ca292012-03-12 21:22:35 +0000111 }
Nico Weber89355782012-03-19 15:00:03 +0000112 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000113 }
114
115 if (Dirs.empty()) { // Trailing colon.
116 CmdArgs.push_back(ArgName);
117 CmdArgs.push_back(".");
118 } else { // Add the last path.
119 CmdArgs.push_back(ArgName);
120 CmdArgs.push_back(Args.MakeArgString(Dirs));
121 }
122}
123
Daniel Dunbar54423b22010-09-17 00:24:54 +0000124static void AddLinkerInputs(const ToolChain &TC,
125 const InputInfoList &Inputs, const ArgList &Args,
126 ArgStringList &CmdArgs) {
127 const Driver &D = TC.getDriver();
128
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000129 // Add extra linker input arguments which are not treated as inputs
130 // (constructed via -Xarch_).
131 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
132
Daniel Dunbar54423b22010-09-17 00:24:54 +0000133 for (InputInfoList::const_iterator
134 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
135 const InputInfo &II = *it;
136
137 if (!TC.HasNativeLLVMSupport()) {
138 // Don't try to pass LLVM inputs unless we have native support.
139 if (II.getType() == types::TY_LLVM_IR ||
140 II.getType() == types::TY_LTO_IR ||
141 II.getType() == types::TY_LLVM_BC ||
142 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000143 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000144 << TC.getTripleString();
145 }
146
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000147 // Add filenames immediately.
148 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000149 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000150 continue;
151 }
152
153 // Otherwise, this is a linker input argument.
154 const Arg &A = II.getInputArg();
155
156 // Handle reserved library options.
157 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000158 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Shantonu Senafeb03b2010-09-17 18:39:08 +0000159 } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
160 TC.AddCCKextLibArgs(Args, CmdArgs);
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000161 } else
162 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000163 }
Bill Wendling281ca292012-03-12 21:22:35 +0000164
165 // LIBRARY_PATH - included following the user specified library paths.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000166 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000167}
168
John McCall31168b02011-06-15 23:02:42 +0000169/// \brief Determine whether Objective-C automated reference counting is
170/// enabled.
171static bool isObjCAutoRefCount(const ArgList &Args) {
172 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
173}
174
Ted Kremeneke65b0862012-03-06 20:05:56 +0000175/// \brief Determine whether we are linking the ObjC runtime.
176static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000177 if (isObjCAutoRefCount(Args)) {
178 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000179 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000180 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000181 return Args.hasArg(options::OPT_fobjc_link_runtime);
182}
183
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000184static void addProfileRT(const ToolChain &TC, const ArgList &Args,
Bill Wendling08760582011-06-27 19:15:03 +0000185 ArgStringList &CmdArgs,
186 llvm::Triple Triple) {
187 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
188 Args.hasArg(options::OPT_fprofile_generate) ||
189 Args.hasArg(options::OPT_fcreate_profile) ||
190 Args.hasArg(options::OPT_coverage)))
191 return;
192
193 // GCC links libgcov.a by adding -L<inst>/gcc/lib/gcc/<triple>/<ver> -lgcov to
194 // the link line. We cannot do the same thing because unlike gcov there is a
195 // libprofile_rt.so. We used to use the -l:libprofile_rt.a syntax, but that is
196 // not supported by old linkers.
Benjamin Kramerf5fbe432011-11-07 16:02:25 +0000197 std::string ProfileRT =
198 std::string(TC.getDriver().Dir) + "/../lib/libprofile_rt.a";
Bill Wendling08760582011-06-27 19:15:03 +0000199
Bill Wendling08760582011-06-27 19:15:03 +0000200 CmdArgs.push_back(Args.MakeArgString(ProfileRT));
Rafael Espindola9d4a8cf2011-06-02 18:58:46 +0000201}
202
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000203void Clang::AddPreprocessingOptions(Compilation &C,
204 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000205 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000206 ArgStringList &CmdArgs,
207 const InputInfo &Output,
208 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000209 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000210
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000211 CheckPreprocessingOptions(D, Args);
212
213 Args.AddLastArg(CmdArgs, options::OPT_C);
214 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000215
216 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000217 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000218 (A = Args.getLastArg(options::OPT_MD)) ||
219 (A = Args.getLastArg(options::OPT_MMD))) {
220 // Determine the output location.
221 const char *DepFile;
222 if (Output.getType() == types::TY_Dependencies) {
Daniel Dunbarb440f562010-08-02 02:38:21 +0000223 DepFile = Output.getFilename();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000224 } else if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
225 DepFile = MF->getValue(Args);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000226 C.addFailureResultFile(DepFile);
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000227 } else if (A->getOption().matches(options::OPT_M) ||
228 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000229 DepFile = "-";
230 } else {
231 DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
Peter Collingbourne119cfaa2011-11-21 00:01:05 +0000232 C.addFailureResultFile(DepFile);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000233 }
234 CmdArgs.push_back("-dependency-file");
235 CmdArgs.push_back(DepFile);
236
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000237 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000238 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
239 const char *DepTarget;
240
241 // If user provided -o, that is the dependency target, except
242 // when we are only generating a dependency file.
243 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
244 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
245 DepTarget = OutputOpt->getValue(Args);
246 } else {
247 // Otherwise derive from the base input.
248 //
249 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000250 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000251 llvm::sys::path::replace_extension(P, "o");
252 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000253 }
254
255 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000256 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000257 QuoteTarget(DepTarget, Quoted);
258 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000259 }
260
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000261 if (A->getOption().matches(options::OPT_M) ||
262 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000263 CmdArgs.push_back("-sys-header-deps");
264 }
265
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000266 if (Args.hasArg(options::OPT_MG)) {
267 if (!A || A->getOption().matches(options::OPT_MD) ||
268 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000270 CmdArgs.push_back("-MG");
271 }
272
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000273 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000274
275 // Convert all -MQ <target> args to -MT <quoted target>
276 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
277 options::OPT_MQ),
278 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000279 const Arg *A = *it;
280 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000281
Daniel Dunbara442fd52010-06-11 22:00:13 +0000282 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000283 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000284 SmallString<128> Quoted;
Daniel Dunbara442fd52010-06-11 22:00:13 +0000285 QuoteTarget(A->getValue(Args), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000286 CmdArgs.push_back(Args.MakeArgString(Quoted));
287
288 // -MT flag - no change
289 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000290 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000291 }
292 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293
Douglas Gregor111af7d2009-04-18 00:34:01 +0000294 // Add -i* options, and automatically translate to
295 // -include-pch/-include-pth for transparent PCH support. It's
296 // wonky, but we include looking for .gch so we can support seamless
297 // replacement into a build system already set up to be generating
298 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000299 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000300 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
301 ie = Args.filtered_end(); it != ie; ++it) {
302 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303
304 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000305 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
306 RenderedImplicitInclude = true;
307
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000308 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000309 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000310
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000311 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000312 bool FoundPCH = false;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000313 llvm::sys::Path P(A->getValue(Args));
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000314 bool Exists;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000315 if (UsePCH) {
Douglas Gregor111af7d2009-04-18 00:34:01 +0000316 P.appendSuffix("pch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000317 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000318 FoundPCH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000319 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000320 P.eraseSuffix();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322
Douglas Gregor111af7d2009-04-18 00:34:01 +0000323 if (!FoundPCH) {
324 P.appendSuffix("pth");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000325 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Douglas Gregor111af7d2009-04-18 00:34:01 +0000326 FoundPTH = true;
327 else
328 P.eraseSuffix();
Mike Stump11289f42009-09-09 15:08:12 +0000329 }
330
Douglas Gregor111af7d2009-04-18 00:34:01 +0000331 if (!FoundPCH && !FoundPTH) {
332 P.appendSuffix("gch");
Michael J. Spencerf6efe582011-01-10 02:34:13 +0000333 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000334 FoundPCH = UsePCH;
335 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000336 }
Mike Stump11289f42009-09-09 15:08:12 +0000337 else
Douglas Gregor111af7d2009-04-18 00:34:01 +0000338 P.eraseSuffix();
339 }
340
341 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000342 if (IsFirstImplicitInclude) {
343 A->claim();
344 if (UsePCH)
345 CmdArgs.push_back("-include-pch");
346 else
347 CmdArgs.push_back("-include-pth");
348 CmdArgs.push_back(Args.MakeArgString(P.str()));
349 continue;
350 } else {
351 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000352 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000353 << P.str() << A->getAsString(Args);
354 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000355 }
356 }
357
358 // Not translated, render as usual.
359 A->claim();
360 A->render(Args, CmdArgs);
361 }
362
363 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000364 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
365 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000366
367 // Add -Wp, and -Xassembler if using the preprocessor.
368
369 // FIXME: There is a very unfortunate problem here, some troubled
370 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
371 // really support that we would have to parse and then translate
372 // those options. :(
373 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
374 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000375
376 // -I- is a deprecated GCC feature, reject it.
377 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000378 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000379
380 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
381 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000382 StringRef sysroot = C.getSysRoot();
383 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000384 if (!Args.hasArg(options::OPT_isysroot)) {
385 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000386 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000387 }
388 }
Douglas Gregorf936f782011-09-14 20:28:46 +0000389
390 // If a module path was provided, pass it along. Otherwise, use a temporary
391 // directory.
392 if (Arg *A = Args.getLastArg(options::OPT_fmodule_cache_path)) {
Douglas Gregorf936f782011-09-14 20:28:46 +0000393 A->claim();
394 A->render(Args, CmdArgs);
395 } else {
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000396 SmallString<128> DefaultModuleCache;
Douglas Gregorf936f782011-09-14 20:28:46 +0000397 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
398 DefaultModuleCache);
399 llvm::sys::path::append(DefaultModuleCache, "clang-module-cache");
400 CmdArgs.push_back("-fmodule-cache-path");
401 CmdArgs.push_back(Args.MakeArgString(DefaultModuleCache));
402 }
Douglas Gregor97eec242011-09-15 22:00:41 +0000403
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000404 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000405 // FIXME: We should probably sink the logic for handling these from the
406 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000407 // CPATH - included following the user specified includes (but prior to
408 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000409 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000410 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000411 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000412 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000413 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000414 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000415 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000416 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000417 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000418
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000419 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000420 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000421 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000422
423 // Add system include arguments.
424 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000425}
426
Daniel Dunbarf492c922009-09-10 22:59:51 +0000427/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000428/// CPU.
429//
430// FIXME: This is redundant with -mcpu, why does LLVM use this.
431// FIXME: tblgen this, or kill it!
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000432static const char *getLLVMArchSuffixForARM(StringRef CPU) {
Chad Rosier9ac84512011-10-07 17:48:56 +0000433 return llvm::StringSwitch<const char *>(CPU)
434 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
435 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
436 .Cases("arm920", "arm920t", "arm922t", "v4t")
437 .Cases("arm940t", "ep9312","v4t")
438 .Cases("arm10tdmi", "arm1020t", "v5")
439 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
440 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
441 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
442 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
443 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
444 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
445 .Cases("cortex-a8", "cortex-a9", "v7")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000446 .Case("cortex-m3", "v7m")
Jim Grosbach903e63f2012-03-29 19:53:34 +0000447 .Case("cortex-m4", "v7m")
Bob Wilson7f05ca32012-03-21 17:19:12 +0000448 .Case("cortex-m0", "v6m")
Chad Rosier9ac84512011-10-07 17:48:56 +0000449 .Default("");
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +0000450}
451
Benjamin Kramer09811c72012-06-26 22:20:06 +0000452/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
453//
454// FIXME: tblgen this.
455static std::string getARMTargetCPU(const ArgList &Args,
456 const llvm::Triple &Triple) {
457 // FIXME: Warn on inconsistent use of -mcpu and -march.
458
459 // If we have -mcpu=, use that.
460 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
461 StringRef MCPU = A->getValue(Args);
462 // Handle -mcpu=native.
463 if (MCPU == "native")
464 return llvm::sys::getHostCPUName();
465 else
466 return MCPU;
467 }
468
469 StringRef MArch;
470 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
471 // Otherwise, if we have -march= choose the base CPU for that arch.
472 MArch = A->getValue(Args);
473 } else {
474 // Otherwise, use the Arch from the triple.
475 MArch = Triple.getArchName();
476 }
477
478 // Handle -march=native.
479 std::string NativeMArch;
480 if (MArch == "native") {
481 std::string CPU = llvm::sys::getHostCPUName();
482 if (CPU != "generic") {
483 // Translate the native cpu into the architecture. The switch below will
484 // then chose the minimum cpu for that arch.
485 NativeMArch = std::string("arm") + getLLVMArchSuffixForARM(CPU);
486 MArch = NativeMArch;
487 }
488 }
489
490 return llvm::StringSwitch<const char *>(MArch)
491 .Cases("armv2", "armv2a","arm2")
492 .Case("armv3", "arm6")
493 .Case("armv3m", "arm7m")
494 .Cases("armv4", "armv4t", "arm7tdmi")
495 .Cases("armv5", "armv5t", "arm10tdmi")
496 .Cases("armv5e", "armv5te", "arm1022e")
497 .Case("armv5tej", "arm926ej-s")
498 .Cases("armv6", "armv6k", "arm1136jf-s")
499 .Case("armv6j", "arm1136j-s")
500 .Cases("armv6z", "armv6zk", "arm1176jzf-s")
501 .Case("armv6t2", "arm1156t2-s")
502 .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
503 .Cases("armv7r", "armv7-r", "cortex-r4")
504 .Cases("armv7m", "armv7-m", "cortex-m3")
505 .Case("ep9312", "ep9312")
506 .Case("iwmmxt", "iwmmxt")
507 .Case("xscale", "xscale")
508 .Cases("armv6m", "armv6-m", "cortex-m0")
509 // If all else failed, return the most base CPU LLVM supports.
510 .Default("arm7tdmi");
511}
512
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000513// FIXME: Move to target hook.
514static bool isSignedCharDefault(const llvm::Triple &Triple) {
515 switch (Triple.getArch()) {
516 default:
517 return true;
518
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000519 case llvm::Triple::arm:
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000520 case llvm::Triple::ppc:
521 case llvm::Triple::ppc64:
Bob Wilson6524dd32011-10-14 05:03:44 +0000522 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000523 return true;
524 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000525 }
526}
527
Chad Rosiercfbfc582012-04-04 20:51:35 +0000528// Handle -mfpu=.
529//
530// FIXME: Centralize feature selection, defaulting shouldn't be also in the
531// frontend target.
532static void addFPUArgs(const Driver &D, const Arg *A, const ArgList &Args,
533 ArgStringList &CmdArgs) {
534 StringRef FPU = A->getValue(Args);
535
536 // Set the target features based on the FPU.
537 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
538 // Disable any default FPU support.
539 CmdArgs.push_back("-target-feature");
540 CmdArgs.push_back("-vfp2");
541 CmdArgs.push_back("-target-feature");
542 CmdArgs.push_back("-vfp3");
543 CmdArgs.push_back("-target-feature");
544 CmdArgs.push_back("-neon");
545 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
546 CmdArgs.push_back("-target-feature");
547 CmdArgs.push_back("+vfp3");
548 CmdArgs.push_back("-target-feature");
549 CmdArgs.push_back("+d16");
550 CmdArgs.push_back("-target-feature");
551 CmdArgs.push_back("-neon");
552 } else if (FPU == "vfp") {
553 CmdArgs.push_back("-target-feature");
554 CmdArgs.push_back("+vfp2");
555 CmdArgs.push_back("-target-feature");
556 CmdArgs.push_back("-neon");
557 } else if (FPU == "vfp3" || FPU == "vfpv3") {
558 CmdArgs.push_back("-target-feature");
559 CmdArgs.push_back("+vfp3");
560 CmdArgs.push_back("-target-feature");
561 CmdArgs.push_back("-neon");
562 } else if (FPU == "neon") {
563 CmdArgs.push_back("-target-feature");
564 CmdArgs.push_back("+neon");
565 } else
566 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
567}
568
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000569// Handle -mfpmath=.
570static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args,
Chad Rosier45619cb2012-04-04 22:13:40 +0000571 ArgStringList &CmdArgs, StringRef CPU) {
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000572 StringRef FPMath = A->getValue(Args);
573
574 // Set the target features based on the FPMath.
575 if (FPMath == "neon") {
576 CmdArgs.push_back("-target-feature");
577 CmdArgs.push_back("+neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000578
579 if (CPU != "cortex-a8" && CPU != "cortex-a9" && CPU != "cortex-a9-mp")
580 D.Diag(diag::err_drv_invalid_feature) << "-mfpmath=neon" << CPU;
581
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000582 } else if (FPMath == "vfp" || FPMath == "vfp2" || FPMath == "vfp3" ||
583 FPMath == "vfp4") {
584 CmdArgs.push_back("-target-feature");
585 CmdArgs.push_back("-neonfp");
Chad Rosier45619cb2012-04-04 22:13:40 +0000586
587 // FIXME: Add warnings when disabling a feature not present for a given CPU.
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000588 } else
589 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
590}
591
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000592// Select the float ABI as determined by -msoft-float, -mhard-float, and
593// -mfloat-abi=.
594static StringRef getARMFloatABI(const Driver &D,
595 const ArgList &Args,
596 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000597 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000598 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ)) {
601 if (A->getOption().matches(options::OPT_msoft_float))
602 FloatABI = "soft";
603 else if (A->getOption().matches(options::OPT_mhard_float))
604 FloatABI = "hard";
605 else {
606 FloatABI = A->getValue(Args);
607 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 << A->getAsString(Args);
610 FloatABI = "soft";
611 }
612 }
613 }
614
615 // If unspecified, choose the default based on the platform.
616 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000617 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000618 case llvm::Triple::Darwin:
619 case llvm::Triple::MacOSX:
620 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000621 // Darwin defaults to "softfp" for v6 and v7.
622 //
623 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000624 std::string ArchName =
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000625 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000626 if (StringRef(ArchName).startswith("v6") ||
627 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 FloatABI = "softfp";
629 else
630 FloatABI = "soft";
631 break;
632 }
633
634 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000635 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000636 case llvm::Triple::GNUEABIHF:
637 FloatABI = "hard";
638 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000639 case llvm::Triple::GNUEABI:
640 FloatABI = "softfp";
641 break;
642 case llvm::Triple::EABI:
643 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
644 FloatABI = "softfp";
645 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000646 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000647 std::string ArchName =
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000648 getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000649 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000650 FloatABI = "softfp";
651 else
652 FloatABI = "soft";
653 break;
654 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000655 default:
656 // Assume "soft", but warn the user we are guessing.
657 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000658 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000659 break;
660 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000661 }
662 }
663
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000664 return FloatABI;
665}
666
667
668void Clang::AddARMTargetArgs(const ArgList &Args,
669 ArgStringList &CmdArgs,
670 bool KernelOrKext) const {
671 const Driver &D = getToolChain().getDriver();
672 llvm::Triple Triple = getToolChain().getTriple();
673
674 // Select the ABI to use.
675 //
676 // FIXME: Support -meabi.
677 const char *ABIName = 0;
678 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
679 ABIName = A->getValue(Args);
680 } else {
681 // Select the default based on the platform.
682 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000683 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000684 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000685 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000686 ABIName = "aapcs-linux";
687 break;
688 case llvm::Triple::EABI:
689 ABIName = "aapcs";
690 break;
691 default:
692 ABIName = "apcs-gnu";
693 }
694 }
695 CmdArgs.push_back("-target-abi");
696 CmdArgs.push_back(ABIName);
697
698 // Set the CPU based on -march= and -mcpu=.
699 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +0000700 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000701
702 // Determine floating point ABI from the options & target defaults.
703 StringRef FloatABI = getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000704 if (FloatABI == "soft") {
705 // Floating point operations and argument passing are soft.
706 //
707 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000708 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000709 CmdArgs.push_back("-mfloat-abi");
710 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000711 } else if (FloatABI == "softfp") {
712 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000713 CmdArgs.push_back("-mfloat-abi");
714 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000715 } else {
716 // Floating point operations and argument passing are hard.
717 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000718 CmdArgs.push_back("-mfloat-abi");
719 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000720 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000721
722 // Set appropriate target features for floating point mode.
723 //
724 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
725 // yet (it uses the -mfloat-abi and -msoft-float options above), and it is
726 // stripped out by the ARM target.
727
728 // Use software floating point operations?
729 if (FloatABI == "soft") {
730 CmdArgs.push_back("-target-feature");
731 CmdArgs.push_back("+soft-float");
732 }
733
734 // Use software floating point argument passing?
735 if (FloatABI != "hard") {
736 CmdArgs.push_back("-target-feature");
737 CmdArgs.push_back("+soft-float-abi");
738 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +0000739
740 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +0000741 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +0000742 addFPUArgs(D, A, Args, CmdArgs);
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000743
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000744 // Honor -mfpmath=.
745 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +0000746 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Chad Rosier1f0e52e2012-04-04 20:39:32 +0000747
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000748 // Setting -msoft-float effectively disables NEON because of the GCC
749 // implementation, although the same isn't true of VFP or VFP3.
750 if (FloatABI == "soft") {
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000751 CmdArgs.push_back("-target-feature");
752 CmdArgs.push_back("-neon");
753 }
754
755 // Kernel code has more strict alignment requirements.
756 if (KernelOrKext) {
Daniel Dunbar12100e22011-03-22 16:48:17 +0000757 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000758 CmdArgs.push_back("-arm-long-calls");
759
Daniel Dunbar12100e22011-03-22 16:48:17 +0000760 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000761 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000762
763 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000764 CmdArgs.push_back("-backend-option");
765 CmdArgs.push_back("-arm-darwin-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000766 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000767
768 // Setting -mno-global-merge disables the codegen global merge pass. Setting
769 // -mglobal-merge has no effect as the pass is enabled by default.
770 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
771 options::OPT_mno_global_merge)) {
772 if (A->getOption().matches(options::OPT_mno_global_merge))
773 CmdArgs.push_back("-mno-global-merge");
774 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000775
Chad Rosierc14ded72012-05-16 21:19:55 +0000776 if (Args.hasArg(options::OPT_mno_implicit_float))
Chad Rosierf1985d22012-05-16 20:40:09 +0000777 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000778}
779
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000780// Get CPU and ABI names. They are not independent
781// so we have to calculate them together.
782static void getMipsCPUAndABI(const ArgList &Args,
783 const ToolChain &TC,
784 StringRef &CPUName,
785 StringRef &ABIName) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000786 const char *DefMips32CPU = "mips32";
787 const char *DefMips64CPU = "mips64";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000788
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000789 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
790 options::OPT_mcpu_EQ))
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000791 CPUName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000792
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000793 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
Eric Christopher0b26a612010-03-02 02:41:08 +0000794 ABIName = A->getValue(Args);
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000795
796 // Setup default CPU and ABI names.
797 if (CPUName.empty() && ABIName.empty()) {
798 switch (TC.getTriple().getArch()) {
799 default:
800 llvm_unreachable("Unexpected triple arch name");
801 case llvm::Triple::mips:
802 case llvm::Triple::mipsel:
803 CPUName = DefMips32CPU;
804 break;
805 case llvm::Triple::mips64:
806 case llvm::Triple::mips64el:
807 CPUName = DefMips64CPU;
808 break;
809 }
810 }
811
812 if (!ABIName.empty()) {
813 // Deduce CPU name from ABI name.
814 CPUName = llvm::StringSwitch<const char *>(ABIName)
815 .Cases("o32", "eabi", DefMips32CPU)
816 .Cases("n32", "n64", DefMips64CPU)
817 .Default("");
818 }
819 else if (!CPUName.empty()) {
820 // Deduce ABI name from CPU name.
821 ABIName = llvm::StringSwitch<const char *>(CPUName)
822 .Cases("mips32", "mips32r2", "o32")
823 .Cases("mips64", "mips64r2", "n64")
824 .Default("");
825 }
826
827 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000828}
829
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000830// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
831// and -mfloat-abi=.
832static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000833 // Select the float ABI as determined by -msoft-float, -mhard-float,
834 // and -mfloat-abi=.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000835 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000836 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000837 options::OPT_mhard_float,
838 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000839 if (A->getOption().matches(options::OPT_msoft_float))
840 FloatABI = "soft";
841 else if (A->getOption().matches(options::OPT_mhard_float))
842 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000843 else {
844 FloatABI = A->getValue(Args);
845 if (FloatABI != "soft" && FloatABI != "single" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000846 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000847 FloatABI = "hard";
848 }
849 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000850 }
851
852 // If unspecified, choose the default based on the platform.
853 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000854 // Assume "hard", because it's a default value used by gcc.
855 // When we start to recognize specific target MIPS processors,
856 // we will be able to select the default more correctly.
857 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +0000858 }
859
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000860 return FloatABI;
861}
862
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000863static void AddTargetFeature(const ArgList &Args,
864 ArgStringList &CmdArgs,
865 OptSpecifier OnOpt,
866 OptSpecifier OffOpt,
867 StringRef FeatureName) {
868 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
869 CmdArgs.push_back("-target-feature");
870 if (A->getOption().matches(OnOpt))
871 CmdArgs.push_back(Args.MakeArgString("+" + FeatureName));
872 else
873 CmdArgs.push_back(Args.MakeArgString("-" + FeatureName));
874 }
875}
876
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000877void Clang::AddMIPSTargetArgs(const ArgList &Args,
878 ArgStringList &CmdArgs) const {
879 const Driver &D = getToolChain().getDriver();
880 StringRef CPUName;
881 StringRef ABIName;
882 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
883
884 CmdArgs.push_back("-target-cpu");
885 CmdArgs.push_back(CPUName.data());
886
887 CmdArgs.push_back("-target-abi");
888 CmdArgs.push_back(ABIName.data());
889
890 StringRef FloatABI = getMipsFloatABI(D, Args);
891
Eric Christopher0b26a612010-03-02 02:41:08 +0000892 if (FloatABI == "soft") {
893 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +0000894 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000895 CmdArgs.push_back("-mfloat-abi");
896 CmdArgs.push_back("soft");
897
898 // FIXME: Note, this is a hack. We need to pass the selected float
899 // mode to the MipsTargetInfoBase to define appropriate macros there.
900 // Now it is the only method.
901 CmdArgs.push_back("-target-feature");
902 CmdArgs.push_back("+soft-float");
903 }
904 else if (FloatABI == "single") {
905 // Restrict the use of hardware floating-point
906 // instructions to 32-bit operations.
907 CmdArgs.push_back("-target-feature");
908 CmdArgs.push_back("+single-float");
909 }
910 else {
911 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +0000912 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000913 CmdArgs.push_back("-mfloat-abi");
914 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +0000915 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +0000916
Simon Atanasyan9b1932d2012-07-05 18:51:43 +0000917 AddTargetFeature(Args, CmdArgs,
918 options::OPT_mips16, options::OPT_mno_mips16,
919 "mips16");
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +0000920 AddTargetFeature(Args, CmdArgs,
921 options::OPT_mdsp, options::OPT_mno_dsp,
922 "dsp");
923 AddTargetFeature(Args, CmdArgs,
924 options::OPT_mdspr2, options::OPT_mno_dspr2,
925 "dspr2");
Simon Atanasyanec4b1c12012-08-27 20:55:56 +0000926
927 if (Arg *A = Args.getLastArg(options::OPT_G)) {
928 StringRef v = A->getValue(Args);
929 CmdArgs.push_back("-mllvm");
930 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
931 A->claim();
932 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000933}
934
Hal Finkel8eb59282012-06-11 22:35:19 +0000935/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
936static std::string getPPCTargetCPU(const ArgList &Args) {
937 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
938 StringRef CPUName = A->getValue(Args);
939
940 if (CPUName == "native") {
941 std::string CPU = llvm::sys::getHostCPUName();
942 if (!CPU.empty() && CPU != "generic")
943 return CPU;
944 else
945 return "";
946 }
947
948 return llvm::StringSwitch<const char *>(CPUName)
949 .Case("common", "generic")
950 .Case("440", "440")
951 .Case("440fp", "440")
952 .Case("450", "450")
953 .Case("601", "601")
954 .Case("602", "602")
955 .Case("603", "603")
956 .Case("603e", "603e")
957 .Case("603ev", "603ev")
958 .Case("604", "604")
959 .Case("604e", "604e")
960 .Case("620", "620")
961 .Case("G3", "g3")
962 .Case("7400", "7400")
963 .Case("G4", "g4")
964 .Case("7450", "7450")
965 .Case("G4+", "g4+")
966 .Case("750", "750")
967 .Case("970", "970")
968 .Case("G5", "g5")
969 .Case("a2", "a2")
970 .Case("power6", "pwr6")
971 .Case("power7", "pwr7")
972 .Case("powerpc", "ppc")
973 .Case("powerpc64", "ppc64")
974 .Default("");
975 }
976
977 return "";
978}
979
980void Clang::AddPPCTargetArgs(const ArgList &Args,
981 ArgStringList &CmdArgs) const {
982 std::string TargetCPUName = getPPCTargetCPU(Args);
983
984 // LLVM may default to generating code for the native CPU,
985 // but, like gcc, we default to a more generic option for
986 // each architecture. (except on Darwin)
987 llvm::Triple Triple = getToolChain().getTriple();
988 if (TargetCPUName.empty() && !Triple.isOSDarwin()) {
989 if (Triple.getArch() == llvm::Triple::ppc64)
990 TargetCPUName = "ppc64";
991 else
992 TargetCPUName = "ppc";
993 }
994
995 if (!TargetCPUName.empty()) {
996 CmdArgs.push_back("-target-cpu");
997 CmdArgs.push_back(Args.MakeArgString(TargetCPUName.c_str()));
998 }
999}
1000
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001001void Clang::AddSparcTargetArgs(const ArgList &Args,
1002 ArgStringList &CmdArgs) const {
1003 const Driver &D = getToolChain().getDriver();
1004
1005 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001006 CmdArgs.push_back("-target-cpu");
Benjamin Kramereed4f2a2011-12-26 14:18:37 +00001007 CmdArgs.push_back(A->getValue(Args));
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001008 }
1009
1010 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001011 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001012 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1013 options::OPT_mhard_float)) {
1014 if (A->getOption().matches(options::OPT_msoft_float))
1015 FloatABI = "soft";
1016 else if (A->getOption().matches(options::OPT_mhard_float))
1017 FloatABI = "hard";
1018 }
1019
1020 // If unspecified, choose the default based on the platform.
1021 if (FloatABI.empty()) {
1022 switch (getToolChain().getTriple().getOS()) {
1023 default:
1024 // Assume "soft", but warn the user we are guessing.
1025 FloatABI = "soft";
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001026 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001027 break;
1028 }
1029 }
1030
1031 if (FloatABI == "soft") {
1032 // Floating point operations and argument passing are soft.
1033 //
1034 // FIXME: This changes CPP defines, we need -target-soft-float.
1035 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001036 CmdArgs.push_back("-target-feature");
1037 CmdArgs.push_back("+soft-float");
1038 } else {
1039 assert(FloatABI == "hard" && "Invalid float abi!");
1040 CmdArgs.push_back("-mhard-float");
1041 }
1042}
1043
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001044void Clang::AddX86TargetArgs(const ArgList &Args,
1045 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001046 if (!Args.hasFlag(options::OPT_mred_zone,
1047 options::OPT_mno_red_zone,
1048 true) ||
1049 Args.hasArg(options::OPT_mkernel) ||
1050 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001051 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001052
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001053 if (Args.hasFlag(options::OPT_msoft_float,
1054 options::OPT_mno_soft_float,
1055 false))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001056 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001057
Daniel Dunbare13ada62009-11-14 22:04:54 +00001058 const char *CPUName = 0;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001059 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001060 if (StringRef(A->getValue(Args)) == "native") {
Daniel Dunbare13ada62009-11-14 22:04:54 +00001061 // FIXME: Reject attempts to use -march=native unless the target matches
1062 // the host.
1063 //
1064 // FIXME: We should also incorporate the detected target features for use
1065 // with -native.
1066 std::string CPU = llvm::sys::getHostCPUName();
Bob Wilsone78227b2012-05-09 17:53:10 +00001067 if (!CPU.empty() && CPU != "generic")
Daniel Dunbare13ada62009-11-14 22:04:54 +00001068 CPUName = Args.MakeArgString(CPU);
1069 } else
1070 CPUName = A->getValue(Args);
1071 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001072
Daniel Dunbare13ada62009-11-14 22:04:54 +00001073 // Select the default CPU if none was given (or detection failed).
1074 if (!CPUName) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001075 // FIXME: Need target hooks.
Bob Wilson6524dd32011-10-14 05:03:44 +00001076 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001077 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001078 CPUName = "core2";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001079 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001080 CPUName = "yonah";
Chris Lattnerb986aba2010-04-11 19:29:39 +00001081 } else if (getToolChain().getOS().startswith("haiku")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001082 if (getToolChain().getArch() == llvm::Triple::x86_64)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001083 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001084 else if (getToolChain().getArch() == llvm::Triple::x86)
Chris Lattnerb986aba2010-04-11 19:29:39 +00001085 CPUName = "i586";
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001086 } else if (getToolChain().getOS().startswith("openbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001087 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001088 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001089 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarea3813f2010-08-01 23:13:54 +00001090 CPUName = "i486";
Eli Friedman9fa28852012-08-08 23:57:20 +00001091 } else if (getToolChain().getOS().startswith("bitrig")) {
1092 if (getToolChain().getArch() == llvm::Triple::x86_64)
1093 CPUName = "x86-64";
1094 else if (getToolChain().getArch() == llvm::Triple::x86)
1095 CPUName = "i686";
Roman Divacky432f10d2011-03-01 18:11:37 +00001096 } else if (getToolChain().getOS().startswith("freebsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001097 if (getToolChain().getArch() == llvm::Triple::x86_64)
Roman Divacky432f10d2011-03-01 18:11:37 +00001098 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001099 else if (getToolChain().getArch() == llvm::Triple::x86)
Roman Divacky432f10d2011-03-01 18:11:37 +00001100 CPUName = "i486";
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001101 } else if (getToolChain().getOS().startswith("netbsd")) {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001102 if (getToolChain().getArch() == llvm::Triple::x86_64)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001103 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001104 else if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00001105 CPUName = "i486";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001106 } else {
Daniel Dunbar116b3052011-05-31 15:58:55 +00001107 if (getToolChain().getArch() == llvm::Triple::x86_64)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001108 CPUName = "x86-64";
Daniel Dunbar116b3052011-05-31 15:58:55 +00001109 else if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbare13ada62009-11-14 22:04:54 +00001110 CPUName = "pentium4";
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001111 }
1112 }
1113
Daniel Dunbare13ada62009-11-14 22:04:54 +00001114 if (CPUName) {
Daniel Dunbara7d02312009-12-18 06:30:12 +00001115 CmdArgs.push_back("-target-cpu");
Daniel Dunbare13ada62009-11-14 22:04:54 +00001116 CmdArgs.push_back(CPUName);
1117 }
1118
Eli Friedmanad811f02011-07-02 00:34:19 +00001119 // The required algorithm here is slightly strange: the options are applied
1120 // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
1121 // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
1122 // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
1123 // former correctly, but not the latter; handle directly-overridden
1124 // attributes here.
1125 llvm::StringMap<unsigned> PrevFeature;
1126 std::vector<const char*> Features;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001127 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1128 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001129 StringRef Name = (*it)->getOption().getName();
Daniel Dunbara442fd52010-06-11 22:00:13 +00001130 (*it)->claim();
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001131
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001132 // Skip over "-m".
1133 assert(Name.startswith("-m") && "Invalid feature name.");
1134 Name = Name.substr(2);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001135
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00001136 bool IsNegative = Name.startswith("no-");
1137 if (IsNegative)
1138 Name = Name.substr(3);
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001139
Eli Friedmanad811f02011-07-02 00:34:19 +00001140 unsigned& Prev = PrevFeature[Name];
1141 if (Prev)
1142 Features[Prev - 1] = 0;
1143 Prev = Features.size() + 1;
1144 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1145 }
1146 for (unsigned i = 0; i < Features.size(); i++) {
1147 if (Features[i]) {
1148 CmdArgs.push_back("-target-feature");
1149 CmdArgs.push_back(Features[i]);
1150 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001151 }
1152}
1153
Tony Linthicum76329bf2011-12-12 21:14:55 +00001154static Arg* getLastHexagonArchArg (const ArgList &Args)
1155{
1156 Arg * A = NULL;
1157
Sebastian Pop86500282012-01-13 20:37:10 +00001158 for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
1159 it != ie; ++it) {
1160 if ((*it)->getOption().matches(options::OPT_march_EQ) ||
Tony Linthicum76329bf2011-12-12 21:14:55 +00001161 (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
1162 A = *it;
1163 A->claim();
1164 }
Sebastian Pop86500282012-01-13 20:37:10 +00001165 else if ((*it)->getOption().matches(options::OPT_m_Joined)){
1166 StringRef Value = (*it)->getValue(Args,0);
1167 if (Value.startswith("v")) {
1168 A = *it;
1169 A->claim();
1170 }
1171 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001172 }
1173 return A;
1174}
1175
Sebastian Pop86500282012-01-13 20:37:10 +00001176static StringRef getHexagonTargetCPU(const ArgList &Args)
Tony Linthicum76329bf2011-12-12 21:14:55 +00001177{
1178 Arg *A;
1179 llvm::StringRef WhichHexagon;
1180
Sebastian Pop86500282012-01-13 20:37:10 +00001181 // Select the default CPU (v4) if none was given or detection failed.
Tony Linthicum76329bf2011-12-12 21:14:55 +00001182 if ((A = getLastHexagonArchArg (Args))) {
Sebastian Pop86500282012-01-13 20:37:10 +00001183 WhichHexagon = A->getValue(Args);
1184 if (WhichHexagon == "")
1185 return "v4";
1186 else
1187 return WhichHexagon;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001188 }
Sebastian Pop86500282012-01-13 20:37:10 +00001189 else
1190 return "v4";
Tony Linthicum76329bf2011-12-12 21:14:55 +00001191}
1192
1193void Clang::AddHexagonTargetArgs(const ArgList &Args,
1194 ArgStringList &CmdArgs) const {
1195 llvm::Triple Triple = getToolChain().getTriple();
1196
1197 CmdArgs.push_back("-target-cpu");
Sebastian Pop86500282012-01-13 20:37:10 +00001198 CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001199 CmdArgs.push_back("-fno-signed-char");
1200 CmdArgs.push_back("-nobuiltininc");
1201
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001202 if (Args.hasArg(options::OPT_mqdsp6_compat))
Tony Linthicum76329bf2011-12-12 21:14:55 +00001203 CmdArgs.push_back("-mqdsp6-compat");
1204
1205 if (Arg *A = Args.getLastArg(options::OPT_G,
1206 options::OPT_msmall_data_threshold_EQ)) {
1207 std::string SmallDataThreshold="-small-data-threshold=";
1208 SmallDataThreshold += A->getValue(Args);
1209 CmdArgs.push_back ("-mllvm");
1210 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
1211 A->claim();
1212 }
1213
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001214 if (!Args.hasArg(options::OPT_fno_short_enums))
1215 CmdArgs.push_back("-fshort-enums");
1216 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1217 CmdArgs.push_back ("-mllvm");
1218 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1219 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001220 CmdArgs.push_back ("-mllvm");
1221 CmdArgs.push_back ("-machine-sink-split=0");
1222}
1223
Eric Christopher84fbdb42011-08-19 00:30:14 +00001224static bool
John McCall5fb5df92012-06-20 06:18:46 +00001225shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001226 const llvm::Triple &Triple) {
1227 // We use the zero-cost exception tables for Objective-C if the non-fragile
1228 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1229 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001230 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001231 return true;
1232
Bob Wilson6524dd32011-10-14 05:03:44 +00001233 if (!Triple.isOSDarwin())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001234 return false;
1235
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001236 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001237 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001238 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001239}
1240
Anders Carlssone96ab552011-02-28 02:27:16 +00001241/// addExceptionArgs - Adds exception related arguments to the driver command
1242/// arguments. There's a master flag, -fexceptions and also language specific
1243/// flags to enable/disable C++ and Objective-C exceptions.
1244/// This makes it possible to for example disable C++ exceptions but enable
1245/// Objective-C exceptions.
1246static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1247 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001248 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001249 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001250 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001251 if (KernelOrKext) {
1252 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1253 // arguments now to avoid warnings about unused arguments.
1254 Args.ClaimAllArgs(options::OPT_fexceptions);
1255 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1256 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1257 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1258 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1259 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001260 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001261 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001262
1263 // Exceptions are enabled by default.
1264 bool ExceptionsEnabled = true;
1265
1266 // This keeps track of whether exceptions were explicitly turned on or off.
1267 bool DidHaveExplicitExceptionFlag = false;
1268
Rafael Espindola00a66572009-10-01 13:33:33 +00001269 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1270 options::OPT_fno_exceptions)) {
1271 if (A->getOption().matches(options::OPT_fexceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001272 ExceptionsEnabled = true;
Eric Christopher84fbdb42011-08-19 00:30:14 +00001273 else
Anders Carlssone96ab552011-02-28 02:27:16 +00001274 ExceptionsEnabled = false;
1275
1276 DidHaveExplicitExceptionFlag = true;
Rafael Espindola00a66572009-10-01 13:33:33 +00001277 }
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001278
Anders Carlssone96ab552011-02-28 02:27:16 +00001279 bool ShouldUseExceptionTables = false;
Fariborz Jahaniane4b21ab2009-10-01 20:30:46 +00001280
Anders Carlssone96ab552011-02-28 02:27:16 +00001281 // Exception tables and cleanups can be enabled with -fexceptions even if the
1282 // language itself doesn't support exceptions.
1283 if (ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1284 ShouldUseExceptionTables = true;
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001285
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001286 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1287 // is not necessarily sensible, but follows GCC.
1288 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001289 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001290 options::OPT_fno_objc_exceptions,
1291 true)) {
1292 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001293
Eric Christopher84fbdb42011-08-19 00:30:14 +00001294 ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001295 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001296 }
1297
1298 if (types::isCXX(InputType)) {
1299 bool CXXExceptionsEnabled = ExceptionsEnabled;
1300
Eric Christopher84fbdb42011-08-19 00:30:14 +00001301 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1302 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001303 options::OPT_fexceptions,
1304 options::OPT_fno_exceptions)) {
1305 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1306 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001307 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001308 CXXExceptionsEnabled = false;
1309 }
1310
1311 if (CXXExceptionsEnabled) {
1312 CmdArgs.push_back("-fcxx-exceptions");
1313
1314 ShouldUseExceptionTables = true;
1315 }
1316 }
1317
1318 if (ShouldUseExceptionTables)
1319 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001320}
1321
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001322static bool ShouldDisableCFI(const ArgList &Args,
1323 const ToolChain &TC) {
Rafael Espindolac41db922012-03-08 14:39:55 +00001324 bool Default = true;
Bob Wilson6524dd32011-10-14 05:03:44 +00001325 if (TC.getTriple().isOSDarwin()) {
Rafael Espindolaf934f982011-05-17 16:26:17 +00001326 // The native darwin assembler doesn't support cfi directives, so
Rafael Espindola35ab91c2011-05-17 19:06:58 +00001327 // we disable them if we think the .s file will be passed to it.
Rafael Espindolac41db922012-03-08 14:39:55 +00001328 Default = Args.hasFlag(options::OPT_integrated_as,
1329 options::OPT_no_integrated_as,
1330 TC.IsIntegratedAssemblerDefault());
Rafael Espindolaf934f982011-05-17 16:26:17 +00001331 }
Rafael Espindolac41db922012-03-08 14:39:55 +00001332 return !Args.hasFlag(options::OPT_fdwarf2_cfi_asm,
1333 options::OPT_fno_dwarf2_cfi_asm,
1334 Default);
Rafael Espindola4cfa7972011-05-02 17:43:32 +00001335}
1336
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001337static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1338 const ToolChain &TC) {
1339 bool IsIADefault = TC.IsIntegratedAssemblerDefault();
1340 bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
1341 options::OPT_no_integrated_as,
1342 IsIADefault);
1343 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1344 options::OPT_fno_dwarf_directory_asm,
1345 UseIntegratedAs);
1346 return !UseDwarfDirectory;
1347}
1348
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001349/// \brief Check whether the given input tree contains any compilation actions.
1350static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001351 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001352 return true;
1353
1354 for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
1355 if (ContainsCompileAction(*it))
1356 return true;
1357
1358 return false;
1359}
1360
1361/// \brief Check if -relax-all should be passed to the internal assembler.
1362/// This is done by default when compiling non-assembler source with -O0.
1363static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1364 bool RelaxDefault = true;
1365
1366 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1367 RelaxDefault = A->getOption().matches(options::OPT_O0);
1368
1369 if (RelaxDefault) {
1370 RelaxDefault = false;
1371 for (ActionList::const_iterator it = C.getActions().begin(),
1372 ie = C.getActions().end(); it != ie; ++it) {
1373 if (ContainsCompileAction(*it)) {
1374 RelaxDefault = true;
1375 break;
1376 }
1377 }
1378 }
1379
1380 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1381 RelaxDefault);
1382}
1383
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001384/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1385/// This needs to be called before we add the C run-time (malloc, etc).
1386static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args,
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00001387 ArgStringList &CmdArgs) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001388 if (!Args.hasFlag(options::OPT_faddress_sanitizer,
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001389 options::OPT_fno_address_sanitizer, false))
1390 return;
Logan Chienc6fd8202012-09-02 09:30:11 +00001391 if(TC.getTriple().getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001392 if (!Args.hasArg(options::OPT_shared)) {
Evgeniy Stepanovea155f02012-06-04 11:15:05 +00001393 if (!Args.hasArg(options::OPT_pie))
1394 TC.getDriver().Diag(diag::err_drv_asan_android_requires_pie);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001395 // For an executable, we add a .preinit_array stub.
1396 CmdArgs.push_back("-u");
1397 CmdArgs.push_back("__asan_preinit");
1398 CmdArgs.push_back("-lasan");
1399 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001400
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001401 CmdArgs.push_back("-lasan_preload");
1402 CmdArgs.push_back("-ldl");
1403 } else {
1404 if (!Args.hasArg(options::OPT_shared)) {
1405 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1406 // resource directory.
1407 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1408 llvm::sys::path::append(LibAsan, "lib", "linux",
1409 (Twine("libclang_rt.asan-") +
1410 TC.getArchName() + ".a"));
1411 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1412 CmdArgs.push_back("-lpthread");
1413 CmdArgs.push_back("-ldl");
1414 CmdArgs.push_back("-export-dynamic");
1415 }
1416 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001417}
1418
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001419/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1420/// This needs to be called before we add the C run-time (malloc, etc).
1421static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1422 ArgStringList &CmdArgs) {
1423 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1424 options::OPT_fno_thread_sanitizer, false))
1425 return;
1426 if (!Args.hasArg(options::OPT_shared)) {
1427 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1428 // resource directory.
1429 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1430 llvm::sys::path::append(LibTsan, "lib", "linux",
1431 (Twine("libclang_rt.tsan-") +
1432 TC.getArchName() + ".a"));
1433 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1434 CmdArgs.push_back("-lpthread");
1435 CmdArgs.push_back("-ldl");
1436 CmdArgs.push_back("-export-dynamic");
1437 }
1438}
1439
Rafael Espindola224dd632011-12-14 21:02:23 +00001440static bool shouldUseFramePointer(const ArgList &Args,
1441 const llvm::Triple &Triple) {
1442 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1443 options::OPT_fomit_frame_pointer))
1444 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1445
Rafael Espindola00b29182011-12-14 21:50:24 +00001446 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001447 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1448 Triple.getArch() == llvm::Triple::x86) &&
1449 Triple.getOS() == llvm::Triple::Linux) {
1450 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1451 if (!A->getOption().matches(options::OPT_O0))
1452 return false;
1453 }
1454
1455 return true;
1456}
1457
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001458void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001459 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001460 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001461 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001462 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001463 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1464 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001465 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001466 ArgStringList CmdArgs;
1467
Daniel Dunbare521a892009-03-31 20:53:55 +00001468 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1469
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001470 // Invoke ourselves in -cc1 mode.
1471 //
1472 // FIXME: Implement custom jobs for internal actions.
1473 CmdArgs.push_back("-cc1");
1474
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001475 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001476 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001477 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001478 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001479
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001480 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001481 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001482
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001483 if (isa<AnalyzeJobAction>(JA)) {
1484 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1485 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001486 } else if (isa<MigrateJobAction>(JA)) {
1487 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001488 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001489 if (Output.getType() == types::TY_Dependencies)
1490 CmdArgs.push_back("-Eonly");
1491 else
1492 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001493 } else if (isa<AssembleJobAction>(JA)) {
1494 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001495
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001496 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001497 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001498
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001499 // When using an integrated assembler, translate -Wa, and -Xassembler
1500 // options.
1501 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1502 options::OPT_Xassembler),
1503 ie = Args.filtered_end(); it != ie; ++it) {
1504 const Arg *A = *it;
1505 A->claim();
1506
1507 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001508 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001509
1510 if (Value == "-force_cpusubtype_ALL") {
1511 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001512 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001513 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001514 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001515 CmdArgs.push_back("-mllvm");
1516 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001517 } else if (Value == "--noexecstack") {
1518 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001519 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001520 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001521 << A->getOption().getName() << Value;
1522 }
1523 }
1524 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001525
1526 // Also ignore explicit -force_cpusubtype_ALL option.
1527 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001528 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001529 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001530 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001531
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001532 if (JA.getType() == types::TY_Nothing)
1533 CmdArgs.push_back("-fsyntax-only");
1534 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001535 CmdArgs.push_back("-emit-pch");
1536 else
1537 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001538 } else {
1539 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001540
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001541 if (JA.getType() == types::TY_Nothing) {
1542 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001543 } else if (JA.getType() == types::TY_LLVM_IR ||
1544 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001545 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001546 } else if (JA.getType() == types::TY_LLVM_BC ||
1547 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001548 CmdArgs.push_back("-emit-llvm-bc");
1549 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001550 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001551 } else if (JA.getType() == types::TY_AST) {
1552 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001553 } else if (JA.getType() == types::TY_RewrittenObjC) {
1554 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001555 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001556 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1557 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001558 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001559 } else {
1560 assert(JA.getType() == types::TY_PP_Asm &&
1561 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001562 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001563 }
1564
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001565 // The make clang go fast button.
1566 CmdArgs.push_back("-disable-free");
1567
John McCallbb79b5f2010-02-13 03:50:24 +00001568 // Disable the verification pass in -asserts builds.
1569#ifdef NDEBUG
1570 CmdArgs.push_back("-disable-llvm-verifier");
1571#endif
1572
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001573 // Set the main file name, so that debug info works even with
1574 // -save-temps.
1575 CmdArgs.push_back("-main-file-name");
1576 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1577
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001578 // Some flags which affect the language (via preprocessor
1579 // defines). See darwin::CC1::AddCPPArgs.
1580 if (Args.hasArg(options::OPT_static))
1581 CmdArgs.push_back("-static-define");
1582
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001583 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001584 // Enable region store model by default.
1585 CmdArgs.push_back("-analyzer-store=region");
1586
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001587 // Treat blocks as analysis entry points.
1588 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1589
Ted Kremenek49c79792011-03-24 00:28:47 +00001590 CmdArgs.push_back("-analyzer-eagerly-assume");
1591
Anna Zaks0af3e062012-03-08 23:16:35 +00001592 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001593
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001594 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001595 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001596 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001597
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001598 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1599 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001600
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001601 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001602 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001603
1604 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001605
1606 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1612 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001613 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001614
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001615 // Set the output format. The default is plist, for (lame) historical
1616 // reasons.
1617 CmdArgs.push_back("-analyzer-output");
1618 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1619 CmdArgs.push_back(A->getValue(Args));
1620 else
1621 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001622
Ted Kremenekfe449a22010-03-22 22:32:05 +00001623 // Disable the presentation of standard compiler warnings when
1624 // using --analyze. We only want to show static analyzer diagnostics
1625 // or frontend errors.
1626 CmdArgs.push_back("-w");
1627
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001628 // Add -Xanalyzer arguments when running as analyzer.
1629 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001630 }
1631
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001632 CheckCodeGenerationOptions(D, Args);
1633
Daniel Dunbar44e71222009-04-29 18:32:25 +00001634 // Perform argument translation for LLVM backend. This
1635 // takes some care in reconciling with llvm-gcc. The
1636 // issue is that llvm-gcc translates these options based on
1637 // the values in cc1, whereas we are processing based on
1638 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001639
Daniel Dunbar44e71222009-04-29 18:32:25 +00001640 // This comes from the default translation the driver + cc1
1641 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001642
1643 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1644 options::OPT_fpic, options::OPT_fno_pic,
1645 options::OPT_fPIE, options::OPT_fno_PIE,
1646 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001647 bool PICDisabled = false;
1648 bool PICEnabled = false;
1649 bool PICForPIE = false;
1650 if (LastPICArg) {
1651 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1652 LastPICArg->getOption().matches(options::OPT_fpie));
1653 PICEnabled = (PICForPIE ||
1654 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1655 LastPICArg->getOption().matches(options::OPT_fpic));
1656 PICDisabled = !PICEnabled;
1657 }
1658 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1659 // PIC or PIE options above, if these show up, PIC is disabled.
1660 if (Args.hasArg(options::OPT_mkernel))
1661 PICDisabled = true;
1662 if (Args.hasArg(options::OPT_static))
1663 PICDisabled = true;
1664 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1665
1666 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001667 const char *Model = getToolChain().GetForcedPicModel();
1668 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001669 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001670 Model = "dynamic-no-pic";
1671 else if (PICDisabled)
1672 Model = "static";
1673 else if (PICEnabled)
1674 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001675 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001676 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001677 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001678 StringRef ModelStr = Model ? Model : "";
1679 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001680 CmdArgs.push_back("-mrelocation-model");
1681 CmdArgs.push_back(Model);
1682 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001683
Chandler Carruthc0c04552012-04-08 16:40:35 +00001684 // Infer the __PIC__ and __PIE__ values.
1685 if (ModelStr == "pic" && PICForPIE) {
1686 CmdArgs.push_back("-pie-level");
1687 CmdArgs.push_back((LastPICArg &&
1688 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1689 "2" : "1");
1690 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001691 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001692 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1693 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1694 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001695 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001696
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001697 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1698 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001699 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001700
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001701 // LLVM Code Generator Options.
1702
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001703 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1704 CmdArgs.push_back("-mregparm");
1705 CmdArgs.push_back(A->getValue(Args));
1706 }
1707
Roman Divacky65b88cd2011-03-01 17:40:53 +00001708 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1709 CmdArgs.push_back("-mrtd");
1710
Rafael Espindola224dd632011-12-14 21:02:23 +00001711 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001712 CmdArgs.push_back("-mdisable-fp-elim");
1713 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1714 options::OPT_fno_zero_initialized_in_bss))
1715 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001716 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1717 options::OPT_fno_strict_aliasing,
1718 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001719 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001720 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1721 false))
1722 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001723 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1724 options::OPT_fno_optimize_sibling_calls))
1725 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001726
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001727 // Handle various floating point optimization flags, mapping them to the
1728 // appropriate LLVM code generation flags. The pattern for all of these is to
1729 // default off the codegen optimizations, and if any flag enables them and no
1730 // flag disables them after the flag enabling them, enable the codegen
1731 // optimization. This is complicated by several "umbrella" flags.
1732 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1733 options::OPT_ffinite_math_only,
1734 options::OPT_fno_finite_math_only,
1735 options::OPT_fhonor_infinities,
1736 options::OPT_fno_honor_infinities))
1737 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1738 A->getOption().getID() != options::OPT_fhonor_infinities)
1739 CmdArgs.push_back("-menable-no-infs");
1740 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1741 options::OPT_ffinite_math_only,
1742 options::OPT_fno_finite_math_only,
1743 options::OPT_fhonor_nans,
1744 options::OPT_fno_honor_nans))
1745 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1746 A->getOption().getID() != options::OPT_fhonor_nans)
1747 CmdArgs.push_back("-menable-no-nans");
1748
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001749 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1750 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001751 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1752 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001753 options::OPT_fno_math_errno))
1754 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1755 if (MathErrno)
1756 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001757
1758 // There are several flags which require disabling very specific
1759 // optimizations. Any of these being disabled forces us to turn off the
1760 // entire set of LLVM optimizations, so collect them through all the flag
1761 // madness.
1762 bool AssociativeMath = false;
1763 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1764 options::OPT_funsafe_math_optimizations,
1765 options::OPT_fno_unsafe_math_optimizations,
1766 options::OPT_fassociative_math,
1767 options::OPT_fno_associative_math))
1768 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1769 A->getOption().getID() != options::OPT_fno_associative_math)
1770 AssociativeMath = true;
1771 bool ReciprocalMath = false;
1772 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1773 options::OPT_funsafe_math_optimizations,
1774 options::OPT_fno_unsafe_math_optimizations,
1775 options::OPT_freciprocal_math,
1776 options::OPT_fno_reciprocal_math))
1777 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1778 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1779 ReciprocalMath = true;
1780 bool SignedZeros = true;
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_fsigned_zeros,
1785 options::OPT_fno_signed_zeros))
1786 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1787 A->getOption().getID() != options::OPT_fsigned_zeros)
1788 SignedZeros = false;
1789 bool TrappingMath = true;
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_ftrapping_math,
1794 options::OPT_fno_trapping_math))
1795 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1796 A->getOption().getID() != options::OPT_ftrapping_math)
1797 TrappingMath = false;
1798 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1799 !TrappingMath)
1800 CmdArgs.push_back("-menable-unsafe-fp-math");
1801
Lang Hamesaa53b932012-07-06 00:59:19 +00001802
1803 // Validate and pass through -fp-contract option.
1804 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1805 options::OPT_ffp_contract)) {
1806 if (A->getOption().getID() == options::OPT_ffp_contract) {
1807 StringRef Val = A->getValue(Args);
1808 if (Val == "fast" || Val == "on" || Val == "off") {
1809 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1810 } else {
1811 D.Diag(diag::err_drv_unsupported_option_argument)
1812 << A->getOption().getName() << Val;
1813 }
1814 } else { // A is OPT_ffast_math
1815 // If fast-math is set then set the fp-contract mode to fast.
1816 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1817 }
1818 }
1819
Bob Wilson6a039162012-07-19 03:52:53 +00001820 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1821 // and if we find them, tell the frontend to provide the appropriate
1822 // preprocessor macros. This is distinct from enabling any optimizations as
1823 // these options induce language changes which must survive serialization
1824 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001825 if (Args.hasArg(options::OPT_ffast_math))
1826 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001827 if (Args.hasArg(options::OPT_ffinite_math_only))
1828 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001829
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001830 // Decide whether to use verbose asm. Verbose assembly is the default on
1831 // toolchains which have the integrated assembler on by default.
1832 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1833 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001834 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001835 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001836 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001837
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001838 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1839 CmdArgs.push_back("-mdebug-pass");
1840 CmdArgs.push_back("Structure");
1841 }
1842 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1843 CmdArgs.push_back("-mdebug-pass");
1844 CmdArgs.push_back("Arguments");
1845 }
1846
John McCall8517abc2010-02-19 02:45:38 +00001847 // Enable -mconstructor-aliases except on darwin, where we have to
1848 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001849 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001850 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001851
John McCall7ef5cb32011-03-18 02:56:14 +00001852 // Darwin's kernel doesn't support guard variables; just die if we
1853 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001854 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001855 CmdArgs.push_back("-fforbid-guard-variables");
1856
Douglas Gregordbe39272011-02-01 15:15:22 +00001857 if (Args.hasArg(options::OPT_mms_bitfields)) {
1858 CmdArgs.push_back("-mms-bitfields");
1859 }
John McCall8517abc2010-02-19 02:45:38 +00001860
Daniel Dunbar306945d2009-09-16 06:17:29 +00001861 // This is a coarse approximation of what llvm-gcc actually does, both
1862 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1863 // complicated ways.
1864 bool AsynchronousUnwindTables =
1865 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1866 options::OPT_fno_asynchronous_unwind_tables,
1867 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001868 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001869 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1870 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001871 CmdArgs.push_back("-munwind-tables");
1872
Rafael Espindola66aa0452012-06-19 01:26:10 +00001873 getToolChain().addClangTargetOptions(CmdArgs);
1874
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001875 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1876 CmdArgs.push_back("-mlimit-float-precision");
1877 CmdArgs.push_back(A->getValue(Args));
1878 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001879
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001880 // FIXME: Handle -mtune=.
1881 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001882
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001883 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001884 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001885 CmdArgs.push_back(A->getValue(Args));
1886 }
1887
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001888 // Add target specific cpu and features flags.
1889 switch(getToolChain().getTriple().getArch()) {
1890 default:
1891 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001892
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001893 case llvm::Triple::arm:
1894 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001895 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001896 break;
1897
Eric Christopher0b26a612010-03-02 02:41:08 +00001898 case llvm::Triple::mips:
1899 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001900 case llvm::Triple::mips64:
1901 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001902 AddMIPSTargetArgs(Args, CmdArgs);
1903 break;
1904
Hal Finkel8eb59282012-06-11 22:35:19 +00001905 case llvm::Triple::ppc:
1906 case llvm::Triple::ppc64:
1907 AddPPCTargetArgs(Args, CmdArgs);
1908 break;
1909
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001910 case llvm::Triple::sparc:
1911 AddSparcTargetArgs(Args, CmdArgs);
1912 break;
1913
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001914 case llvm::Triple::x86:
1915 case llvm::Triple::x86_64:
1916 AddX86TargetArgs(Args, CmdArgs);
1917 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001918
1919 case llvm::Triple::hexagon:
1920 AddHexagonTargetArgs(Args, CmdArgs);
1921 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001922 }
1923
Tony Linthicum76329bf2011-12-12 21:14:55 +00001924
1925
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001926 // Pass the linker version in use.
1927 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1928 CmdArgs.push_back("-target-linker-version");
1929 CmdArgs.push_back(A->getValue(Args));
1930 }
1931
Nick Lewycky75033772011-02-02 06:43:03 +00001932 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001933 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001934 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001935 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001936 CmdArgs.push_back("-momit-leaf-frame-pointer");
1937
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001938 // Explicitly error on some things we know we don't support and can't just
1939 // ignore.
1940 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001941 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1942 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001943 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001944 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001945 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001946 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1947 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001948 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001949 << Unsupported->getOption().getName();
1950 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001951 }
1952
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001953 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001954 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001955 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001956 CmdArgs.push_back("-header-include-file");
1957 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1958 D.CCPrintHeadersFilename : "-");
1959 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001960 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001961 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001962
Chad Rosierbe10f982011-08-02 17:58:04 +00001963 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001964 CmdArgs.push_back("-diagnostic-log-file");
1965 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1966 D.CCLogDiagnosticsFilename : "-");
1967 }
1968
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001969 // Use the last option from "-g" group. "-gline-tables-only" is
1970 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001971 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001972 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1973 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1974 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001975 } else if (!A->getOption().matches(options::OPT_g0) &&
1976 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001977 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001978 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001979 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001980
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001981 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1982 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1983
Rafael Espindola66bfb2752010-05-06 21:06:04 +00001984 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1985 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1986
Chris Lattner3c77a352010-06-22 00:03:40 +00001987 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1988
Nick Lewycky207bce32011-04-21 23:44:07 +00001989 if (Args.hasArg(options::OPT_ftest_coverage) ||
1990 Args.hasArg(options::OPT_coverage))
1991 CmdArgs.push_back("-femit-coverage-notes");
1992 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1993 Args.hasArg(options::OPT_coverage))
1994 CmdArgs.push_back("-femit-coverage-data");
1995
Nick Lewycky480cb992011-05-04 20:46:58 +00001996 if (C.getArgs().hasArg(options::OPT_c) ||
1997 C.getArgs().hasArg(options::OPT_S)) {
1998 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00001999 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00002000 SmallString<128> absFilename(Output.getFilename());
2001 llvm::sys::fs::make_absolute(absFilename);
2002 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002003 }
2004 }
2005
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002006 // Pass options for controlling the default header search paths.
2007 if (Args.hasArg(options::OPT_nostdinc)) {
2008 CmdArgs.push_back("-nostdsysteminc");
2009 CmdArgs.push_back("-nobuiltininc");
2010 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002011 if (Args.hasArg(options::OPT_nostdlibinc))
2012 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002013 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2014 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2015 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002016
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002017 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002018 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002019 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002020
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002021 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2022
Ted Kremenekf7639e12012-03-06 20:06:33 +00002023 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002024 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002025 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002026 options::OPT_ccc_arcmt_modify,
2027 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002028 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002029 switch (A->getOption().getID()) {
2030 default:
2031 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002032 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002033 CmdArgs.push_back("-arcmt-check");
2034 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002035 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002036 CmdArgs.push_back("-arcmt-modify");
2037 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002038 case options::OPT_ccc_arcmt_migrate:
2039 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002040 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002041 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002042
2043 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2044 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002045 break;
John McCalld70fb982011-06-15 23:25:17 +00002046 }
2047 }
2048 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002049
Ted Kremenekf7639e12012-03-06 20:06:33 +00002050 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2051 if (ARCMTEnabled) {
2052 D.Diag(diag::err_drv_argument_not_allowed_with)
2053 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2054 }
2055 CmdArgs.push_back("-mt-migrate-directory");
2056 CmdArgs.push_back(A->getValue(Args));
2057
2058 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2059 options::OPT_objcmt_migrate_subscripting)) {
2060 // None specified, means enable them all.
2061 CmdArgs.push_back("-objcmt-migrate-literals");
2062 CmdArgs.push_back("-objcmt-migrate-subscripting");
2063 } else {
2064 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2065 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2066 }
2067 }
2068
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002069 // Add preprocessing options like -I, -D, etc. if we are using the
2070 // preprocessor.
2071 //
2072 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002073 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002074 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002075
Rafael Espindolaa7431922011-07-21 23:40:37 +00002076 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2077 // that "The compiler can only warn and ignore the option if not recognized".
2078 // When building with ccache, it will pass -D options to clang even on
2079 // preprocessed inputs and configure concludes that -fPIC is not supported.
2080 Args.ClaimAllArgs(options::OPT_D);
2081
Daniel Dunbar58f78332009-09-17 06:53:36 +00002082 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002083 // others.
2084 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002085 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002086 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002087 else if (A->getOption().matches(options::OPT_O) &&
2088 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002089 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002090 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002091 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002092 }
2093
Daniel Dunbar945577c2009-10-29 02:24:45 +00002094 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002095 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2096 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002097 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002098 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002099
2100 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2101 // (-ansi is equivalent to -std=c89).
2102 //
2103 // If a std is supplied, only add -trigraphs if it follows the
2104 // option.
2105 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2106 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002107 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002108 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002109 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002110 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002111 else
2112 Std->render(Args, CmdArgs);
2113
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002114 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2115 options::OPT_trigraphs))
2116 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002117 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002118 } else {
2119 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002120 //
2121 // FIXME: Clang doesn't correctly handle -std= when the input language
2122 // doesn't match. For the time being just ignore this for C++ inputs;
2123 // eventually we want to do all the standard defaulting here instead of
2124 // splitting it between the driver and clang -cc1.
2125 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002126 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2127 "-std=", /*Joined=*/true);
2128 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2129 CmdArgs.push_back("-std=c++11");
2130
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002131 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002132 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002133
Chandler Carruthb009b142011-04-23 06:30:43 +00002134 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2135 // '-fconst-strings'; this better indicates its actual behavior.
2136 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2137 false)) {
2138 // For perfect compatibility with GCC, we do this even in the presence of
2139 // '-w'. This flag names something other than a warning for GCC.
2140 CmdArgs.push_back("-fconst-strings");
2141 }
2142
Chandler Carruth61fbf622011-04-23 09:27:53 +00002143 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002144 // during C++ compilation, which it is by default. GCC keeps this define even
2145 // in the presence of '-w', match this behavior bug-for-bug.
2146 if (types::isCXX(InputType) &&
2147 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2148 true)) {
2149 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002150 }
2151
Chandler Carruthe0391482010-05-22 02:21:53 +00002152 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2153 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2154 if (Asm->getOption().matches(options::OPT_fasm))
2155 CmdArgs.push_back("-fgnu-keywords");
2156 else
2157 CmdArgs.push_back("-fno-gnu-keywords");
2158 }
2159
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002160 if (ShouldDisableCFI(Args, getToolChain()))
2161 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002162
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002163 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2164 CmdArgs.push_back("-fno-dwarf-directory-asm");
2165
Nick Lewyckyba743b72011-10-21 02:32:14 +00002166 if (const char *pwd = ::getenv("PWD")) {
2167 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2168 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002169 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002170 std::string CompDir = pwd;
2171 CmdArgs.push_back("-fdebug-compilation-dir");
2172 CmdArgs.push_back(Args.MakeArgString(CompDir));
2173 }
2174 }
2175
Richard Smith9a568822011-11-21 19:36:32 +00002176 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2177 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002178 CmdArgs.push_back("-ftemplate-depth");
2179 CmdArgs.push_back(A->getValue(Args));
2180 }
2181
Richard Smith9a568822011-11-21 19:36:32 +00002182 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2183 CmdArgs.push_back("-fconstexpr-depth");
2184 CmdArgs.push_back(A->getValue(Args));
2185 }
2186
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002187 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2188 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002189 if (A->getNumValues()) {
2190 StringRef bytes = A->getValue(Args);
2191 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2192 } else
2193 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002194 }
2195
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002196 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2197 options::OPT_fbounds_checking_EQ)) {
2198 if (A->getNumValues()) {
2199 StringRef val = A->getValue(Args);
2200 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2201 } else
2202 CmdArgs.push_back("-fbounds-checking=1");
2203 }
2204
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002205 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002206 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002207
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002208 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2209 CmdArgs.push_back("-fconstant-string-class");
2210 CmdArgs.push_back(A->getValue(Args));
2211 }
David Chisnall5778fce2009-08-31 16:41:57 +00002212
Chris Lattnere23003d2010-01-09 21:54:33 +00002213 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2214 CmdArgs.push_back("-ftabstop");
2215 CmdArgs.push_back(A->getValue(Args));
2216 }
2217
Chris Lattnerb35583d2010-04-07 20:49:23 +00002218 CmdArgs.push_back("-ferror-limit");
2219 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2220 CmdArgs.push_back(A->getValue(Args));
2221 else
2222 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002223
Chandler Carrutha77a7272010-05-06 04:55:18 +00002224 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2225 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002226 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002227 }
2228
2229 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2230 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002231 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002232 }
2233
Richard Smithf6f003a2011-12-16 19:06:07 +00002234 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2235 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2236 CmdArgs.push_back(A->getValue(Args));
2237 }
2238
Daniel Dunbar2c978472009-11-04 06:24:47 +00002239 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002240 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002241 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002242 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002243 } else {
2244 // If -fmessage-length=N was not specified, determine whether this is a
2245 // terminal and, if so, implicitly define -fmessage-length appropriately.
2246 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002247 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002248 }
2249
Daniel Dunbare357d562009-12-03 18:42:11 +00002250 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2251 CmdArgs.push_back("-fvisibility");
2252 CmdArgs.push_back(A->getValue(Args));
2253 }
2254
Douglas Gregor08329632010-06-15 17:05:35 +00002255 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002256
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002257 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2258
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002259 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002260 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2261 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002262 CmdArgs.push_back("-ffreestanding");
2263
Daniel Dunbare357d562009-12-03 18:42:11 +00002264 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002265 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002266 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002267 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002268 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002269 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002270 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002271 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002272 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2273 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002274
2275 // Report and error for -faltivec on anything other then PowerPC.
2276 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2277 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2278 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2279 D.Diag(diag::err_drv_argument_only_allowed_with)
2280 << A->getAsString(Args) << "ppc/ppc64";
2281
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002282 if (getToolChain().SupportsProfiling())
2283 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002284
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002285 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2286 options::OPT_fno_address_sanitizer, false))
2287 CmdArgs.push_back("-faddress-sanitizer");
2288
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002289 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2290 options::OPT_fno_thread_sanitizer, false))
2291 CmdArgs.push_back("-fthread-sanitizer");
2292
Daniel Dunbar35621a92010-03-16 16:57:46 +00002293 // -flax-vector-conversions is default.
2294 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2295 options::OPT_fno_lax_vector_conversions))
2296 CmdArgs.push_back("-fno-lax-vector-conversions");
2297
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002298 if (Args.getLastArg(options::OPT_fapple_kext))
2299 CmdArgs.push_back("-fapple-kext");
2300
David Blaikie690f21e2012-06-14 18:55:27 +00002301 if (Args.hasFlag(options::OPT_frewrite_includes,
2302 options::OPT_fno_rewrite_includes, false))
2303 CmdArgs.push_back("-frewrite-includes");
2304
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002306 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002307 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002308 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2309 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002310
2311 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2312 CmdArgs.push_back("-ftrapv-handler");
2313 CmdArgs.push_back(A->getValue(Args));
2314 }
2315
Bob Wilson14adb362012-02-03 06:27:22 +00002316 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002317
Chandler Carruth6e501032011-03-27 00:04:55 +00002318 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2319 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2320 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2321 options::OPT_fno_wrapv)) {
2322 if (A->getOption().matches(options::OPT_fwrapv))
2323 CmdArgs.push_back("-fwrapv");
2324 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2325 options::OPT_fno_strict_overflow)) {
2326 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2327 CmdArgs.push_back("-fwrapv");
2328 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002329 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002330 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002331
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002332 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2333
Daniel Dunbar4930e332009-11-17 08:07:36 +00002334 // -stack-protector=0 is default.
2335 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002336 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2337 options::OPT_fstack_protector_all,
2338 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002339 if (A->getOption().matches(options::OPT_fstack_protector))
2340 StackProtectorLevel = 1;
2341 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2342 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002343 } else {
2344 StackProtectorLevel =
2345 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2346 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002347 if (StackProtectorLevel) {
2348 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002349 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002350
2351 // --param ssp-buffer-size=
2352 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
2353 ie = Args.filtered_end(); it != ie; ++it) {
2354 StringRef Str((*it)->getValue(Args));
2355 if (Str.startswith("ssp-buffer-size=")) {
2356 CmdArgs.push_back("-stack-protector-buffer-size");
2357 // FIXME: Verify the argument is a valid integer.
2358 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
2359 (*it)->claim();
2360 }
2361 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002362 }
2363
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002364 // Translate -mstackrealign
2365 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2366 false)) {
2367 CmdArgs.push_back("-backend-option");
2368 CmdArgs.push_back("-force-align-stack");
2369 }
2370 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2371 false)) {
2372 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2373 }
2374
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002375 if (Args.hasArg(options::OPT_mstack_alignment)) {
2376 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2377 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002378 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002379
Daniel Dunbard18049a2009-04-07 21:16:11 +00002380 // Forward -f options with positive and negative forms; we translate
2381 // these by hand.
2382
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002383 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002384 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002385 CmdArgs.push_back("-fapple-kext");
2386 if (!Args.hasArg(options::OPT_fbuiltin))
2387 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002388 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002389 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002390 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002391 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002392 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002393
Nuno Lopes13c88c72009-12-16 16:59:22 +00002394 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2395 options::OPT_fno_assume_sane_operator_new))
2396 CmdArgs.push_back("-fno-assume-sane-operator-new");
2397
Daniel Dunbar4930e332009-11-17 08:07:36 +00002398 // -fblocks=0 is default.
2399 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002400 getToolChain().IsBlocksDefault()) ||
2401 (Args.hasArg(options::OPT_fgnu_runtime) &&
2402 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2403 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002404 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002405
2406 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2407 !getToolChain().hasBlocksRuntime())
2408 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002409 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002410
Douglas Gregor226173a2012-01-18 15:19:58 +00002411 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2412 // users must also pass -fcxx-modules. The latter flag will disappear once the
2413 // modules implementation is solid for C++/Objective-C++ programs as well.
2414 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2415 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2416 options::OPT_fno_cxx_modules,
2417 false);
2418 if (AllowedInCXX || !types::isCXX(InputType))
2419 CmdArgs.push_back("-fmodules");
2420 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002421
John McCalldfea9982010-04-09 19:12:06 +00002422 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002423 if (Args.hasFlag(options::OPT_fno_access_control,
2424 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002425 false))
John McCall3155f572010-04-09 19:03:51 +00002426 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002427
Anders Carlssond470fef2010-11-21 00:09:52 +00002428 // -felide-constructors is the default.
2429 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2430 options::OPT_felide_constructors,
2431 false))
2432 CmdArgs.push_back("-fno-elide-constructors");
2433
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002434 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002435 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2436 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002437 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002438
Tony Linthicum76329bf2011-12-12 21:14:55 +00002439 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002440 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002441 options::OPT_fno_short_enums,
2442 getToolChain().getTriple().getArch() ==
2443 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002444 CmdArgs.push_back("-fshort-enums");
2445
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002446 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002447 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002448 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002449 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002450
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002451 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002452 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002453 options::OPT_fno_threadsafe_statics))
2454 CmdArgs.push_back("-fno-threadsafe-statics");
2455
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002456 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002457 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2458 options::OPT_fno_use_cxa_atexit,
2459 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002460 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002461 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2462 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002463 CmdArgs.push_back("-fno-use-cxa-atexit");
2464
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002465 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002466 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002467 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2468 CmdArgs.push_back("-fms-extensions");
2469
Chad Rosiered943242012-07-20 21:20:33 +00002470 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002471 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2472 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002473
Francois Pichet1b4f1632011-09-17 04:32:15 +00002474 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002475 if (Args.hasFlag(options::OPT_fms_compatibility,
2476 options::OPT_fno_ms_compatibility,
2477 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2478 Args.hasFlag(options::OPT_fms_extensions,
2479 options::OPT_fno_ms_extensions,
2480 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002481 CmdArgs.push_back("-fms-compatibility");
2482
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002483 // -fmsc-version=1300 is default.
2484 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2485 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2486 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002487 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002488 if (msc_ver.empty())
2489 CmdArgs.push_back("-fmsc-version=1300");
2490 else
2491 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2492 }
2493
2494
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002495 // -fborland-extensions=0 is default.
2496 if (Args.hasFlag(options::OPT_fborland_extensions,
2497 options::OPT_fno_borland_extensions, false))
2498 CmdArgs.push_back("-fborland-extensions");
2499
Francois Pichet02744872011-09-01 16:38:08 +00002500 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2501 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002502 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2503 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002504 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002505 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002506
Chandler Carruthe03aa552010-04-17 20:17:31 +00002507 // -fgnu-keywords default varies depending on language; only pass if
2508 // specified.
2509 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002510 options::OPT_fno_gnu_keywords))
2511 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002512
Rafael Espindola922a6242011-06-02 17:30:53 +00002513 if (Args.hasFlag(options::OPT_fgnu89_inline,
2514 options::OPT_fno_gnu89_inline,
2515 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002516 CmdArgs.push_back("-fgnu89-inline");
2517
Chad Rosier9c76d242012-03-15 22:31:42 +00002518 if (Args.hasArg(options::OPT_fno_inline))
2519 CmdArgs.push_back("-fno-inline");
2520
Chad Rosier64d6be92012-03-06 21:17:19 +00002521 if (Args.hasArg(options::OPT_fno_inline_functions))
2522 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002523
John McCall5fb5df92012-06-20 06:18:46 +00002524 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002525
John McCall5fb5df92012-06-20 06:18:46 +00002526 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2527 // legacy is the default.
2528 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002529 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2530 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002531 objcRuntime.isLegacyDispatchDefaultForArch(
2532 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002533 if (getToolChain().UseObjCMixedDispatch())
2534 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2535 else
2536 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2537 }
2538 }
2539
Nico Weber97bd94b2012-03-09 21:19:44 +00002540 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2541 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002542 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002543 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2544 }
2545
John McCall24fc0de2011-07-06 00:26:06 +00002546 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2547 // NOTE: This logic is duplicated in ToolChains.cpp.
2548 bool ARC = isObjCAutoRefCount(Args);
2549 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002550 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002551
John McCall24fc0de2011-07-06 00:26:06 +00002552 CmdArgs.push_back("-fobjc-arc");
2553
Chandler Carruth491db322011-11-04 07:34:47 +00002554 // FIXME: It seems like this entire block, and several around it should be
2555 // wrapped in isObjC, but for now we just use it here as this is where it
2556 // was being used previously.
2557 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2558 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2559 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2560 else
2561 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2562 }
2563
John McCall24fc0de2011-07-06 00:26:06 +00002564 // Allow the user to enable full exceptions code emission.
2565 // We define off for Objective-CC, on for Objective-C++.
2566 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2567 options::OPT_fno_objc_arc_exceptions,
2568 /*default*/ types::isCXX(InputType)))
2569 CmdArgs.push_back("-fobjc-arc-exceptions");
2570 }
2571
2572 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2573 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002574 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002575 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002576
John McCall24fc0de2011-07-06 00:26:06 +00002577 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2578 // takes precedence.
2579 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2580 if (!GCArg)
2581 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2582 if (GCArg) {
2583 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002584 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002585 << GCArg->getAsString(Args);
2586 } else if (getToolChain().SupportsObjCGC()) {
2587 GCArg->render(Args, CmdArgs);
2588 } else {
2589 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002590 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002591 << GCArg->getAsString(Args);
2592 }
2593 }
2594
John McCallb5f652e2011-06-22 00:53:57 +00002595 // Add exception args.
2596 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002597 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002598
2599 if (getToolChain().UseSjLjExceptions())
2600 CmdArgs.push_back("-fsjlj-exceptions");
2601
2602 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002603 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2604 options::OPT_fno_assume_sane_operator_new))
2605 CmdArgs.push_back("-fno-assume-sane-operator-new");
2606
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002607 // -fconstant-cfstrings is default, and may be subject to argument translation
2608 // on Darwin.
2609 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2610 options::OPT_fno_constant_cfstrings) ||
2611 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2612 options::OPT_mno_constant_cfstrings))
2613 CmdArgs.push_back("-fno-constant-cfstrings");
2614
John Thompsoned4e2952009-11-05 20:14:16 +00002615 // -fshort-wchar default varies depending on platform; only
2616 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002617 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2618 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002619
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002620 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2621 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002622 //
2623 // FIXME: This is gross; that translation should be pulled from the
2624 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002625 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002626 options::OPT_fno_pascal_strings,
2627 false) ||
2628 Args.hasFlag(options::OPT_mpascal_strings,
2629 options::OPT_mno_pascal_strings,
2630 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002631 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002632
Daniel Dunbar096ed292011-10-05 21:04:55 +00002633 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2634 // -fno-pack-struct doesn't apply to -fpack-struct=.
2635 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002636 std::string PackStructStr = "-fpack-struct=";
2637 PackStructStr += A->getValue(Args);
2638 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002639 } else if (Args.hasFlag(options::OPT_fpack_struct,
2640 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002641 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002642 }
2643
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002644 if (Args.hasArg(options::OPT_mkernel) ||
2645 Args.hasArg(options::OPT_fapple_kext)) {
2646 if (!Args.hasArg(options::OPT_fcommon))
2647 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002648 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002649 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002650
Daniel Dunbard18049a2009-04-07 21:16:11 +00002651 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002652 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002653 CmdArgs.push_back("-fno-common");
2654
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002655 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002656 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002657 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002658 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002659 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002660 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2661
Daniel Dunbar6358d682010-10-15 22:30:42 +00002662 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2663 if (!Args.hasFlag(options::OPT_ffor_scope,
2664 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002665 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002666 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2667
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002668 // -fcaret-diagnostics is default.
2669 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2670 options::OPT_fno_caret_diagnostics, true))
2671 CmdArgs.push_back("-fno-caret-diagnostics");
2672
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002673 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002674 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002675 options::OPT_fno_diagnostics_fixit_info))
2676 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002677
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002678 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002679 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002680 options::OPT_fno_diagnostics_show_option))
2681 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002682
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002683 if (const Arg *A =
2684 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2685 CmdArgs.push_back("-fdiagnostics-show-category");
2686 CmdArgs.push_back(A->getValue(Args));
2687 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002688
Douglas Gregor643c9222011-05-21 17:07:29 +00002689 if (const Arg *A =
2690 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2691 CmdArgs.push_back("-fdiagnostics-format");
2692 CmdArgs.push_back(A->getValue(Args));
2693 }
2694
Chandler Carruthb6766f02011-03-27 01:50:55 +00002695 if (Arg *A = Args.getLastArg(
2696 options::OPT_fdiagnostics_show_note_include_stack,
2697 options::OPT_fno_diagnostics_show_note_include_stack)) {
2698 if (A->getOption().matches(
2699 options::OPT_fdiagnostics_show_note_include_stack))
2700 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2701 else
2702 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2703 }
2704
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002705 // Color diagnostics are the default, unless the terminal doesn't support
2706 // them.
2707 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002708 options::OPT_fno_color_diagnostics,
2709 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002710 CmdArgs.push_back("-fcolor-diagnostics");
2711
Daniel Dunbardb097022009-06-08 21:13:54 +00002712 if (!Args.hasFlag(options::OPT_fshow_source_location,
2713 options::OPT_fno_show_source_location))
2714 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002715
Douglas Gregor643c9222011-05-21 17:07:29 +00002716 if (!Args.hasFlag(options::OPT_fshow_column,
2717 options::OPT_fno_show_column,
2718 true))
2719 CmdArgs.push_back("-fno-show-column");
2720
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002721 if (!Args.hasFlag(options::OPT_fspell_checking,
2722 options::OPT_fno_spell_checking))
2723 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002724
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002725
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002726 // Silently ignore -fasm-blocks for now.
2727 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2728 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002729
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002730 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2731 A->render(Args, CmdArgs);
2732
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002733 // -fdollars-in-identifiers default varies depending on platform and
2734 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002735 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002736 options::OPT_fno_dollars_in_identifiers)) {
2737 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002738 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002739 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002740 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002741 }
2742
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002743 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2744 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002745 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002746 options::OPT_fno_unit_at_a_time)) {
2747 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002748 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002749 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002750
Eli Friedman055c9702011-11-02 01:53:16 +00002751 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2752 options::OPT_fno_apple_pragma_pack, false))
2753 CmdArgs.push_back("-fapple-pragma-pack");
2754
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002755 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002756 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002757 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002758#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002759 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002760 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2761 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2762 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2763 CmdArgs.push_back("-fno-builtin-strcat");
2764 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2765 CmdArgs.push_back("-fno-builtin-strcpy");
2766 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002767#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002768
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002769 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002770 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002771 options::OPT_traditional_cpp)) {
2772 if (isa<PreprocessJobAction>(JA))
2773 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002774 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002775 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002776 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002777
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002778 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002779 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002780
2781 // Handle serialized diagnostics.
2782 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2783 CmdArgs.push_back("-serialize-diagnostic-file");
2784 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2785 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002786
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002787 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2788 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002789 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002790 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2791 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002792 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002793
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002794 // We translate this by hand to the -cc1 argument, since nightly test uses
2795 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002796 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002797 CmdArgs.push_back("-disable-llvm-optzns");
2798 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002799 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002800 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002801
Daniel Dunbard67a3222009-03-30 06:36:42 +00002802 if (Output.getType() == types::TY_Dependencies) {
2803 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002804 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002805 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002806 CmdArgs.push_back(Output.getFilename());
2807 } else {
2808 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002809 }
2810
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002811 for (InputInfoList::const_iterator
2812 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2813 const InputInfo &II = *it;
2814 CmdArgs.push_back("-x");
2815 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002816 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002817 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002818 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002819 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002820 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002821
Chris Lattnere9d7d782009-11-03 19:50:27 +00002822 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2823
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002824 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002825
2826 // Optionally embed the -cc1 level arguments into the debug info, for build
2827 // analysis.
2828 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002829 ArgStringList OriginalArgs;
2830 for (ArgList::const_iterator it = Args.begin(),
2831 ie = Args.end(); it != ie; ++it)
2832 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002833
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002834 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002835 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002836 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002837 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002838 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002839 }
2840 CmdArgs.push_back("-dwarf-debug-flags");
2841 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2842 }
2843
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002844 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002845
Roman Divacky178e01602011-02-10 16:52:03 +00002846 if (Arg *A = Args.getLastArg(options::OPT_pg))
2847 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002848 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002849 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002850
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002851 // Claim some arguments which clang supports automatically.
2852
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002853 // -fpch-preprocess is used with gcc to add a special marker in the output to
2854 // include the PCH file. Clang's PTH solution is completely transparent, so we
2855 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002856 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002857
Daniel Dunbar17731772009-03-23 19:03:36 +00002858 // Claim some arguments which clang doesn't support, but we don't
2859 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002860 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2861 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002862
Rafael Espindolad95a8122011-03-01 05:25:27 +00002863 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002864 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002865 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002866}
2867
Jim Grosbach576452b2012-02-10 20:37:10 +00002868void ClangAs::AddARMTargetArgs(const ArgList &Args,
2869 ArgStringList &CmdArgs) const {
2870 const Driver &D = getToolChain().getDriver();
2871 llvm::Triple Triple = getToolChain().getTriple();
2872
2873 // Set the CPU based on -march= and -mcpu=.
2874 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002875 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002876
2877 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002878 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002879 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002880
2881 // Honor -mfpmath=.
2882 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002883 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002884}
2885
John McCall5fb5df92012-06-20 06:18:46 +00002886/// Add options related to the Objective-C runtime/ABI.
2887///
2888/// Returns true if the runtime is non-fragile.
2889ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2890 ArgStringList &cmdArgs,
2891 RewriteKind rewriteKind) const {
2892 // Look for the controlling runtime option.
2893 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2894 options::OPT_fgnu_runtime,
2895 options::OPT_fobjc_runtime_EQ);
2896
2897 // Just forward -fobjc-runtime= to the frontend. This supercedes
2898 // options about fragility.
2899 if (runtimeArg &&
2900 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2901 ObjCRuntime runtime;
2902 StringRef value = runtimeArg->getValue(args);
2903 if (runtime.tryParse(value)) {
2904 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2905 << value;
2906 }
2907
2908 runtimeArg->render(args, cmdArgs);
2909 return runtime;
2910 }
2911
2912 // Otherwise, we'll need the ABI "version". Version numbers are
2913 // slightly confusing for historical reasons:
2914 // 1 - Traditional "fragile" ABI
2915 // 2 - Non-fragile ABI, version 1
2916 // 3 - Non-fragile ABI, version 2
2917 unsigned objcABIVersion = 1;
2918 // If -fobjc-abi-version= is present, use that to set the version.
2919 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2920 StringRef value = abiArg->getValue(args);
2921 if (value == "1")
2922 objcABIVersion = 1;
2923 else if (value == "2")
2924 objcABIVersion = 2;
2925 else if (value == "3")
2926 objcABIVersion = 3;
2927 else
2928 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2929 << value;
2930 } else {
2931 // Otherwise, determine if we are using the non-fragile ABI.
2932 bool nonFragileABIIsDefault =
2933 (rewriteKind == RK_NonFragile ||
2934 (rewriteKind == RK_None &&
2935 getToolChain().IsObjCNonFragileABIDefault()));
2936 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2937 options::OPT_fno_objc_nonfragile_abi,
2938 nonFragileABIIsDefault)) {
2939 // Determine the non-fragile ABI version to use.
2940#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2941 unsigned nonFragileABIVersion = 1;
2942#else
2943 unsigned nonFragileABIVersion = 2;
2944#endif
2945
2946 if (Arg *abiArg = args.getLastArg(
2947 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2948 StringRef value = abiArg->getValue(args);
2949 if (value == "1")
2950 nonFragileABIVersion = 1;
2951 else if (value == "2")
2952 nonFragileABIVersion = 2;
2953 else
2954 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2955 << value;
2956 }
2957
2958 objcABIVersion = 1 + nonFragileABIVersion;
2959 } else {
2960 objcABIVersion = 1;
2961 }
2962 }
2963
2964 // We don't actually care about the ABI version other than whether
2965 // it's non-fragile.
2966 bool isNonFragile = objcABIVersion != 1;
2967
2968 // If we have no runtime argument, ask the toolchain for its default runtime.
2969 // However, the rewriter only really supports the Mac runtime, so assume that.
2970 ObjCRuntime runtime;
2971 if (!runtimeArg) {
2972 switch (rewriteKind) {
2973 case RK_None:
2974 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2975 break;
2976 case RK_Fragile:
2977 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2978 break;
2979 case RK_NonFragile:
2980 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2981 break;
2982 }
2983
2984 // -fnext-runtime
2985 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2986 // On Darwin, make this use the default behavior for the toolchain.
2987 if (getToolChain().getTriple().isOSDarwin()) {
2988 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2989
2990 // Otherwise, build for a generic macosx port.
2991 } else {
2992 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2993 }
2994
2995 // -fgnu-runtime
2996 } else {
2997 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00002998 // Legacy behaviour is to target the gnustep runtime if we are i
2999 // non-fragile mode or the GCC runtime in fragile mode.
3000 if (isNonFragile)
3001 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3002 else
3003 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003004 }
3005
3006 cmdArgs.push_back(args.MakeArgString(
3007 "-fobjc-runtime=" + runtime.getAsString()));
3008 return runtime;
3009}
3010
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003011void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003012 const InputInfo &Output,
3013 const InputInfoList &Inputs,
3014 const ArgList &Args,
3015 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003016 ArgStringList CmdArgs;
3017
3018 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3019 const InputInfo &Input = Inputs[0];
3020
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003021 // Don't warn about "clang -w -c foo.s"
3022 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003023 // and "clang -emit-llvm -c foo.s"
3024 Args.ClaimAllArgs(options::OPT_emit_llvm);
3025 // and "clang -use-gold-plugin -c foo.s"
3026 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003027
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003028 // Invoke ourselves in -cc1as mode.
3029 //
3030 // FIXME: Implement custom jobs for internal actions.
3031 CmdArgs.push_back("-cc1as");
3032
3033 // Add the "effective" target triple.
3034 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003035 std::string TripleStr =
3036 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003037 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3038
3039 // Set the output mode, we currently only expect to be used as a real
3040 // assembler.
3041 CmdArgs.push_back("-filetype");
3042 CmdArgs.push_back("obj");
3043
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003044 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003045 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003046
Jim Grosbach576452b2012-02-10 20:37:10 +00003047 // Add target specific cpu and features flags.
3048 switch(getToolChain().getTriple().getArch()) {
3049 default:
3050 break;
3051
3052 case llvm::Triple::arm:
3053 case llvm::Triple::thumb:
3054 AddARMTargetArgs(Args, CmdArgs);
3055 break;
3056 }
3057
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003058 // Ignore explicit -force_cpusubtype_ALL option.
3059 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003060
Eric Christopherfc3ee562012-01-10 00:38:01 +00003061 // Determine the original source input.
3062 const Action *SourceAction = &JA;
3063 while (SourceAction->getKind() != Action::InputClass) {
3064 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3065 SourceAction = SourceAction->getInputs()[0];
3066 }
3067
3068 // Forward -g, assuming we are dealing with an actual assembly file.
3069 if (SourceAction->getType() == types::TY_Asm ||
3070 SourceAction->getType() == types::TY_PP_Asm) {
3071 Args.ClaimAllArgs(options::OPT_g_Group);
3072 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3073 if (!A->getOption().matches(options::OPT_g0))
3074 CmdArgs.push_back("-g");
3075 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003076
3077 // Optionally embed the -cc1as level arguments into the debug info, for build
3078 // analysis.
3079 if (getToolChain().UseDwarfDebugFlags()) {
3080 ArgStringList OriginalArgs;
3081 for (ArgList::const_iterator it = Args.begin(),
3082 ie = Args.end(); it != ie; ++it)
3083 (*it)->render(Args, OriginalArgs);
3084
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003085 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003086 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3087 Flags += Exec;
3088 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3089 Flags += " ";
3090 Flags += OriginalArgs[i];
3091 }
3092 CmdArgs.push_back("-dwarf-debug-flags");
3093 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3094 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003095
3096 // FIXME: Add -static support, once we have it.
3097
3098 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3099 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003100 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003101
3102 assert(Output.isFilename() && "Unexpected lipo output.");
3103 CmdArgs.push_back("-o");
3104 CmdArgs.push_back(Output.getFilename());
3105
Daniel Dunbarb440f562010-08-02 02:38:21 +00003106 assert(Input.isFilename() && "Invalid input.");
3107 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003108
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003109 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003110 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003111}
3112
Daniel Dunbara3246a02009-03-18 08:07:30 +00003113void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003114 const InputInfo &Output,
3115 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003116 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003117 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003118 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003119 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003120
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003121 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003122 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003123 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003124 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003125 // Don't forward any -g arguments to assembly steps.
3126 if (isa<AssembleJobAction>(JA) &&
3127 A->getOption().matches(options::OPT_g_Group))
3128 continue;
3129
Daniel Dunbar2da02722009-03-19 07:55:12 +00003130 // It is unfortunate that we have to claim here, as this means
3131 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003132 // platforms using a generic gcc, even if we are just using gcc
3133 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003134 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003135 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003136 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003137 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003138
Daniel Dunbar4e295052010-01-25 22:35:08 +00003139 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003140
3141 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003142 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003143 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003144 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003145
3146 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003147 if (Arch == "powerpc")
3148 CmdArgs.push_back("ppc");
3149 else if (Arch == "powerpc64")
3150 CmdArgs.push_back("ppc64");
3151 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003152 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003153 }
3154
Daniel Dunbar5716d872009-05-02 21:41:52 +00003155 // Try to force gcc to match the tool chain we want, if we recognize
3156 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003157 //
3158 // FIXME: The triple class should directly provide the information we want
3159 // here.
3160 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003161 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003162 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003163 CmdArgs.push_back("-m64");
3164
Daniel Dunbarb440f562010-08-02 02:38:21 +00003165 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003166 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003167 CmdArgs.push_back(Output.getFilename());
3168 } else {
3169 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003170 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003171 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003172
Tony Linthicum76329bf2011-12-12 21:14:55 +00003173 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3174 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003175
3176 // Only pass -x if gcc will understand it; otherwise hope gcc
3177 // understands the suffix correctly. The main use case this would go
3178 // wrong in is for linker inputs if they happened to have an odd
3179 // suffix; really the only way to get this to happen is a command
3180 // like '-x foobar a.c' which will treat a.c like a linker input.
3181 //
3182 // FIXME: For the linker case specifically, can we safely convert
3183 // inputs into '-Wl,' options?
3184 for (InputInfoList::const_iterator
3185 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3186 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003187
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003188 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003189 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3190 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003191 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003192 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003193 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003194 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003195 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003196
Daniel Dunbara3246a02009-03-18 08:07:30 +00003197 if (types::canTypeBeUserSpecified(II.getType())) {
3198 CmdArgs.push_back("-x");
3199 CmdArgs.push_back(types::getTypeName(II.getType()));
3200 }
3201
Daniel Dunbarb440f562010-08-02 02:38:21 +00003202 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003203 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003204 else {
3205 const Arg &A = II.getInputArg();
3206
3207 // Reverse translate some rewritten options.
3208 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3209 CmdArgs.push_back("-lstdc++");
3210 continue;
3211 }
3212
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003213 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003214 A.render(Args, CmdArgs);
3215 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003216 }
3217
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003218 const std::string customGCCName = D.getCCCGenericGCCName();
3219 const char *GCCName;
3220 if (!customGCCName.empty())
3221 GCCName = customGCCName.c_str();
3222 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003223 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003224 } else
3225 GCCName = "gcc";
3226
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003227 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003228 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003229 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003230}
3231
Daniel Dunbar4e295052010-01-25 22:35:08 +00003232void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3233 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003234 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003235}
3236
Daniel Dunbar4e295052010-01-25 22:35:08 +00003237void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3238 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003239 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003240}
3241
Daniel Dunbar4e295052010-01-25 22:35:08 +00003242void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3243 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003244 const Driver &D = getToolChain().getDriver();
3245
Daniel Dunbar4e295052010-01-25 22:35:08 +00003246 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003247 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3248 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003249 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003250 else {
3251 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003252 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003253 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003254
Daniel Dunbar4e295052010-01-25 22:35:08 +00003255 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003256 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003257}
3258
Daniel Dunbar4e295052010-01-25 22:35:08 +00003259void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3260 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003261 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003262}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003263
Daniel Dunbar4e295052010-01-25 22:35:08 +00003264void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3265 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003266 // The types are (hopefully) good enough.
3267}
3268
Tony Linthicum76329bf2011-12-12 21:14:55 +00003269// Hexagon tools start.
3270void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3271 ArgStringList &CmdArgs) const {
3272
3273}
3274void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3275 const InputInfo &Output,
3276 const InputInfoList &Inputs,
3277 const ArgList &Args,
3278 const char *LinkingOutput) const {
3279
3280 const Driver &D = getToolChain().getDriver();
3281 ArgStringList CmdArgs;
3282
3283 std::string MarchString = "-march=";
3284 MarchString += getHexagonTargetCPU(Args);
3285 CmdArgs.push_back(Args.MakeArgString(MarchString));
3286
3287 RenderExtraToolArgs(JA, CmdArgs);
3288
3289 if (Output.isFilename()) {
3290 CmdArgs.push_back("-o");
3291 CmdArgs.push_back(Output.getFilename());
3292 } else {
3293 assert(Output.isNothing() && "Unexpected output");
3294 CmdArgs.push_back("-fsyntax-only");
3295 }
3296
3297
3298 // Only pass -x if gcc will understand it; otherwise hope gcc
3299 // understands the suffix correctly. The main use case this would go
3300 // wrong in is for linker inputs if they happened to have an odd
3301 // suffix; really the only way to get this to happen is a command
3302 // like '-x foobar a.c' which will treat a.c like a linker input.
3303 //
3304 // FIXME: For the linker case specifically, can we safely convert
3305 // inputs into '-Wl,' options?
3306 for (InputInfoList::const_iterator
3307 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3308 const InputInfo &II = *it;
3309
3310 // Don't try to pass LLVM or AST inputs to a generic gcc.
3311 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3312 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3313 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3314 << getToolChain().getTripleString();
3315 else if (II.getType() == types::TY_AST)
3316 D.Diag(clang::diag::err_drv_no_ast_support)
3317 << getToolChain().getTripleString();
3318
3319 if (II.isFilename())
3320 CmdArgs.push_back(II.getFilename());
3321 else
3322 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3323 II.getInputArg().render(Args, CmdArgs);
3324 }
3325
3326 const char *GCCName = "hexagon-as";
3327 const char *Exec =
3328 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3329 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3330
3331}
3332void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3333 ArgStringList &CmdArgs) const {
3334 // The types are (hopefully) good enough.
3335}
3336
3337void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3338 const InputInfo &Output,
3339 const InputInfoList &Inputs,
3340 const ArgList &Args,
3341 const char *LinkingOutput) const {
3342
3343 const Driver &D = getToolChain().getDriver();
3344 ArgStringList CmdArgs;
3345
3346 for (ArgList::const_iterator
3347 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3348 Arg *A = *it;
3349 if (A->getOption().hasForwardToGCC()) {
3350 // Don't forward any -g arguments to assembly steps.
3351 if (isa<AssembleJobAction>(JA) &&
3352 A->getOption().matches(options::OPT_g_Group))
3353 continue;
3354
3355 // It is unfortunate that we have to claim here, as this means
3356 // we will basically never report anything interesting for
3357 // platforms using a generic gcc, even if we are just using gcc
3358 // to get to the assembler.
3359 A->claim();
3360 A->render(Args, CmdArgs);
3361 }
3362 }
3363
3364 RenderExtraToolArgs(JA, CmdArgs);
3365
3366 // Add Arch Information
3367 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003368 if ((A = getLastHexagonArchArg(Args))) {
3369 if (A->getOption().matches(options::OPT_m_Joined))
3370 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003371 else
Sebastian Pop86500282012-01-13 20:37:10 +00003372 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003373 }
Sebastian Pop86500282012-01-13 20:37:10 +00003374 else {
3375 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3376 }
3377
Tony Linthicum76329bf2011-12-12 21:14:55 +00003378 CmdArgs.push_back("-mqdsp6-compat");
3379
3380 const char *GCCName;
3381 if (C.getDriver().CCCIsCXX)
3382 GCCName = "hexagon-g++";
3383 else
3384 GCCName = "hexagon-gcc";
3385 const char *Exec =
3386 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3387
3388 if (Output.isFilename()) {
3389 CmdArgs.push_back("-o");
3390 CmdArgs.push_back(Output.getFilename());
3391 }
3392
3393 for (InputInfoList::const_iterator
3394 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3395 const InputInfo &II = *it;
3396
3397 // Don't try to pass LLVM or AST inputs to a generic gcc.
3398 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3399 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3400 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3401 << getToolChain().getTripleString();
3402 else if (II.getType() == types::TY_AST)
3403 D.Diag(clang::diag::err_drv_no_ast_support)
3404 << getToolChain().getTripleString();
3405
3406 if (II.isFilename())
3407 CmdArgs.push_back(II.getFilename());
3408 else
3409 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3410 II.getInputArg().render(Args, CmdArgs);
3411 }
3412 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3413
3414}
3415// Hexagon tools end.
3416
3417
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003418const char *darwin::CC1::getCC1Name(types::ID Type) const {
3419 switch (Type) {
3420 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003421 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003422 case types::TY_Asm:
3423 case types::TY_C: case types::TY_CHeader:
3424 case types::TY_PP_C: case types::TY_PP_CHeader:
3425 return "cc1";
3426 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003427 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3428 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003429 return "cc1obj";
3430 case types::TY_CXX: case types::TY_CXXHeader:
3431 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3432 return "cc1plus";
3433 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003434 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3435 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003436 return "cc1objplus";
3437 }
3438}
3439
David Blaikie68e081d2011-12-20 02:48:34 +00003440void darwin::CC1::anchor() {}
3441
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003442const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003443 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003444 return Args.MakeArgString(
3445 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003446}
3447
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003448const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003449 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003450 const char *Str = getBaseInputName(Args, Inputs);
3451
Chris Lattner906bb902011-01-16 08:14:11 +00003452 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003453 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003454
3455 return Str;
3456}
3457
3458const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003459darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003460 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003461 // FIXME: Think about this more.
3462 std::string Res;
3463
3464 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3465 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003466 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003467 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003468 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003469 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003470 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003471}
3472
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003473void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003474 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003475 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003476
3477 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003478 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003479
Bob Wilson7ecbd322012-02-07 01:17:55 +00003480 // Erase both -fmodule-cache-path and its argument.
3481 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3482 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003483 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003484 continue;
3485 }
3486
Bob Wilson7ecbd322012-02-07 01:17:55 +00003487 // Remove unsupported -f options.
3488 if (Option.startswith("-f")) {
3489 // Remove -f/-fno- to reduce the number of cases.
3490 if (Option.startswith("-fno-"))
3491 Option = Option.substr(5);
3492 else
3493 Option = Option.substr(2);
3494 RemoveOption = llvm::StringSwitch<bool>(Option)
3495 .Case("altivec", true)
3496 .Case("modules", true)
3497 .Case("diagnostics-show-note-include-stack", true)
3498 .Default(false);
3499 }
3500
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003501 // Handle machine specific options.
3502 if (Option.startswith("-m")) {
3503 RemoveOption = llvm::StringSwitch<bool>(Option)
3504 .Case("-mthumb", true)
3505 .Case("-mno-thumb", true)
3506 .Case("-mno-fused-madd", true)
3507 .Case("-mlong-branch", true)
3508 .Case("-mlongcall", true)
3509 .Case("-mcpu=G4", true)
3510 .Case("-mcpu=G5", true)
3511 .Default(false);
3512 }
3513
3514 // Handle warning options.
3515 if (Option.startswith("-W")) {
3516 // Remove -W/-Wno- to reduce the number of cases.
3517 if (Option.startswith("-Wno-"))
3518 Option = Option.substr(5);
3519 else
3520 Option = Option.substr(2);
3521
3522 RemoveOption = llvm::StringSwitch<bool>(Option)
3523 .Case("address-of-temporary", true)
3524 .Case("ambiguous-member-template", true)
3525 .Case("analyzer-incompatible-plugin", true)
3526 .Case("array-bounds", true)
3527 .Case("array-bounds-pointer-arithmetic", true)
3528 .Case("bind-to-temporary-copy", true)
3529 .Case("bitwise-op-parentheses", true)
3530 .Case("bool-conversions", true)
3531 .Case("builtin-macro-redefined", true)
3532 .Case("c++-hex-floats", true)
3533 .Case("c++0x-compat", true)
3534 .Case("c++0x-extensions", true)
3535 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003536 .Case("c++11-compat", true)
3537 .Case("c++11-extensions", true)
3538 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003539 .Case("conditional-uninitialized", true)
3540 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003541 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003542 .Case("CFString-literal", true)
3543 .Case("constant-logical-operand", true)
3544 .Case("custom-atomic-properties", true)
3545 .Case("default-arg-special-member", true)
3546 .Case("delegating-ctor-cycles", true)
3547 .Case("delete-non-virtual-dtor", true)
3548 .Case("deprecated-implementations", true)
3549 .Case("deprecated-writable-strings", true)
3550 .Case("distributed-object-modifiers", true)
3551 .Case("duplicate-method-arg", true)
3552 .Case("dynamic-class-memaccess", true)
3553 .Case("enum-compare", true)
3554 .Case("exit-time-destructors", true)
3555 .Case("gnu", true)
3556 .Case("gnu-designator", true)
3557 .Case("header-hygiene", true)
3558 .Case("idiomatic-parentheses", true)
3559 .Case("ignored-qualifiers", true)
3560 .Case("implicit-atomic-properties", true)
3561 .Case("incompatible-pointer-types", true)
3562 .Case("incomplete-implementation", true)
3563 .Case("initializer-overrides", true)
3564 .Case("invalid-noreturn", true)
3565 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003566 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003567 .Case("literal-conversion", true)
3568 .Case("literal-range", true)
3569 .Case("local-type-template-args", true)
3570 .Case("logical-op-parentheses", true)
3571 .Case("method-signatures", true)
3572 .Case("microsoft", true)
3573 .Case("mismatched-tags", true)
3574 .Case("missing-method-return-type", true)
3575 .Case("non-pod-varargs", true)
3576 .Case("nonfragile-abi2", true)
3577 .Case("null-arithmetic", true)
3578 .Case("null-dereference", true)
3579 .Case("out-of-line-declaration", true)
3580 .Case("overriding-method-mismatch", true)
3581 .Case("readonly-setter-attrs", true)
3582 .Case("return-stack-address", true)
3583 .Case("self-assign", true)
3584 .Case("semicolon-before-method-body", true)
3585 .Case("sentinel", true)
3586 .Case("shift-overflow", true)
3587 .Case("shift-sign-overflow", true)
3588 .Case("sign-conversion", true)
3589 .Case("sizeof-array-argument", true)
3590 .Case("sizeof-pointer-memaccess", true)
3591 .Case("string-compare", true)
3592 .Case("super-class-method-mismatch", true)
3593 .Case("tautological-compare", true)
3594 .Case("typedef-redefinition", true)
3595 .Case("typename-missing", true)
3596 .Case("undefined-reinterpret-cast", true)
3597 .Case("unknown-warning-option", true)
3598 .Case("unnamed-type-template-args", true)
3599 .Case("unneeded-internal-declaration", true)
3600 .Case("unneeded-member-function", true)
3601 .Case("unused-comparison", true)
3602 .Case("unused-exception-parameter", true)
3603 .Case("unused-member-function", true)
3604 .Case("unused-result", true)
3605 .Case("vector-conversions", true)
3606 .Case("vla", true)
3607 .Case("used-but-marked-unused", true)
3608 .Case("weak-vtables", true)
3609 .Default(false);
3610 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003611 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003612 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003613 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003614 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003615 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003616 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003617 }
3618}
3619
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003620void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003621 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003622 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003623
3624 CheckCodeGenerationOptions(D, Args);
3625
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003626 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003627 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3628 !Args.hasArg(options::OPT_mdynamic_no_pic))
3629 CmdArgs.push_back("-fPIC");
3630
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003631 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3632 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3633 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3634 CmdArgs.push_back("-fno-builtin-strcat");
3635 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3636 CmdArgs.push_back("-fno-builtin-strcpy");
3637 }
3638
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003639 if (Args.hasArg(options::OPT_g_Flag) &&
3640 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3641 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3642}
3643
3644void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3645 const InputInfoList &Inputs,
3646 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003647 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003648
3649 // Derived from cc1_options spec.
3650 if (Args.hasArg(options::OPT_fast) ||
3651 Args.hasArg(options::OPT_fastf) ||
3652 Args.hasArg(options::OPT_fastcp))
3653 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003654
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003655 if (Arg *A = Args.getLastArg(options::OPT_pg))
3656 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003657 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003658 << A->getAsString(Args) << "-fomit-frame-pointer";
3659
3660 AddCC1Args(Args, CmdArgs);
3661
3662 if (!Args.hasArg(options::OPT_Q))
3663 CmdArgs.push_back("-quiet");
3664
3665 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003666 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003667
3668 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3669
3670 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3671 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3672
3673 // FIXME: The goal is to use the user provided -o if that is our
3674 // final output, otherwise to drive from the original input
3675 // name. Find a clean way to go about this.
3676 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3677 Args.hasArg(options::OPT_o)) {
3678 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3679 CmdArgs.push_back("-auxbase-strip");
3680 CmdArgs.push_back(OutputOpt->getValue(Args));
3681 } else {
3682 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003683 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003684 }
3685
3686 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3687
3688 Args.AddAllArgs(CmdArgs, options::OPT_O);
3689 // FIXME: -Wall is getting some special treatment. Investigate.
3690 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3691 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003692 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003693 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003694 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3695 // Honor -std-default.
3696 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3697 "-std=", /*Joined=*/true);
3698 }
3699
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003700 if (Args.hasArg(options::OPT_v))
3701 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003702 if (Args.hasArg(options::OPT_pg) &&
3703 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003704 CmdArgs.push_back("-p");
3705 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003706
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003707 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003708 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3709 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3710 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3711 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3712 //
3713 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003714 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3715 options::OPT_fsyntax_only),
3716 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003717 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3718 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3719 (*it)->claim();
3720 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003721 }
3722 }
3723 } else
3724 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003725
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003726 // Claim Clang only -f options, they aren't worth warning about.
3727 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3728
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003729 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3730 if (Args.hasArg(options::OPT_Qn))
3731 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003732
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003733 // FIXME: This isn't correct.
3734 //Args.AddLastArg(CmdArgs, options::OPT__help)
3735 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3736
3737 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3738
3739 // FIXME: Still don't get what is happening here. Investigate.
3740 Args.AddAllArgs(CmdArgs, options::OPT__param);
3741
3742 if (Args.hasArg(options::OPT_fmudflap) ||
3743 Args.hasArg(options::OPT_fmudflapth)) {
3744 CmdArgs.push_back("-fno-builtin");
3745 CmdArgs.push_back("-fno-merge-constants");
3746 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003747
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003748 if (Args.hasArg(options::OPT_coverage)) {
3749 CmdArgs.push_back("-fprofile-arcs");
3750 CmdArgs.push_back("-ftest-coverage");
3751 }
3752
3753 if (types::isCXX(Inputs[0].getType()))
3754 CmdArgs.push_back("-D__private_extern__=extern");
3755}
3756
3757void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3758 const InputInfoList &Inputs,
3759 const ArgStringList &OutputArgs) const {
3760 // Derived from cpp_options
3761 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003762
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003763 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3764
3765 AddCC1Args(Args, CmdArgs);
3766
3767 // NOTE: The code below has some commonality with cpp_options, but
3768 // in classic gcc style ends up sending things in different
3769 // orders. This may be a good merge candidate once we drop pedantic
3770 // compatibility.
3771
3772 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003773 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003774 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003775 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3776 // Honor -std-default.
3777 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3778 "-std=", /*Joined=*/true);
3779 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003780 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3781 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003782
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003783 // The driver treats -fsyntax-only specially.
3784 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3785
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003786 // Claim Clang only -f options, they aren't worth warning about.
3787 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3788
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003789 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3790 !Args.hasArg(options::OPT_fno_working_directory))
3791 CmdArgs.push_back("-fworking-directory");
3792
3793 Args.AddAllArgs(CmdArgs, options::OPT_O);
3794 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3795 if (Args.hasArg(options::OPT_save_temps))
3796 CmdArgs.push_back("-fpch-preprocess");
3797}
3798
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003799void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003800 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003801 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003802 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003803
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003804 CheckPreprocessingOptions(D, Args);
3805
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003806 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003807 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3808 Args.AddLastArg(CmdArgs, options::OPT_C);
3809 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003810 if (!Args.hasArg(options::OPT_Q))
3811 CmdArgs.push_back("-quiet");
3812 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003813 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003814 Args.AddLastArg(CmdArgs, options::OPT_v);
3815 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3816 Args.AddLastArg(CmdArgs, options::OPT_P);
3817
3818 // FIXME: Handle %I properly.
3819 if (getToolChain().getArchName() == "x86_64") {
3820 CmdArgs.push_back("-imultilib");
3821 CmdArgs.push_back("x86_64");
3822 }
3823
3824 if (Args.hasArg(options::OPT_MD)) {
3825 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003826 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003827 }
3828
3829 if (Args.hasArg(options::OPT_MMD)) {
3830 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003831 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003832 }
3833
3834 Args.AddLastArg(CmdArgs, options::OPT_M);
3835 Args.AddLastArg(CmdArgs, options::OPT_MM);
3836 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3837 Args.AddLastArg(CmdArgs, options::OPT_MG);
3838 Args.AddLastArg(CmdArgs, options::OPT_MP);
3839 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3840 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3841 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3842 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3843 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3844 CmdArgs.push_back("-MQ");
3845 CmdArgs.push_back(OutputOpt->getValue(Args));
3846 }
3847 }
3848
3849 Args.AddLastArg(CmdArgs, options::OPT_remap);
3850 if (Args.hasArg(options::OPT_g3))
3851 CmdArgs.push_back("-dD");
3852 Args.AddLastArg(CmdArgs, options::OPT_H);
3853
3854 AddCPPArgs(Args, CmdArgs);
3855
3856 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3857 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3858
3859 for (InputInfoList::const_iterator
3860 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3861 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003862
Daniel Dunbarb440f562010-08-02 02:38:21 +00003863 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003864 }
3865
3866 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3867 options::OPT_Xpreprocessor);
3868
3869 if (Args.hasArg(options::OPT_fmudflap)) {
3870 CmdArgs.push_back("-D_MUDFLAP");
3871 CmdArgs.push_back("-include");
3872 CmdArgs.push_back("mf-runtime.h");
3873 }
3874
3875 if (Args.hasArg(options::OPT_fmudflapth)) {
3876 CmdArgs.push_back("-D_MUDFLAP");
3877 CmdArgs.push_back("-D_MUDFLAPTH");
3878 CmdArgs.push_back("-include");
3879 CmdArgs.push_back("mf-runtime.h");
3880 }
3881}
3882
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003883void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003884 ArgStringList &CmdArgs) const {
3885 // Derived from cpp spec.
3886
3887 if (Args.hasArg(options::OPT_static)) {
3888 // The gcc spec is broken here, it refers to dynamic but
3889 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003890
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003891 // if (!Args.hasArg(arglist.parser.dynamicOption))
3892 CmdArgs.push_back("-D__STATIC__");
3893 } else
3894 CmdArgs.push_back("-D__DYNAMIC__");
3895
3896 if (Args.hasArg(options::OPT_pthread))
3897 CmdArgs.push_back("-D_REENTRANT");
3898}
3899
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003900void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003901 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003902 const InputInfoList &Inputs,
3903 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003904 const char *LinkingOutput) const {
3905 ArgStringList CmdArgs;
3906
3907 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3908
3909 CmdArgs.push_back("-E");
3910
3911 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003912 Args.hasArg(options::OPT_traditional_cpp))
3913 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003914
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003915 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003916 assert(Output.isFilename() && "Unexpected CC1 output.");
3917 OutputArgs.push_back("-o");
3918 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003919
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003920 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003921 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3922 } else {
3923 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3924 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3925 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003926
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003927 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3928
Chad Rosierc31e48d2011-09-08 00:38:00 +00003929 RemoveCC1UnsupportedArgs(CmdArgs);
3930
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003931 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003932 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003933 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003934 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003935}
3936
3937void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003938 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003939 const InputInfoList &Inputs,
3940 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003941 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003942 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003943 ArgStringList CmdArgs;
3944
3945 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3946
Bob Wilson0090df22012-04-01 23:03:29 +00003947 // Silence warning about unused --serialize-diagnostics
3948 Args.ClaimAllArgs(options::OPT__serialize_diags);
3949
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003950 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003951 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003952 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003953 << A->getAsString(Args) << "-E";
3954
Daniel Dunbar24e52992010-06-07 23:28:45 +00003955 if (JA.getType() == types::TY_LLVM_IR ||
3956 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003957 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003958 else if (JA.getType() == types::TY_LLVM_BC ||
3959 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003960 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003961 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003962 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003963 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003964 else if (JA.getType() != types::TY_PP_Asm &&
3965 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003967 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003968
3969 ArgStringList OutputArgs;
3970 if (Output.getType() != types::TY_PCH) {
3971 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003972 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003973 OutputArgs.push_back("/dev/null");
3974 else
3975 OutputArgs.push_back(Output.getFilename());
3976 }
3977
3978 // There is no need for this level of compatibility, but it makes
3979 // diffing easier.
3980 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3981 Args.hasArg(options::OPT_S));
3982
3983 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003984 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003985 if (OutputArgsEarly) {
3986 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3987 } else {
3988 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3989 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3990 }
3991 } else {
3992 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003993
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003994 for (InputInfoList::const_iterator
3995 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3996 const InputInfo &II = *it;
3997
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003998 // Reject AST inputs.
3999 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004000 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004001 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004002 return;
4003 }
4004
Daniel Dunbarb440f562010-08-02 02:38:21 +00004005 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004006 }
4007
4008 if (OutputArgsEarly) {
4009 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4010 } else {
4011 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4012 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4013 }
4014 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004015
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004016 if (Output.getType() == types::TY_PCH) {
4017 assert(Output.isFilename() && "Invalid PCH output.");
4018
4019 CmdArgs.push_back("-o");
4020 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4021 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004022 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004023 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004024 C.addTempFile(TmpPath);
4025 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004026
Eric Christopher84fbdb42011-08-19 00:30:14 +00004027 // If we're emitting a pch file with the last 4 characters of ".pth"
4028 // and falling back to llvm-gcc we want to use ".gch" instead.
4029 std::string OutputFile(Output.getFilename());
4030 size_t loc = OutputFile.rfind(".pth");
4031 if (loc != std::string::npos)
4032 OutputFile.replace(loc, 4, ".gch");
4033 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4034 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004035 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004036
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004037 RemoveCC1UnsupportedArgs(CmdArgs);
4038
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004039 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004040 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004041 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004042 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004043}
4044
Daniel Dunbarbe220842009-03-20 16:06:39 +00004045void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004046 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004047 const InputInfoList &Inputs,
4048 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004049 const char *LinkingOutput) const {
4050 ArgStringList CmdArgs;
4051
4052 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4053 const InputInfo &Input = Inputs[0];
4054
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004055 // Determine the original source input.
4056 const Action *SourceAction = &JA;
4057 while (SourceAction->getKind() != Action::InputClass) {
4058 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4059 SourceAction = SourceAction->getInputs()[0];
4060 }
4061
4062 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004063 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004064 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004065 if (Args.hasArg(options::OPT_gstabs))
4066 CmdArgs.push_back("--gstabs");
4067 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004068 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004069 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004070
Daniel Dunbarbe220842009-03-20 16:06:39 +00004071 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004072 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004073
Daniel Dunbar6d484762010-07-22 01:47:22 +00004074 // Use -force_cpusubtype_ALL on x86 by default.
4075 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4076 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004077 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4078 CmdArgs.push_back("-force_cpusubtype_ALL");
4079
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004080 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4081 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004082 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004083 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004084 CmdArgs.push_back("-static");
4085
Daniel Dunbarbe220842009-03-20 16:06:39 +00004086 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4087 options::OPT_Xassembler);
4088
4089 assert(Output.isFilename() && "Unexpected lipo output.");
4090 CmdArgs.push_back("-o");
4091 CmdArgs.push_back(Output.getFilename());
4092
Daniel Dunbarb440f562010-08-02 02:38:21 +00004093 assert(Input.isFilename() && "Invalid input.");
4094 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004095
4096 // asm_final spec is empty.
4097
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004098 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004099 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004100 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004101}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004102
David Blaikie68e081d2011-12-20 02:48:34 +00004103void darwin::DarwinTool::anchor() {}
4104
Daniel Dunbare9ded432009-09-09 18:36:20 +00004105void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4106 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004107 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004108
Daniel Dunbarc1964212009-03-26 16:23:12 +00004109 // Derived from darwin_arch spec.
4110 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004111 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004112
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004113 // FIXME: Is this needed anymore?
4114 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004115 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004116}
4117
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004118void darwin::Link::AddLinkArgs(Compilation &C,
4119 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004120 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004121 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004122 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004123
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004124 unsigned Version[3] = { 0, 0, 0 };
4125 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4126 bool HadExtra;
4127 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4128 Version[1], Version[2], HadExtra) ||
4129 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004130 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004131 << A->getAsString(Args);
4132 }
4133
4134 // Newer linkers support -demangle, pass it if supported and not disabled by
4135 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004136 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004137 // Don't pass -demangle to ld_classic.
4138 //
4139 // FIXME: This is a temporary workaround, ld should be handling this.
4140 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4141 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004142 if (getToolChain().getArch() == llvm::Triple::x86) {
4143 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4144 options::OPT_Wl_COMMA),
4145 ie = Args.filtered_end(); it != ie; ++it) {
4146 const Arg *A = *it;
4147 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004148 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004149 UsesLdClassic = true;
4150 }
4151 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004152 if (!UsesLdClassic)
4153 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004154 }
4155
Daniel Dunbaref889c72011-06-21 20:55:11 +00004156 // If we are using LTO, then automatically create a temporary file path for
4157 // the linker to use, so that it's lifetime will extend past a possible
4158 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004159 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004160 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004161 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004162 C.addTempFile(TmpPath);
4163 CmdArgs.push_back("-object_path_lto");
4164 CmdArgs.push_back(TmpPath);
4165 }
4166
Daniel Dunbarc1964212009-03-26 16:23:12 +00004167 // Derived from the "link" spec.
4168 Args.AddAllArgs(CmdArgs, options::OPT_static);
4169 if (!Args.hasArg(options::OPT_static))
4170 CmdArgs.push_back("-dynamic");
4171 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4172 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4173 // here. How do we wish to handle such things?
4174 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004175
Daniel Dunbarc1964212009-03-26 16:23:12 +00004176 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004177 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004178 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004179 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004180
4181 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4182 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4183 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4184
4185 Arg *A;
4186 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4187 (A = Args.getLastArg(options::OPT_current__version)) ||
4188 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004189 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004190 << A->getAsString(Args) << "-dynamiclib";
4191
4192 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4193 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4194 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4195 } else {
4196 CmdArgs.push_back("-dylib");
4197
4198 Arg *A;
4199 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4200 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4201 (A = Args.getLastArg(options::OPT_client__name)) ||
4202 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4203 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4204 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004205 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004206 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004207
Daniel Dunbarc1964212009-03-26 16:23:12 +00004208 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4209 "-dylib_compatibility_version");
4210 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4211 "-dylib_current_version");
4212
Daniel Dunbara48823f2010-01-22 02:04:52 +00004213 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004214
4215 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4216 "-dylib_install_name");
4217 }
4218
4219 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4220 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4221 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004222 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004223 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004224 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4225 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4226 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4227 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4228 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4229 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004230 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004231 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4232 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4233 Args.AddAllArgs(CmdArgs, options::OPT_init);
4234
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004235 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004236 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004237
4238 // If we had an explicit -mios-simulator-version-min argument, honor that,
4239 // otherwise use the traditional deployment targets. We can't just check the
4240 // is-sim attribute because existing code follows this path, and the linker
4241 // may not handle the argument.
4242 //
4243 // FIXME: We may be able to remove this, once we can verify no one depends on
4244 // it.
4245 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4246 CmdArgs.push_back("-ios_simulator_version_min");
4247 else if (DarwinTC.isTargetIPhoneOS())
4248 CmdArgs.push_back("-iphoneos_version_min");
4249 else
4250 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004251 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004252
Daniel Dunbarc1964212009-03-26 16:23:12 +00004253 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4254 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4255 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4256 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4257 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004258
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004259 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4260 options::OPT_fno_pie,
4261 options::OPT_fno_PIE)) {
4262 if (A->getOption().matches(options::OPT_fpie) ||
4263 A->getOption().matches(options::OPT_fPIE))
4264 CmdArgs.push_back("-pie");
4265 else
4266 CmdArgs.push_back("-no_pie");
4267 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004268
4269 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4270 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4271 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4272 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4273 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4274 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4275 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4276 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4277 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4278 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4279 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4280 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4281 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4282 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4283 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4284 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004285
Daniel Dunbar84384642011-05-02 21:03:47 +00004286 // Give --sysroot= preference, over the Apple specific behavior to also use
4287 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004288 StringRef sysroot = C.getSysRoot();
4289 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004290 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004291 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004292 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4293 CmdArgs.push_back("-syslibroot");
4294 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004295 }
4296
Daniel Dunbarc1964212009-03-26 16:23:12 +00004297 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4298 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4299 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4300 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4301 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004302 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004303 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4304 Args.AddAllArgs(CmdArgs, options::OPT_y);
4305 Args.AddLastArg(CmdArgs, options::OPT_w);
4306 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4307 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4308 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4309 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4310 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4311 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4312 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4313 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4314 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4315 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4316 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4317 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4318}
4319
4320void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004321 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004322 const InputInfoList &Inputs,
4323 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004324 const char *LinkingOutput) const {
4325 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004326
Daniel Dunbarc1964212009-03-26 16:23:12 +00004327 // The logic here is derived from gcc's behavior; most of which
4328 // comes from specs (starting with link_command). Consult gcc for
4329 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004330 ArgStringList CmdArgs;
4331
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004332 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4333 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4334 options::OPT_ccc_arcmt_migrate)) {
4335 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4336 (*I)->claim();
4337 const char *Exec =
4338 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4339 CmdArgs.push_back(Output.getFilename());
4340 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4341 return;
4342 }
4343
Daniel Dunbarc1964212009-03-26 16:23:12 +00004344 // I'm not sure why this particular decomposition exists in gcc, but
4345 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004346 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004347
Daniel Dunbarc1964212009-03-26 16:23:12 +00004348 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4349 Args.AddAllArgs(CmdArgs, options::OPT_s);
4350 Args.AddAllArgs(CmdArgs, options::OPT_t);
4351 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4352 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004353 Args.AddLastArg(CmdArgs, options::OPT_e);
4354 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4355 Args.AddAllArgs(CmdArgs, options::OPT_r);
4356
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004357 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4358 // members of static archive libraries which implement Objective-C classes or
4359 // categories.
4360 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4361 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004362
Daniel Dunbarc1964212009-03-26 16:23:12 +00004363 CmdArgs.push_back("-o");
4364 CmdArgs.push_back(Output.getFilename());
4365
Chad Rosier06fd3c62012-05-16 23:45:12 +00004366 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004367 !Args.hasArg(options::OPT_nostartfiles)) {
4368 // Derived from startfile spec.
4369 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004370 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004371 if (getDarwinToolChain().isTargetIOSSimulator()) {
4372 // The simulator doesn't have a versioned crt1 file.
4373 CmdArgs.push_back("-ldylib1.o");
4374 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004375 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4376 CmdArgs.push_back("-ldylib1.o");
4377 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004378 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004379 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004380 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004381 CmdArgs.push_back("-ldylib1.10.5.o");
4382 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004383 } else {
4384 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004385 if (!Args.hasArg(options::OPT_static)) {
4386 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004387 if (getDarwinToolChain().isTargetIOSSimulator()) {
4388 // The simulator doesn't have a versioned crt1 file.
4389 CmdArgs.push_back("-lbundle1.o");
4390 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004391 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4392 CmdArgs.push_back("-lbundle1.o");
4393 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004394 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004395 CmdArgs.push_back("-lbundle1.o");
4396 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004397 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004398 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004399 if (Args.hasArg(options::OPT_pg) &&
4400 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004401 if (Args.hasArg(options::OPT_static) ||
4402 Args.hasArg(options::OPT_object) ||
4403 Args.hasArg(options::OPT_preload)) {
4404 CmdArgs.push_back("-lgcrt0.o");
4405 } else {
4406 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004407
Daniel Dunbarc1964212009-03-26 16:23:12 +00004408 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004409 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004410 // By default on OS X 10.8 and later, we don't link with a crt1.o
4411 // file and the linker knows to use _main as the entry point. But,
4412 // when compiling with -pg, we need to link with the gcrt1.o file,
4413 // so pass the -no_new_main option to tell the linker to use the
4414 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004415 if (getDarwinToolChain().isTargetMacOS() &&
4416 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4417 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004418 } else {
4419 if (Args.hasArg(options::OPT_static) ||
4420 Args.hasArg(options::OPT_object) ||
4421 Args.hasArg(options::OPT_preload)) {
4422 CmdArgs.push_back("-lcrt0.o");
4423 } else {
4424 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004425 if (getDarwinToolChain().isTargetIOSSimulator()) {
4426 // The simulator doesn't have a versioned crt1 file.
4427 CmdArgs.push_back("-lcrt1.o");
4428 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004429 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4430 CmdArgs.push_back("-lcrt1.o");
4431 else
4432 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004433 } else {
4434 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4435 CmdArgs.push_back("-lcrt1.o");
4436 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4437 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004438 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004439 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004440
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004441 // darwin_crt2 spec is empty.
4442 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004443 }
4444 }
4445 }
4446 }
4447
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004448 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4449 Args.hasArg(options::OPT_shared_libgcc) &&
4450 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004451 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004452 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004453 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004454 }
4455 }
4456
4457 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004458
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004459 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4460 // symbols may appear. Mark all of them as dynamic_lookup.
4461 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4462 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4463 options::OPT_fno_address_sanitizer, false)) {
4464 if (Args.hasArg(options::OPT_dynamiclib) ||
4465 Args.hasArg(options::OPT_bundle)) {
4466 CmdArgs.push_back("-undefined");
4467 CmdArgs.push_back("dynamic_lookup");
4468 }
4469 }
4470
Daniel Dunbarc1964212009-03-26 16:23:12 +00004471 if (Args.hasArg(options::OPT_fopenmp))
4472 // This is more complicated in gcc...
4473 CmdArgs.push_back("-lgomp");
4474
Douglas Gregor9295df02012-05-15 21:00:27 +00004475 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4476
Bob Wilson16d93952012-05-15 18:57:39 +00004477 if (isObjCRuntimeLinked(Args) &&
4478 !Args.hasArg(options::OPT_nostdlib) &&
4479 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004480 // Avoid linking compatibility stubs on i386 mac.
4481 if (!getDarwinToolChain().isTargetMacOS() ||
4482 getDarwinToolChain().getArchName() != "i386") {
4483 // If we don't have ARC or subscripting runtime support, link in the
4484 // runtime stubs. We have to do this *before* adding any of the normal
4485 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004486 ObjCRuntime runtime =
4487 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004488 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004489 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004490 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004491 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004492 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004493 CmdArgs.push_back("-framework");
4494 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004495 // Link libobj.
4496 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004497 }
John McCall31168b02011-06-15 23:02:42 +00004498
Daniel Dunbarc1964212009-03-26 16:23:12 +00004499 if (LinkingOutput) {
4500 CmdArgs.push_back("-arch_multiple");
4501 CmdArgs.push_back("-final_output");
4502 CmdArgs.push_back(LinkingOutput);
4503 }
4504
Daniel Dunbarc1964212009-03-26 16:23:12 +00004505 if (Args.hasArg(options::OPT_fnested_functions))
4506 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004507
Daniel Dunbarc1964212009-03-26 16:23:12 +00004508 if (!Args.hasArg(options::OPT_nostdlib) &&
4509 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004510 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004511 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004512
Daniel Dunbarc1964212009-03-26 16:23:12 +00004513 // link_ssp spec is empty.
4514
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004515 // Let the tool chain choose which runtime library to link.
4516 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004517 }
4518
Chad Rosier06fd3c62012-05-16 23:45:12 +00004519 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004520 !Args.hasArg(options::OPT_nostartfiles)) {
4521 // endfile_spec is empty.
4522 }
4523
4524 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4525 Args.AddAllArgs(CmdArgs, options::OPT_F);
4526
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004527 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004528 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004529 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004530}
4531
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004532void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004533 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004534 const InputInfoList &Inputs,
4535 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004536 const char *LinkingOutput) const {
4537 ArgStringList CmdArgs;
4538
4539 CmdArgs.push_back("-create");
4540 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004541
4542 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004543 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004544
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004545 for (InputInfoList::const_iterator
4546 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4547 const InputInfo &II = *it;
4548 assert(II.isFilename() && "Unexpected lipo input.");
4549 CmdArgs.push_back(II.getFilename());
4550 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004551 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004552 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004553 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004554}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004555
Daniel Dunbar88299622010-06-04 18:28:36 +00004556void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004557 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004558 const InputInfoList &Inputs,
4559 const ArgList &Args,
4560 const char *LinkingOutput) const {
4561 ArgStringList CmdArgs;
4562
Daniel Dunbareb86b042011-05-09 17:23:16 +00004563 CmdArgs.push_back("-o");
4564 CmdArgs.push_back(Output.getFilename());
4565
Daniel Dunbar88299622010-06-04 18:28:36 +00004566 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4567 const InputInfo &Input = Inputs[0];
4568 assert(Input.isFilename() && "Unexpected dsymutil input.");
4569 CmdArgs.push_back(Input.getFilename());
4570
Daniel Dunbar88299622010-06-04 18:28:36 +00004571 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004572 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004573 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004574}
4575
Eric Christopher551ef452011-08-23 17:56:55 +00004576void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4577 const InputInfo &Output,
4578 const InputInfoList &Inputs,
4579 const ArgList &Args,
4580 const char *LinkingOutput) const {
4581 ArgStringList CmdArgs;
4582 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004583 CmdArgs.push_back("--debug-info");
4584 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004585 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004586
4587 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4588 const InputInfo &Input = Inputs[0];
4589 assert(Input.isFilename() && "Unexpected verify input");
4590
4591 // Grabbing the output of the earlier dsymutil run.
4592 CmdArgs.push_back(Input.getFilename());
4593
4594 const char *Exec =
4595 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4596 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4597}
4598
David Chisnallf571cde2012-02-15 13:39:01 +00004599void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4600 const InputInfo &Output,
4601 const InputInfoList &Inputs,
4602 const ArgList &Args,
4603 const char *LinkingOutput) const {
4604 ArgStringList CmdArgs;
4605
4606 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4607 options::OPT_Xassembler);
4608
4609 CmdArgs.push_back("-o");
4610 CmdArgs.push_back(Output.getFilename());
4611
4612 for (InputInfoList::const_iterator
4613 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4614 const InputInfo &II = *it;
4615 CmdArgs.push_back(II.getFilename());
4616 }
4617
4618 const char *Exec =
4619 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4620 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4621}
4622
4623
4624void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4625 const InputInfo &Output,
4626 const InputInfoList &Inputs,
4627 const ArgList &Args,
4628 const char *LinkingOutput) const {
4629 // FIXME: Find a real GCC, don't hard-code versions here
4630 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4631 const llvm::Triple &T = getToolChain().getTriple();
4632 std::string LibPath = "/usr/lib/";
4633 llvm::Triple::ArchType Arch = T.getArch();
4634 switch (Arch) {
4635 case llvm::Triple::x86:
4636 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4637 T.getOSName()).str() + "/4.5.2/";
4638 break;
4639 case llvm::Triple::x86_64:
4640 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4641 T.getOSName()).str();
4642 GCCLibPath += "/4.5.2/amd64/";
4643 LibPath += "amd64/";
4644 break;
4645 default:
4646 assert(0 && "Unsupported architecture");
4647 }
4648
4649 ArgStringList CmdArgs;
4650
David Chisnall272a0712012-02-29 15:06:12 +00004651 // Demangle C++ names in errors
4652 CmdArgs.push_back("-C");
4653
David Chisnallf571cde2012-02-15 13:39:01 +00004654 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4655 (!Args.hasArg(options::OPT_shared))) {
4656 CmdArgs.push_back("-e");
4657 CmdArgs.push_back("_start");
4658 }
4659
4660 if (Args.hasArg(options::OPT_static)) {
4661 CmdArgs.push_back("-Bstatic");
4662 CmdArgs.push_back("-dn");
4663 } else {
4664 CmdArgs.push_back("-Bdynamic");
4665 if (Args.hasArg(options::OPT_shared)) {
4666 CmdArgs.push_back("-shared");
4667 } else {
4668 CmdArgs.push_back("--dynamic-linker");
4669 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4670 }
4671 }
4672
4673 if (Output.isFilename()) {
4674 CmdArgs.push_back("-o");
4675 CmdArgs.push_back(Output.getFilename());
4676 } else {
4677 assert(Output.isNothing() && "Invalid output.");
4678 }
4679
4680 if (!Args.hasArg(options::OPT_nostdlib) &&
4681 !Args.hasArg(options::OPT_nostartfiles)) {
4682 if (!Args.hasArg(options::OPT_shared)) {
4683 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4684 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004685 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004686 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4687 } else {
4688 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004689 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4690 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004691 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004692 if (getToolChain().getDriver().CCCIsCXX)
4693 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004694 }
4695
4696 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4697
4698 Args.AddAllArgs(CmdArgs, options::OPT_L);
4699 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4700 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004701 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004702
4703 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4704
4705 if (!Args.hasArg(options::OPT_nostdlib) &&
4706 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004707 if (getToolChain().getDriver().CCCIsCXX)
4708 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004709 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004710 if (!Args.hasArg(options::OPT_shared)) {
4711 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004712 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004713 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004714 }
David Chisnallf571cde2012-02-15 13:39:01 +00004715 }
4716
4717 if (!Args.hasArg(options::OPT_nostdlib) &&
4718 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004719 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004720 }
David Chisnall96de9932012-02-16 16:00:47 +00004721 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004722
4723 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4724
4725 const char *Exec =
4726 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4727 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4728}
4729
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004730void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004731 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004732 const InputInfoList &Inputs,
4733 const ArgList &Args,
4734 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004735 ArgStringList CmdArgs;
4736
4737 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4738 options::OPT_Xassembler);
4739
4740 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004741 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004742
4743 for (InputInfoList::const_iterator
4744 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4745 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004746 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004747 }
4748
4749 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004750 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004751 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004752}
4753
4754void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004755 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004756 const InputInfoList &Inputs,
4757 const ArgList &Args,
4758 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004759 ArgStringList CmdArgs;
4760
4761 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004762 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004763 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004764 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004765 }
4766
4767 if (Args.hasArg(options::OPT_static)) {
4768 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004769 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004770 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004771// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004772 CmdArgs.push_back("-Bdynamic");
4773 if (Args.hasArg(options::OPT_shared)) {
4774 CmdArgs.push_back("-shared");
4775 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004776 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004777 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4778 }
4779 }
4780
Daniel Dunbarb440f562010-08-02 02:38:21 +00004781 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004782 CmdArgs.push_back("-o");
4783 CmdArgs.push_back(Output.getFilename());
4784 } else {
4785 assert(Output.isNothing() && "Invalid output.");
4786 }
4787
4788 if (!Args.hasArg(options::OPT_nostdlib) &&
4789 !Args.hasArg(options::OPT_nostartfiles)) {
4790 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004791 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004792 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004793 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004794 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004795 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004796 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004797 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004798 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004799 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004800 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004801 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004802 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004803 }
4804
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004805 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4806 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004807 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004808
4809 Args.AddAllArgs(CmdArgs, options::OPT_L);
4810 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4811 Args.AddAllArgs(CmdArgs, options::OPT_e);
4812
Daniel Dunbar54423b22010-09-17 00:24:54 +00004813 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004814
4815 if (!Args.hasArg(options::OPT_nostdlib) &&
4816 !Args.hasArg(options::OPT_nodefaultlibs)) {
4817 // FIXME: For some reason GCC passes -lgcc before adding
4818 // the default system libraries. Just mimic this for now.
4819 CmdArgs.push_back("-lgcc");
4820
4821 if (Args.hasArg(options::OPT_pthread))
4822 CmdArgs.push_back("-pthread");
4823 if (!Args.hasArg(options::OPT_shared))
4824 CmdArgs.push_back("-lc");
4825 CmdArgs.push_back("-lgcc");
4826 }
4827
4828 if (!Args.hasArg(options::OPT_nostdlib) &&
4829 !Args.hasArg(options::OPT_nostartfiles)) {
4830 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004831 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004832 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004833 }
4834
Bill Wendling08760582011-06-27 19:15:03 +00004835 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004836
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004837 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004838 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004839 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004840}
4841
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004842void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004843 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004844 const InputInfoList &Inputs,
4845 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004846 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004847 ArgStringList CmdArgs;
4848
4849 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4850 options::OPT_Xassembler);
4851
4852 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004853 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004854
4855 for (InputInfoList::const_iterator
4856 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4857 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004858 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004859 }
4860
4861 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004862 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004863 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004864}
4865
4866void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004867 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004868 const InputInfoList &Inputs,
4869 const ArgList &Args,
4870 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004871 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004872 ArgStringList CmdArgs;
4873
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004874 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004875 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004876 CmdArgs.push_back("-e");
4877 CmdArgs.push_back("__start");
4878 }
4879
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004880 if (Args.hasArg(options::OPT_static)) {
4881 CmdArgs.push_back("-Bstatic");
4882 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004883 if (Args.hasArg(options::OPT_rdynamic))
4884 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004885 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004886 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004887 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004888 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004889 } else {
4890 CmdArgs.push_back("-dynamic-linker");
4891 CmdArgs.push_back("/usr/libexec/ld.so");
4892 }
4893 }
4894
Daniel Dunbarb440f562010-08-02 02:38:21 +00004895 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004896 CmdArgs.push_back("-o");
4897 CmdArgs.push_back(Output.getFilename());
4898 } else {
4899 assert(Output.isNothing() && "Invalid output.");
4900 }
4901
4902 if (!Args.hasArg(options::OPT_nostdlib) &&
4903 !Args.hasArg(options::OPT_nostartfiles)) {
4904 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004905 if (Args.hasArg(options::OPT_pg))
4906 CmdArgs.push_back(Args.MakeArgString(
4907 getToolChain().GetFilePath("gcrt0.o")));
4908 else
4909 CmdArgs.push_back(Args.MakeArgString(
4910 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004911 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004912 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004913 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004914 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004915 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004916 }
4917 }
4918
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004919 std::string Triple = getToolChain().getTripleString();
4920 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004921 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004922 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004923 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004924
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004925 Args.AddAllArgs(CmdArgs, options::OPT_L);
4926 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4927 Args.AddAllArgs(CmdArgs, options::OPT_e);
4928
Daniel Dunbar54423b22010-09-17 00:24:54 +00004929 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004930
4931 if (!Args.hasArg(options::OPT_nostdlib) &&
4932 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004933 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004934 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004935 if (Args.hasArg(options::OPT_pg))
4936 CmdArgs.push_back("-lm_p");
4937 else
4938 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004939 }
4940
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004941 // FIXME: For some reason GCC passes -lgcc before adding
4942 // the default system libraries. Just mimic this for now.
4943 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004944
4945 if (Args.hasArg(options::OPT_pthread))
Chris Lattnerd0257f72011-02-21 18:36:51 +00004946 CmdArgs.push_back("-lpthread");
Chandler Carruth45661652011-12-17 22:32:42 +00004947 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004948 if (Args.hasArg(options::OPT_pg))
4949 CmdArgs.push_back("-lc_p");
4950 else
4951 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004952 }
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004953 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004954 }
4955
4956 if (!Args.hasArg(options::OPT_nostdlib) &&
4957 !Args.hasArg(options::OPT_nostartfiles)) {
4958 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004959 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004960 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004961 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004962 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004963 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004964 }
4965
4966 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004967 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004968 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004969}
Ed Schoutene33194b2009-04-02 19:13:12 +00004970
Eli Friedman9fa28852012-08-08 23:57:20 +00004971void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4972 const InputInfo &Output,
4973 const InputInfoList &Inputs,
4974 const ArgList &Args,
4975 const char *LinkingOutput) const {
4976 ArgStringList CmdArgs;
4977
4978 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4979 options::OPT_Xassembler);
4980
4981 CmdArgs.push_back("-o");
4982 CmdArgs.push_back(Output.getFilename());
4983
4984 for (InputInfoList::const_iterator
4985 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4986 const InputInfo &II = *it;
4987 CmdArgs.push_back(II.getFilename());
4988 }
4989
4990 const char *Exec =
4991 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4992 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4993}
4994
4995void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
4996 const InputInfo &Output,
4997 const InputInfoList &Inputs,
4998 const ArgList &Args,
4999 const char *LinkingOutput) const {
5000 const Driver &D = getToolChain().getDriver();
5001 ArgStringList CmdArgs;
5002
5003 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5004 (!Args.hasArg(options::OPT_shared))) {
5005 CmdArgs.push_back("-e");
5006 CmdArgs.push_back("__start");
5007 }
5008
5009 if (Args.hasArg(options::OPT_static)) {
5010 CmdArgs.push_back("-Bstatic");
5011 } else {
5012 if (Args.hasArg(options::OPT_rdynamic))
5013 CmdArgs.push_back("-export-dynamic");
5014 CmdArgs.push_back("--eh-frame-hdr");
5015 CmdArgs.push_back("-Bdynamic");
5016 if (Args.hasArg(options::OPT_shared)) {
5017 CmdArgs.push_back("-shared");
5018 } else {
5019 CmdArgs.push_back("-dynamic-linker");
5020 CmdArgs.push_back("/usr/libexec/ld.so");
5021 }
5022 }
5023
5024 if (Output.isFilename()) {
5025 CmdArgs.push_back("-o");
5026 CmdArgs.push_back(Output.getFilename());
5027 } else {
5028 assert(Output.isNothing() && "Invalid output.");
5029 }
5030
5031 if (!Args.hasArg(options::OPT_nostdlib) &&
5032 !Args.hasArg(options::OPT_nostartfiles)) {
5033 if (!Args.hasArg(options::OPT_shared)) {
5034 if (Args.hasArg(options::OPT_pg))
5035 CmdArgs.push_back(Args.MakeArgString(
5036 getToolChain().GetFilePath("gcrt0.o")));
5037 else
5038 CmdArgs.push_back(Args.MakeArgString(
5039 getToolChain().GetFilePath("crt0.o")));
5040 CmdArgs.push_back(Args.MakeArgString(
5041 getToolChain().GetFilePath("crtbegin.o")));
5042 } else {
5043 CmdArgs.push_back(Args.MakeArgString(
5044 getToolChain().GetFilePath("crtbeginS.o")));
5045 }
5046 }
5047
5048 Args.AddAllArgs(CmdArgs, options::OPT_L);
5049 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5050 Args.AddAllArgs(CmdArgs, options::OPT_e);
5051
5052 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5053
5054 if (!Args.hasArg(options::OPT_nostdlib) &&
5055 !Args.hasArg(options::OPT_nodefaultlibs)) {
5056 if (D.CCCIsCXX) {
5057 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5058 if (Args.hasArg(options::OPT_pg))
5059 CmdArgs.push_back("-lm_p");
5060 else
5061 CmdArgs.push_back("-lm");
5062 }
5063
5064 if (Args.hasArg(options::OPT_pthread))
5065 CmdArgs.push_back("-lpthread");
5066 if (!Args.hasArg(options::OPT_shared)) {
5067 if (Args.hasArg(options::OPT_pg))
5068 CmdArgs.push_back("-lc_p");
5069 else
5070 CmdArgs.push_back("-lc");
5071 }
5072
5073 std::string myarch = "-lclang_rt.";
5074 const llvm::Triple &T = getToolChain().getTriple();
5075 llvm::Triple::ArchType Arch = T.getArch();
5076 switch (Arch) {
5077 case llvm::Triple::arm:
5078 myarch += ("arm");
5079 break;
5080 case llvm::Triple::x86:
5081 myarch += ("i386");
5082 break;
5083 case llvm::Triple::x86_64:
5084 myarch += ("amd64");
5085 break;
5086 default:
5087 assert(0 && "Unsupported architecture");
5088 }
5089 CmdArgs.push_back(Args.MakeArgString(myarch));
5090 }
5091
5092 if (!Args.hasArg(options::OPT_nostdlib) &&
5093 !Args.hasArg(options::OPT_nostartfiles)) {
5094 if (!Args.hasArg(options::OPT_shared))
5095 CmdArgs.push_back(Args.MakeArgString(
5096 getToolChain().GetFilePath("crtend.o")));
5097 else
5098 CmdArgs.push_back(Args.MakeArgString(
5099 getToolChain().GetFilePath("crtendS.o")));
5100 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005101
5102 const char *Exec =
5103 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5104 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005105}
5106
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005107void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005108 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005109 const InputInfoList &Inputs,
5110 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005111 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005112 ArgStringList CmdArgs;
5113
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005114 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5115 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005116 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005117 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005118 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005119 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005120 else if (getToolChain().getArch() == llvm::Triple::mips ||
5121 getToolChain().getArch() == llvm::Triple::mipsel ||
5122 getToolChain().getArch() == llvm::Triple::mips64 ||
5123 getToolChain().getArch() == llvm::Triple::mips64el) {
5124 StringRef CPUName;
5125 StringRef ABIName;
5126 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005127
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005128 CmdArgs.push_back("-march");
5129 CmdArgs.push_back(CPUName.data());
5130
5131 // Convert ABI name to the GNU tools acceptable variant.
5132 if (ABIName == "o32")
5133 ABIName = "32";
5134 else if (ABIName == "n64")
5135 ABIName = "64";
5136
5137 CmdArgs.push_back("-mabi");
5138 CmdArgs.push_back(ABIName.data());
5139
5140 if (getToolChain().getArch() == llvm::Triple::mips ||
5141 getToolChain().getArch() == llvm::Triple::mips64)
5142 CmdArgs.push_back("-EB");
5143 else
5144 CmdArgs.push_back("-EL");
5145
5146 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5147 options::OPT_fpic, options::OPT_fno_pic,
5148 options::OPT_fPIE, options::OPT_fno_PIE,
5149 options::OPT_fpie, options::OPT_fno_pie);
5150 if (LastPICArg &&
5151 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5152 LastPICArg->getOption().matches(options::OPT_fpic) ||
5153 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5154 LastPICArg->getOption().matches(options::OPT_fpie))) {
5155 CmdArgs.push_back("-KPIC");
5156 }
5157 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005158
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5160 options::OPT_Xassembler);
5161
5162 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005163 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005164
5165 for (InputInfoList::const_iterator
5166 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5167 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005168 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005169 }
5170
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005171 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005172 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005173 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005174}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005175
5176void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005177 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005178 const InputInfoList &Inputs,
5179 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005180 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005181 const toolchains::FreeBSD& ToolChain =
5182 static_cast<const toolchains::FreeBSD&>(getToolChain());
5183 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005184 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005185
5186 // Silence warning for "clang -g foo.o -o foo"
5187 Args.ClaimAllArgs(options::OPT_g_Group);
5188 // and "clang -emit-llvm foo.o -o foo"
5189 Args.ClaimAllArgs(options::OPT_emit_llvm);
5190 // and for "clang -w foo.o -o foo". Other warning options are already
5191 // handled somewhere else.
5192 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005193
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005194 if (!D.SysRoot.empty())
5195 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5196
Roman Divackyafe2f232012-08-28 15:09:03 +00005197 if (Args.hasArg(options::OPT_pie))
5198 CmdArgs.push_back("-pie");
5199
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005200 if (Args.hasArg(options::OPT_static)) {
5201 CmdArgs.push_back("-Bstatic");
5202 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005203 if (Args.hasArg(options::OPT_rdynamic))
5204 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005205 CmdArgs.push_back("--eh-frame-hdr");
5206 if (Args.hasArg(options::OPT_shared)) {
5207 CmdArgs.push_back("-Bshareable");
5208 } else {
5209 CmdArgs.push_back("-dynamic-linker");
5210 CmdArgs.push_back("/libexec/ld-elf.so.1");
5211 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005212 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5213 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005214 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5215 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5216 CmdArgs.push_back("--hash-style=both");
5217 }
5218 }
5219 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005220 }
5221
5222 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5223 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005224 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005225 CmdArgs.push_back("-m");
5226 CmdArgs.push_back("elf_i386_fbsd");
5227 }
5228
Roman Divackyafe2f232012-08-28 15:09:03 +00005229 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005230 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005231 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005232 }
5233
Daniel Dunbarb440f562010-08-02 02:38:21 +00005234 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005235 CmdArgs.push_back("-o");
5236 CmdArgs.push_back(Output.getFilename());
5237 } else {
5238 assert(Output.isNothing() && "Invalid output.");
5239 }
5240
5241 if (!Args.hasArg(options::OPT_nostdlib) &&
5242 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005243 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005244 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005245 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005246 crt1 = "gcrt1.o";
5247 else if (Args.hasArg(options::OPT_pie))
5248 crt1 = "Scrt1.o";
5249 else
5250 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005251 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005252 if (crt1)
5253 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5254
5255 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5256
5257 const char *crtbegin = NULL;
5258 if (Args.hasArg(options::OPT_static))
5259 crtbegin = "crtbeginT.o";
5260 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5261 crtbegin = "crtbeginS.o";
5262 else
5263 crtbegin = "crtbegin.o";
5264
5265 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005266 }
5267
5268 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005269 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005270 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5271 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005272 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005273 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5274 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005275 Args.AddAllArgs(CmdArgs, options::OPT_s);
5276 Args.AddAllArgs(CmdArgs, options::OPT_t);
5277 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5278 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005279
Roman Divackyafe2f232012-08-28 15:09:03 +00005280 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005281
5282 if (!Args.hasArg(options::OPT_nostdlib) &&
5283 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005284 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005285 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005286 if (Args.hasArg(options::OPT_pg))
5287 CmdArgs.push_back("-lm_p");
5288 else
5289 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005290 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005291 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5292 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005293 if (Args.hasArg(options::OPT_pg))
5294 CmdArgs.push_back("-lgcc_p");
5295 else
5296 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005297 if (Args.hasArg(options::OPT_static)) {
5298 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005299 } else if (Args.hasArg(options::OPT_pg)) {
5300 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005301 } else {
5302 CmdArgs.push_back("--as-needed");
5303 CmdArgs.push_back("-lgcc_s");
5304 CmdArgs.push_back("--no-as-needed");
5305 }
5306
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005307 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005308 if (Args.hasArg(options::OPT_pg))
5309 CmdArgs.push_back("-lpthread_p");
5310 else
5311 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005312 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005313
Roman Divacky66f22762011-02-10 16:59:40 +00005314 if (Args.hasArg(options::OPT_pg)) {
5315 if (Args.hasArg(options::OPT_shared))
5316 CmdArgs.push_back("-lc");
5317 else
5318 CmdArgs.push_back("-lc_p");
5319 CmdArgs.push_back("-lgcc_p");
5320 } else {
5321 CmdArgs.push_back("-lc");
5322 CmdArgs.push_back("-lgcc");
5323 }
5324
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005325 if (Args.hasArg(options::OPT_static)) {
5326 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005327 } else if (Args.hasArg(options::OPT_pg)) {
5328 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005329 } else {
5330 CmdArgs.push_back("--as-needed");
5331 CmdArgs.push_back("-lgcc_s");
5332 CmdArgs.push_back("--no-as-needed");
5333 }
5334 }
5335
5336 if (!Args.hasArg(options::OPT_nostdlib) &&
5337 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005338 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005339 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005340 else
5341 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005342 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005343 }
5344
Roman Divackyafe2f232012-08-28 15:09:03 +00005345 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005346
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005347 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005348 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005349 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005350}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005351
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005352void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5353 const InputInfo &Output,
5354 const InputInfoList &Inputs,
5355 const ArgList &Args,
5356 const char *LinkingOutput) const {
5357 ArgStringList CmdArgs;
5358
5359 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5360 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005361 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005362 CmdArgs.push_back("--32");
5363
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005364 // Set byte order explicitly
5365 if (getToolChain().getArchName() == "mips")
5366 CmdArgs.push_back("-EB");
5367 else if (getToolChain().getArchName() == "mipsel")
5368 CmdArgs.push_back("-EL");
5369
5370 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5371 options::OPT_Xassembler);
5372
5373 CmdArgs.push_back("-o");
5374 CmdArgs.push_back(Output.getFilename());
5375
5376 for (InputInfoList::const_iterator
5377 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5378 const InputInfo &II = *it;
5379 CmdArgs.push_back(II.getFilename());
5380 }
5381
David Chisnallddbd68f2011-09-27 22:03:18 +00005382 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005383 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5384}
5385
5386void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5387 const InputInfo &Output,
5388 const InputInfoList &Inputs,
5389 const ArgList &Args,
5390 const char *LinkingOutput) const {
5391 const Driver &D = getToolChain().getDriver();
5392 ArgStringList CmdArgs;
5393
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005394 if (!D.SysRoot.empty())
5395 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5396
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005397 if (Args.hasArg(options::OPT_static)) {
5398 CmdArgs.push_back("-Bstatic");
5399 } else {
5400 if (Args.hasArg(options::OPT_rdynamic))
5401 CmdArgs.push_back("-export-dynamic");
5402 CmdArgs.push_back("--eh-frame-hdr");
5403 if (Args.hasArg(options::OPT_shared)) {
5404 CmdArgs.push_back("-Bshareable");
5405 } else {
5406 CmdArgs.push_back("-dynamic-linker");
5407 CmdArgs.push_back("/libexec/ld.elf_so");
5408 }
5409 }
5410
5411 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5412 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005413 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005414 CmdArgs.push_back("-m");
5415 CmdArgs.push_back("elf_i386");
5416 }
5417
5418 if (Output.isFilename()) {
5419 CmdArgs.push_back("-o");
5420 CmdArgs.push_back(Output.getFilename());
5421 } else {
5422 assert(Output.isNothing() && "Invalid output.");
5423 }
5424
5425 if (!Args.hasArg(options::OPT_nostdlib) &&
5426 !Args.hasArg(options::OPT_nostartfiles)) {
5427 if (!Args.hasArg(options::OPT_shared)) {
5428 CmdArgs.push_back(Args.MakeArgString(
5429 getToolChain().GetFilePath("crt0.o")));
5430 CmdArgs.push_back(Args.MakeArgString(
5431 getToolChain().GetFilePath("crti.o")));
5432 CmdArgs.push_back(Args.MakeArgString(
5433 getToolChain().GetFilePath("crtbegin.o")));
5434 } else {
5435 CmdArgs.push_back(Args.MakeArgString(
5436 getToolChain().GetFilePath("crti.o")));
5437 CmdArgs.push_back(Args.MakeArgString(
5438 getToolChain().GetFilePath("crtbeginS.o")));
5439 }
5440 }
5441
5442 Args.AddAllArgs(CmdArgs, options::OPT_L);
5443 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5444 Args.AddAllArgs(CmdArgs, options::OPT_e);
5445 Args.AddAllArgs(CmdArgs, options::OPT_s);
5446 Args.AddAllArgs(CmdArgs, options::OPT_t);
5447 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5448 Args.AddAllArgs(CmdArgs, options::OPT_r);
5449
5450 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5451
5452 if (!Args.hasArg(options::OPT_nostdlib) &&
5453 !Args.hasArg(options::OPT_nodefaultlibs)) {
5454 if (D.CCCIsCXX) {
5455 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5456 CmdArgs.push_back("-lm");
5457 }
5458 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5459 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005460 if (Args.hasArg(options::OPT_static)) {
5461 CmdArgs.push_back("-lgcc_eh");
5462 } else {
5463 CmdArgs.push_back("--as-needed");
5464 CmdArgs.push_back("-lgcc_s");
5465 CmdArgs.push_back("--no-as-needed");
5466 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005467 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005468
5469 if (Args.hasArg(options::OPT_pthread))
5470 CmdArgs.push_back("-lpthread");
5471 CmdArgs.push_back("-lc");
5472
5473 CmdArgs.push_back("-lgcc");
5474 if (Args.hasArg(options::OPT_static)) {
5475 CmdArgs.push_back("-lgcc_eh");
5476 } else {
5477 CmdArgs.push_back("--as-needed");
5478 CmdArgs.push_back("-lgcc_s");
5479 CmdArgs.push_back("--no-as-needed");
5480 }
5481 }
5482
5483 if (!Args.hasArg(options::OPT_nostdlib) &&
5484 !Args.hasArg(options::OPT_nostartfiles)) {
5485 if (!Args.hasArg(options::OPT_shared))
5486 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5487 "crtend.o")));
5488 else
5489 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5490 "crtendS.o")));
5491 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5492 "crtn.o")));
5493 }
5494
Bill Wendling08760582011-06-27 19:15:03 +00005495 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005496
David Chisnallddbd68f2011-09-27 22:03:18 +00005497 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005498 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5499}
5500
Rafael Espindola92b00932010-08-10 00:25:48 +00005501void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5502 const InputInfo &Output,
5503 const InputInfoList &Inputs,
5504 const ArgList &Args,
5505 const char *LinkingOutput) const {
5506 ArgStringList CmdArgs;
5507
5508 // Add --32/--64 to make sure we get the format we want.
5509 // This is incomplete
5510 if (getToolChain().getArch() == llvm::Triple::x86) {
5511 CmdArgs.push_back("--32");
5512 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5513 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005514 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5515 CmdArgs.push_back("-a32");
5516 CmdArgs.push_back("-mppc");
5517 CmdArgs.push_back("-many");
5518 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5519 CmdArgs.push_back("-a64");
5520 CmdArgs.push_back("-mppc64");
5521 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005522 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005523 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005524 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5525 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005526
5527 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5528 getToolChain().getTriple());
5529 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005530
5531 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5532 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5533 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005534 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5535 getToolChain().getArch() == llvm::Triple::mipsel ||
5536 getToolChain().getArch() == llvm::Triple::mips64 ||
5537 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005538 StringRef CPUName;
5539 StringRef ABIName;
5540 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005541
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005542 CmdArgs.push_back("-march");
5543 CmdArgs.push_back(CPUName.data());
5544
5545 // Convert ABI name to the GNU tools acceptable variant.
5546 if (ABIName == "o32")
5547 ABIName = "32";
5548 else if (ABIName == "n64")
5549 ABIName = "64";
5550
5551 CmdArgs.push_back("-mabi");
5552 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005553
5554 if (getToolChain().getArch() == llvm::Triple::mips ||
5555 getToolChain().getArch() == llvm::Triple::mips64)
5556 CmdArgs.push_back("-EB");
5557 else
5558 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005559
5560 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5561 options::OPT_fpic, options::OPT_fno_pic,
5562 options::OPT_fPIE, options::OPT_fno_PIE,
5563 options::OPT_fpie, options::OPT_fno_pie);
5564 if (LastPICArg &&
5565 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5566 LastPICArg->getOption().matches(options::OPT_fpic) ||
5567 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5568 LastPICArg->getOption().matches(options::OPT_fpie))) {
5569 CmdArgs.push_back("-KPIC");
5570 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005571 }
5572
5573 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5574 options::OPT_Xassembler);
5575
5576 CmdArgs.push_back("-o");
5577 CmdArgs.push_back(Output.getFilename());
5578
5579 for (InputInfoList::const_iterator
5580 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5581 const InputInfo &II = *it;
5582 CmdArgs.push_back(II.getFilename());
5583 }
5584
5585 const char *Exec =
5586 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5587 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5588}
5589
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005590static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5591 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005592 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005593 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005594 Args.hasArg(options::OPT_static_libgcc);
5595 if (!D.CCCIsCXX)
5596 CmdArgs.push_back("-lgcc");
5597
5598 if (StaticLibgcc) {
5599 if (D.CCCIsCXX)
5600 CmdArgs.push_back("-lgcc");
5601 } else {
5602 if (!D.CCCIsCXX)
5603 CmdArgs.push_back("--as-needed");
5604 CmdArgs.push_back("-lgcc_s");
5605 if (!D.CCCIsCXX)
5606 CmdArgs.push_back("--no-as-needed");
5607 }
5608
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005609 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005610 CmdArgs.push_back("-lgcc_eh");
5611 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5612 CmdArgs.push_back("-lgcc");
5613}
5614
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005615void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5616 const InputInfo &Output,
5617 const InputInfoList &Inputs,
5618 const ArgList &Args,
5619 const char *LinkingOutput) const {
5620 const toolchains::Linux& ToolChain =
5621 static_cast<const toolchains::Linux&>(getToolChain());
5622 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005623 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005624 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005625
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005626 ArgStringList CmdArgs;
5627
Rafael Espindolad1002f62010-11-15 18:28:16 +00005628 // Silence warning for "clang -g foo.o -o foo"
5629 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005630 // and "clang -emit-llvm foo.o -o foo"
5631 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005632 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005633 // handled somewhere else.
5634 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005635
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005636 if (!D.SysRoot.empty())
5637 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005638
Rafael Espindolad47ac232010-11-17 22:26:15 +00005639 if (Args.hasArg(options::OPT_pie))
5640 CmdArgs.push_back("-pie");
5641
Rafael Espindola1c76c592010-11-07 22:57:16 +00005642 if (Args.hasArg(options::OPT_rdynamic))
5643 CmdArgs.push_back("-export-dynamic");
5644
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005645 if (Args.hasArg(options::OPT_s))
5646 CmdArgs.push_back("-s");
5647
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005648 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5649 e = ToolChain.ExtraOpts.end();
5650 i != e; ++i)
5651 CmdArgs.push_back(i->c_str());
5652
5653 if (!Args.hasArg(options::OPT_static)) {
5654 CmdArgs.push_back("--eh-frame-hdr");
5655 }
5656
5657 CmdArgs.push_back("-m");
5658 if (ToolChain.getArch() == llvm::Triple::x86)
5659 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005660 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005661 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005662 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005663 else if (ToolChain.getArch() == llvm::Triple::ppc)
5664 CmdArgs.push_back("elf32ppclinux");
5665 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5666 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005667 else if (ToolChain.getArch() == llvm::Triple::mips)
5668 CmdArgs.push_back("elf32btsmip");
5669 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5670 CmdArgs.push_back("elf32ltsmip");
5671 else if (ToolChain.getArch() == llvm::Triple::mips64)
5672 CmdArgs.push_back("elf64btsmip");
5673 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5674 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005675 else
5676 CmdArgs.push_back("elf_x86_64");
5677
5678 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005679 if (ToolChain.getArch() == llvm::Triple::arm
5680 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005681 CmdArgs.push_back("-Bstatic");
5682 else
5683 CmdArgs.push_back("-static");
5684 } else if (Args.hasArg(options::OPT_shared)) {
5685 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005686 if ((ToolChain.getArch() == llvm::Triple::arm
5687 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5688 CmdArgs.push_back("-Bsymbolic");
5689 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005690 }
5691
5692 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005693 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005694 (!Args.hasArg(options::OPT_static) &&
5695 !Args.hasArg(options::OPT_shared))) {
5696 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005697 if (isAndroid)
5698 CmdArgs.push_back("/system/bin/linker");
5699 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005700 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005701 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005702 ToolChain.getArch() == llvm::Triple::thumb) {
5703 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5704 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5705 else
5706 CmdArgs.push_back("/lib/ld-linux.so.3");
5707 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005708 else if (ToolChain.getArch() == llvm::Triple::mips ||
5709 ToolChain.getArch() == llvm::Triple::mipsel)
5710 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005711 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5712 ToolChain.getArch() == llvm::Triple::mips64el)
5713 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005714 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005715 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005716 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005717 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005718 else
5719 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5720 }
5721
5722 CmdArgs.push_back("-o");
5723 CmdArgs.push_back(Output.getFilename());
5724
Rafael Espindola81937ec2010-12-01 01:52:43 +00005725 if (!Args.hasArg(options::OPT_nostdlib) &&
5726 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005727 if (!isAndroid) {
5728 const char *crt1 = NULL;
5729 if (!Args.hasArg(options::OPT_shared)){
5730 if (Args.hasArg(options::OPT_pie))
5731 crt1 = "Scrt1.o";
5732 else
5733 crt1 = "crt1.o";
5734 }
5735 if (crt1)
5736 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005737
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005738 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5739 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005740
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005741 const char *crtbegin;
5742 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005743 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005744 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005745 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005746 else if (Args.hasArg(options::OPT_pie))
5747 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005748 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005749 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005750 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5751 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005752
5753 Args.AddAllArgs(CmdArgs, options::OPT_L);
5754
5755 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5756
Roman Divackyee8188a2011-03-01 17:53:14 +00005757 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5758 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005759 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005760
Rafael Espindola9446d762012-04-09 23:53:34 +00005761 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5762 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5763 // forward.
5764 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5765 CmdArgs.push_back("-plugin");
5766 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5767 CmdArgs.push_back(Args.MakeArgString(Plugin));
5768 }
5769
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005770 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5771 CmdArgs.push_back("--no-demangle");
5772
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005773 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5774
Chandler Carruth94a32012012-05-14 18:31:18 +00005775 if (D.CCCIsCXX &&
5776 !Args.hasArg(options::OPT_nostdlib) &&
5777 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005778 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5779 !Args.hasArg(options::OPT_static);
5780 if (OnlyLibstdcxxStatic)
5781 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005782 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005783 if (OnlyLibstdcxxStatic)
5784 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005785 CmdArgs.push_back("-lm");
5786 }
5787
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005788 // Call this before we add the C run-time.
5789 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005790 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005791
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005792 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005793 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5794 if (Args.hasArg(options::OPT_static))
5795 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005796
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005797 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005798
Chandler Carruth94a32012012-05-14 18:31:18 +00005799 if (Args.hasArg(options::OPT_pthread) ||
5800 Args.hasArg(options::OPT_pthreads))
5801 CmdArgs.push_back("-lpthread");
5802
5803 CmdArgs.push_back("-lc");
5804
5805 if (Args.hasArg(options::OPT_static))
5806 CmdArgs.push_back("--end-group");
5807 else
5808 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5809 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005810
Rafael Espindola81937ec2010-12-01 01:52:43 +00005811 if (!Args.hasArg(options::OPT_nostartfiles)) {
5812 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005813 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005814 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005815 else if (Args.hasArg(options::OPT_pie))
5816 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005817 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005818 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005819
Rafael Espindola81937ec2010-12-01 01:52:43 +00005820 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005821 if (!isAndroid)
5822 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005823 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005824 }
5825
Bill Wendling08760582011-06-27 19:15:03 +00005826 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005827
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005828 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5829}
Rafael Espindola92b00932010-08-10 00:25:48 +00005830
Chris Lattner3e2ee142010-07-07 16:01:42 +00005831void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005832 const InputInfo &Output,
5833 const InputInfoList &Inputs,
5834 const ArgList &Args,
5835 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005836 ArgStringList CmdArgs;
5837
5838 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5839 options::OPT_Xassembler);
5840
5841 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005842 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005843
5844 for (InputInfoList::const_iterator
5845 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5846 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005847 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005848 }
5849
5850 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005851 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005852 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005853}
5854
5855void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005856 const InputInfo &Output,
5857 const InputInfoList &Inputs,
5858 const ArgList &Args,
5859 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005860 const Driver &D = getToolChain().getDriver();
5861 ArgStringList CmdArgs;
5862
Daniel Dunbarb440f562010-08-02 02:38:21 +00005863 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005864 CmdArgs.push_back("-o");
5865 CmdArgs.push_back(Output.getFilename());
5866 } else {
5867 assert(Output.isNothing() && "Invalid output.");
5868 }
5869
5870 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005871 !Args.hasArg(options::OPT_nostartfiles)) {
5872 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5873 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5874 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5875 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5876 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005877
5878 Args.AddAllArgs(CmdArgs, options::OPT_L);
5879 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5880 Args.AddAllArgs(CmdArgs, options::OPT_e);
5881
Daniel Dunbar54423b22010-09-17 00:24:54 +00005882 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005883
Eli Friedman83de5132011-12-08 23:54:21 +00005884 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5885
Chris Lattner3e2ee142010-07-07 16:01:42 +00005886 if (!Args.hasArg(options::OPT_nostdlib) &&
5887 !Args.hasArg(options::OPT_nodefaultlibs)) {
5888 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005889 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005890 CmdArgs.push_back("-lm");
5891 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005892 }
5893
5894 if (!Args.hasArg(options::OPT_nostdlib) &&
5895 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005896 if (Args.hasArg(options::OPT_pthread))
5897 CmdArgs.push_back("-lpthread");
5898 CmdArgs.push_back("-lc");
5899 CmdArgs.push_back("-lCompilerRT-Generic");
5900 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5901 CmdArgs.push_back(
5902 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005903 }
5904
Eli Friedman83de5132011-12-08 23:54:21 +00005905 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005906 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005907}
5908
Daniel Dunbarcc912342009-05-02 18:28:39 +00005909/// DragonFly Tools
5910
5911// For now, DragonFly Assemble does just about the same as for
5912// FreeBSD, but this may change soon.
5913void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005914 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005915 const InputInfoList &Inputs,
5916 const ArgList &Args,
5917 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005918 ArgStringList CmdArgs;
5919
5920 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5921 // instruct as in the base system to assemble 32-bit code.
5922 if (getToolChain().getArchName() == "i386")
5923 CmdArgs.push_back("--32");
5924
5925 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5926 options::OPT_Xassembler);
5927
5928 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005929 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005930
5931 for (InputInfoList::const_iterator
5932 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5933 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005934 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005935 }
5936
5937 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005938 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005939 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005940}
5941
5942void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005943 const InputInfo &Output,
5944 const InputInfoList &Inputs,
5945 const ArgList &Args,
5946 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005947 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005948 ArgStringList CmdArgs;
5949
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005950 if (!D.SysRoot.empty())
5951 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5952
Daniel Dunbarcc912342009-05-02 18:28:39 +00005953 if (Args.hasArg(options::OPT_static)) {
5954 CmdArgs.push_back("-Bstatic");
5955 } else {
5956 if (Args.hasArg(options::OPT_shared))
5957 CmdArgs.push_back("-Bshareable");
5958 else {
5959 CmdArgs.push_back("-dynamic-linker");
5960 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5961 }
5962 }
5963
5964 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5965 // instruct ld in the base system to link 32-bit code.
5966 if (getToolChain().getArchName() == "i386") {
5967 CmdArgs.push_back("-m");
5968 CmdArgs.push_back("elf_i386");
5969 }
5970
Daniel Dunbarb440f562010-08-02 02:38:21 +00005971 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005972 CmdArgs.push_back("-o");
5973 CmdArgs.push_back(Output.getFilename());
5974 } else {
5975 assert(Output.isNothing() && "Invalid output.");
5976 }
5977
5978 if (!Args.hasArg(options::OPT_nostdlib) &&
5979 !Args.hasArg(options::OPT_nostartfiles)) {
5980 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005981 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005982 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005983 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005984 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005985 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005986 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005987 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005988 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005989 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005990 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005991 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005992 }
5993 }
5994
5995 Args.AddAllArgs(CmdArgs, options::OPT_L);
5996 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5997 Args.AddAllArgs(CmdArgs, options::OPT_e);
5998
Daniel Dunbar54423b22010-09-17 00:24:54 +00005999 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006000
6001 if (!Args.hasArg(options::OPT_nostdlib) &&
6002 !Args.hasArg(options::OPT_nodefaultlibs)) {
6003 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6004 // rpaths
6005 CmdArgs.push_back("-L/usr/lib/gcc41");
6006
6007 if (!Args.hasArg(options::OPT_static)) {
6008 CmdArgs.push_back("-rpath");
6009 CmdArgs.push_back("/usr/lib/gcc41");
6010
6011 CmdArgs.push_back("-rpath-link");
6012 CmdArgs.push_back("/usr/lib/gcc41");
6013
6014 CmdArgs.push_back("-rpath");
6015 CmdArgs.push_back("/usr/lib");
6016
6017 CmdArgs.push_back("-rpath-link");
6018 CmdArgs.push_back("/usr/lib");
6019 }
6020
Rafael Espindola38360b32010-07-20 12:59:03 +00006021 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006022 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006023 CmdArgs.push_back("-lm");
6024 }
6025
Daniel Dunbarcc912342009-05-02 18:28:39 +00006026 if (Args.hasArg(options::OPT_shared)) {
6027 CmdArgs.push_back("-lgcc_pic");
6028 } else {
6029 CmdArgs.push_back("-lgcc");
6030 }
6031
6032
6033 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006034 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006035
6036 if (!Args.hasArg(options::OPT_nolibc)) {
6037 CmdArgs.push_back("-lc");
6038 }
6039
6040 if (Args.hasArg(options::OPT_shared)) {
6041 CmdArgs.push_back("-lgcc_pic");
6042 } else {
6043 CmdArgs.push_back("-lgcc");
6044 }
6045 }
6046
6047 if (!Args.hasArg(options::OPT_nostdlib) &&
6048 !Args.hasArg(options::OPT_nostartfiles)) {
6049 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006050 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006051 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006052 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006053 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006054 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006055 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006056 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006057 }
6058
Bill Wendling08760582011-06-27 19:15:03 +00006059 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006060
Daniel Dunbarcc912342009-05-02 18:28:39 +00006061 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006062 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006063 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006064}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006065
6066void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6067 const InputInfo &Output,
6068 const InputInfoList &Inputs,
6069 const ArgList &Args,
6070 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006071 ArgStringList CmdArgs;
6072
6073 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006074 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6075 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006076 } else {
6077 assert(Output.isNothing() && "Invalid output.");
6078 }
6079
6080 if (!Args.hasArg(options::OPT_nostdlib) &&
6081 !Args.hasArg(options::OPT_nostartfiles)) {
6082 CmdArgs.push_back("-defaultlib:libcmt");
6083 }
6084
6085 CmdArgs.push_back("-nologo");
6086
Michael J. Spencere2f49362012-06-18 16:56:04 +00006087 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6088
6089 // Add filenames immediately.
6090 for (InputInfoList::const_iterator
6091 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6092 if (it->isFilename())
6093 CmdArgs.push_back(it->getFilename());
6094 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006095
6096 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006097 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006098 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6099}