blob: c10df6fc6344d161341bc85387b84dabaeffa2e2 [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 }
Daniel Dunbar3ca41d42011-12-07 23:22:17 +00001396
Evgeniy Stepanovcac6aaa2012-09-12 09:09:08 +00001397 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1398 llvm::sys::path::append(LibAsan, "lib", "linux",
1399 (Twine("libclang_rt.asan-") +
1400 TC.getArchName() + "-android.so"));
1401 CmdArgs.push_back(Args.MakeArgString(LibAsan));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001402 } else {
1403 if (!Args.hasArg(options::OPT_shared)) {
1404 // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library
1405 // resource directory.
1406 SmallString<128> LibAsan(TC.getDriver().ResourceDir);
1407 llvm::sys::path::append(LibAsan, "lib", "linux",
1408 (Twine("libclang_rt.asan-") +
1409 TC.getArchName() + ".a"));
1410 CmdArgs.push_back(Args.MakeArgString(LibAsan));
1411 CmdArgs.push_back("-lpthread");
1412 CmdArgs.push_back("-ldl");
1413 CmdArgs.push_back("-export-dynamic");
1414 }
1415 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001416}
1417
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00001418/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
1419/// This needs to be called before we add the C run-time (malloc, etc).
1420static void addTsanRTLinux(const ToolChain &TC, const ArgList &Args,
1421 ArgStringList &CmdArgs) {
1422 if (!Args.hasFlag(options::OPT_fthread_sanitizer,
1423 options::OPT_fno_thread_sanitizer, false))
1424 return;
1425 if (!Args.hasArg(options::OPT_shared)) {
1426 // LibTsan is "libclang_rt.tsan-<ArchName>.a" in the Linux library
1427 // resource directory.
1428 SmallString<128> LibTsan(TC.getDriver().ResourceDir);
1429 llvm::sys::path::append(LibTsan, "lib", "linux",
1430 (Twine("libclang_rt.tsan-") +
1431 TC.getArchName() + ".a"));
1432 CmdArgs.push_back(Args.MakeArgString(LibTsan));
1433 CmdArgs.push_back("-lpthread");
1434 CmdArgs.push_back("-ldl");
1435 CmdArgs.push_back("-export-dynamic");
1436 }
1437}
1438
Rafael Espindola224dd632011-12-14 21:02:23 +00001439static bool shouldUseFramePointer(const ArgList &Args,
1440 const llvm::Triple &Triple) {
1441 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
1442 options::OPT_fomit_frame_pointer))
1443 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
1444
Rafael Espindola00b29182011-12-14 21:50:24 +00001445 // Don't use a frame pointer on linux x86 and x86_64 if optimizing.
Rafael Espindola224dd632011-12-14 21:02:23 +00001446 if ((Triple.getArch() == llvm::Triple::x86_64 ||
1447 Triple.getArch() == llvm::Triple::x86) &&
1448 Triple.getOS() == llvm::Triple::Linux) {
1449 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1450 if (!A->getOption().matches(options::OPT_O0))
1451 return false;
1452 }
1453
1454 return true;
1455}
1456
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001457void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00001458 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00001459 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001460 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00001461 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001462 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
1463 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00001464 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00001465 ArgStringList CmdArgs;
1466
Daniel Dunbare521a892009-03-31 20:53:55 +00001467 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
1468
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00001469 // Invoke ourselves in -cc1 mode.
1470 //
1471 // FIXME: Implement custom jobs for internal actions.
1472 CmdArgs.push_back("-cc1");
1473
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001474 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00001475 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00001476 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001477 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00001478
Daniel Dunbar624c21b2009-10-30 18:12:20 +00001479 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00001480 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00001481
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001482 if (isa<AnalyzeJobAction>(JA)) {
1483 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
1484 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00001485 } else if (isa<MigrateJobAction>(JA)) {
1486 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001487 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00001488 if (Output.getType() == types::TY_Dependencies)
1489 CmdArgs.push_back("-Eonly");
1490 else
1491 CmdArgs.push_back("-E");
Daniel Dunbarc4343942010-02-03 03:07:56 +00001492 } else if (isa<AssembleJobAction>(JA)) {
1493 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001494
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001495 if (UseRelaxAll(C, Args))
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00001496 CmdArgs.push_back("-mrelax-all");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00001497
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001498 // When using an integrated assembler, translate -Wa, and -Xassembler
1499 // options.
1500 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1501 options::OPT_Xassembler),
1502 ie = Args.filtered_end(); it != ie; ++it) {
1503 const Arg *A = *it;
1504 A->claim();
1505
1506 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001507 StringRef Value = A->getValue(Args, i);
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001508
1509 if (Value == "-force_cpusubtype_ALL") {
1510 // Do nothing, this is the default and we don't support anything else.
Daniel Dunbara78e5892010-10-28 20:36:23 +00001511 } else if (Value == "-L") {
Daniel Dunbar67919b22011-03-28 22:49:28 +00001512 CmdArgs.push_back("-msave-temp-labels");
Joerg Sonnenberger3028e462011-05-19 20:46:39 +00001513 } else if (Value == "--fatal-warnings") {
Joerg Sonnenbergerb487d2d2011-05-19 18:42:29 +00001514 CmdArgs.push_back("-mllvm");
1515 CmdArgs.push_back("-fatal-assembler-warnings");
Nick Lewyckyca6b90d2011-06-21 00:14:18 +00001516 } else if (Value == "--noexecstack") {
1517 CmdArgs.push_back("-mnoexecstack");
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001518 } else {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001519 D.Diag(diag::err_drv_unsupported_option_argument)
Daniel Dunbar2b4de142010-10-18 22:36:15 +00001520 << A->getOption().getName() << Value;
1521 }
1522 }
1523 }
Daniel Dunbar7c874332010-11-19 16:23:35 +00001524
1525 // Also ignore explicit -force_cpusubtype_ALL option.
1526 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001527 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00001528 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001529 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00001530
Aaron Ballman1f10cc52012-07-31 01:21:00 +00001531 if (JA.getType() == types::TY_Nothing)
1532 CmdArgs.push_back("-fsyntax-only");
1533 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00001534 CmdArgs.push_back("-emit-pch");
1535 else
1536 CmdArgs.push_back("-emit-pth");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001537 } else {
1538 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001539
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001540 if (JA.getType() == types::TY_Nothing) {
1541 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001542 } else if (JA.getType() == types::TY_LLVM_IR ||
1543 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001544 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00001545 } else if (JA.getType() == types::TY_LLVM_BC ||
1546 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001547 CmdArgs.push_back("-emit-llvm-bc");
1548 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00001549 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00001550 } else if (JA.getType() == types::TY_AST) {
1551 CmdArgs.push_back("-emit-pch");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001552 } else if (JA.getType() == types::TY_RewrittenObjC) {
1553 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001554 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00001555 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
1556 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00001557 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00001558 } else {
1559 assert(JA.getType() == types::TY_PP_Asm &&
1560 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001561 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00001562 }
1563
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001564 // The make clang go fast button.
1565 CmdArgs.push_back("-disable-free");
1566
John McCallbb79b5f2010-02-13 03:50:24 +00001567 // Disable the verification pass in -asserts builds.
1568#ifdef NDEBUG
1569 CmdArgs.push_back("-disable-llvm-verifier");
1570#endif
1571
Daniel Dunbar3b358a32009-04-08 05:11:16 +00001572 // Set the main file name, so that debug info works even with
1573 // -save-temps.
1574 CmdArgs.push_back("-main-file-name");
1575 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
1576
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00001577 // Some flags which affect the language (via preprocessor
1578 // defines). See darwin::CC1::AddCPPArgs.
1579 if (Args.hasArg(options::OPT_static))
1580 CmdArgs.push_back("-static-define");
1581
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001582 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00001583 // Enable region store model by default.
1584 CmdArgs.push_back("-analyzer-store=region");
1585
Ted Kremenek7bea9a12009-12-07 22:26:14 +00001586 // Treat blocks as analysis entry points.
1587 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
1588
Ted Kremenek49c79792011-03-24 00:28:47 +00001589 CmdArgs.push_back("-analyzer-eagerly-assume");
1590
Anna Zaks0af3e062012-03-08 23:16:35 +00001591 CmdArgs.push_back("-analyzer-ipa=inlining");
Anna Zaksd5c30272012-03-01 22:37:46 +00001592
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001593 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001594 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001595 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00001596
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001597 if (getToolChain().getTriple().getOS() != llvm::Triple::Win32)
1598 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00001599
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00001600 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00001601 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00001602
1603 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00001604
1605 // Enable the following experimental checkers for testing.
Ted Kremenek37e96522012-01-26 02:27:38 +00001606 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.UncheckedReturn");
1607 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
1608 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
1609 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
1610 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
1611 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001612 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001613
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00001614 // Set the output format. The default is plist, for (lame) historical
1615 // reasons.
1616 CmdArgs.push_back("-analyzer-output");
1617 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
1618 CmdArgs.push_back(A->getValue(Args));
1619 else
1620 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001621
Ted Kremenekfe449a22010-03-22 22:32:05 +00001622 // Disable the presentation of standard compiler warnings when
1623 // using --analyze. We only want to show static analyzer diagnostics
1624 // or frontend errors.
1625 CmdArgs.push_back("-w");
1626
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001627 // Add -Xanalyzer arguments when running as analyzer.
1628 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00001629 }
1630
Daniel Dunbar4eadb602009-09-10 01:21:12 +00001631 CheckCodeGenerationOptions(D, Args);
1632
Daniel Dunbar44e71222009-04-29 18:32:25 +00001633 // Perform argument translation for LLVM backend. This
1634 // takes some care in reconciling with llvm-gcc. The
1635 // issue is that llvm-gcc translates these options based on
1636 // the values in cc1, whereas we are processing based on
1637 // the driver arguments.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00001638
Daniel Dunbar44e71222009-04-29 18:32:25 +00001639 // This comes from the default translation the driver + cc1
1640 // would do to enable flag_pic.
Simon Atanasyana16b7fd2012-05-29 18:50:33 +00001641
1642 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1643 options::OPT_fpic, options::OPT_fno_pic,
1644 options::OPT_fPIE, options::OPT_fno_PIE,
1645 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruthc0c04552012-04-08 16:40:35 +00001646 bool PICDisabled = false;
1647 bool PICEnabled = false;
1648 bool PICForPIE = false;
1649 if (LastPICArg) {
1650 PICForPIE = (LastPICArg->getOption().matches(options::OPT_fPIE) ||
1651 LastPICArg->getOption().matches(options::OPT_fpie));
1652 PICEnabled = (PICForPIE ||
1653 LastPICArg->getOption().matches(options::OPT_fPIC) ||
1654 LastPICArg->getOption().matches(options::OPT_fpic));
1655 PICDisabled = !PICEnabled;
1656 }
1657 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
1658 // PIC or PIE options above, if these show up, PIC is disabled.
1659 if (Args.hasArg(options::OPT_mkernel))
1660 PICDisabled = true;
1661 if (Args.hasArg(options::OPT_static))
1662 PICDisabled = true;
1663 bool DynamicNoPIC = Args.hasArg(options::OPT_mdynamic_no_pic);
1664
1665 // Select the relocation model.
Daniel Dunbar44e71222009-04-29 18:32:25 +00001666 const char *Model = getToolChain().GetForcedPicModel();
1667 if (!Model) {
Chandler Carruthc0c04552012-04-08 16:40:35 +00001668 if (DynamicNoPIC)
Daniel Dunbar44e71222009-04-29 18:32:25 +00001669 Model = "dynamic-no-pic";
1670 else if (PICDisabled)
1671 Model = "static";
1672 else if (PICEnabled)
1673 Model = "pic";
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001674 else
Daniel Dunbar44e71222009-04-29 18:32:25 +00001675 Model = getToolChain().GetDefaultRelocationModel();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001676 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001677 StringRef ModelStr = Model ? Model : "";
1678 if (Model && ModelStr != "pic") {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001679 CmdArgs.push_back("-mrelocation-model");
1680 CmdArgs.push_back(Model);
1681 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001682
Chandler Carruthc0c04552012-04-08 16:40:35 +00001683 // Infer the __PIC__ and __PIE__ values.
1684 if (ModelStr == "pic" && PICForPIE) {
1685 CmdArgs.push_back("-pie-level");
1686 CmdArgs.push_back((LastPICArg &&
1687 LastPICArg->getOption().matches(options::OPT_fPIE)) ?
1688 "2" : "1");
1689 } else if (ModelStr == "pic" || ModelStr == "dynamic-no-pic") {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00001690 CmdArgs.push_back("-pic-level");
Chandler Carruthc0c04552012-04-08 16:40:35 +00001691 CmdArgs.push_back(((ModelStr != "dynamic-no-pic" && LastPICArg &&
1692 LastPICArg->getOption().matches(options::OPT_fPIC)) ||
1693 getToolChain().getTriple().isOSDarwin()) ? "2" : "1");
Daniel Dunbar44e71222009-04-29 18:32:25 +00001694 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00001695
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00001696 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
1697 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00001698 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00001699
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001700 // LLVM Code Generator Options.
1701
Daniel Dunbar0bb03312011-02-09 17:54:19 +00001702 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
1703 CmdArgs.push_back("-mregparm");
1704 CmdArgs.push_back(A->getValue(Args));
1705 }
1706
Roman Divacky65b88cd2011-03-01 17:40:53 +00001707 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
1708 CmdArgs.push_back("-mrtd");
1709
Rafael Espindola224dd632011-12-14 21:02:23 +00001710 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001711 CmdArgs.push_back("-mdisable-fp-elim");
1712 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
1713 options::OPT_fno_zero_initialized_in_bss))
1714 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Daniel Dunbar7aa71f92011-02-04 02:20:39 +00001715 if (!Args.hasFlag(options::OPT_fstrict_aliasing,
1716 options::OPT_fno_strict_aliasing,
1717 getToolChain().IsStrictAliasingDefault()))
Dan Gohman10169b92010-10-14 22:36:56 +00001718 CmdArgs.push_back("-relaxed-aliasing");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00001719 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
1720 false))
1721 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00001722 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
1723 options::OPT_fno_optimize_sibling_calls))
1724 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001725
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001726 // Handle various floating point optimization flags, mapping them to the
1727 // appropriate LLVM code generation flags. The pattern for all of these is to
1728 // default off the codegen optimizations, and if any flag enables them and no
1729 // flag disables them after the flag enabling them, enable the codegen
1730 // optimization. This is complicated by several "umbrella" flags.
1731 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1732 options::OPT_ffinite_math_only,
1733 options::OPT_fno_finite_math_only,
1734 options::OPT_fhonor_infinities,
1735 options::OPT_fno_honor_infinities))
1736 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1737 A->getOption().getID() != options::OPT_fhonor_infinities)
1738 CmdArgs.push_back("-menable-no-infs");
1739 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1740 options::OPT_ffinite_math_only,
1741 options::OPT_fno_finite_math_only,
1742 options::OPT_fhonor_nans,
1743 options::OPT_fno_honor_nans))
1744 if (A->getOption().getID() != options::OPT_fno_finite_math_only &&
1745 A->getOption().getID() != options::OPT_fhonor_nans)
1746 CmdArgs.push_back("-menable-no-nans");
1747
Benjamin Kramerc242ef22012-05-02 14:55:48 +00001748 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
1749 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001750 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1751 options::OPT_fmath_errno,
Chandler Carruth3634c662012-04-26 02:10:51 +00001752 options::OPT_fno_math_errno))
1753 MathErrno = A->getOption().getID() == options::OPT_fmath_errno;
1754 if (MathErrno)
1755 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001756
1757 // There are several flags which require disabling very specific
1758 // optimizations. Any of these being disabled forces us to turn off the
1759 // entire set of LLVM optimizations, so collect them through all the flag
1760 // madness.
1761 bool AssociativeMath = false;
1762 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1763 options::OPT_funsafe_math_optimizations,
1764 options::OPT_fno_unsafe_math_optimizations,
1765 options::OPT_fassociative_math,
1766 options::OPT_fno_associative_math))
1767 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1768 A->getOption().getID() != options::OPT_fno_associative_math)
1769 AssociativeMath = true;
1770 bool ReciprocalMath = false;
1771 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1772 options::OPT_funsafe_math_optimizations,
1773 options::OPT_fno_unsafe_math_optimizations,
1774 options::OPT_freciprocal_math,
1775 options::OPT_fno_reciprocal_math))
1776 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1777 A->getOption().getID() != options::OPT_fno_reciprocal_math)
1778 ReciprocalMath = true;
1779 bool SignedZeros = true;
1780 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1781 options::OPT_funsafe_math_optimizations,
1782 options::OPT_fno_unsafe_math_optimizations,
1783 options::OPT_fsigned_zeros,
1784 options::OPT_fno_signed_zeros))
1785 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1786 A->getOption().getID() != options::OPT_fsigned_zeros)
1787 SignedZeros = false;
1788 bool TrappingMath = true;
1789 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1790 options::OPT_funsafe_math_optimizations,
1791 options::OPT_fno_unsafe_math_optimizations,
1792 options::OPT_ftrapping_math,
1793 options::OPT_fno_trapping_math))
1794 if (A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
1795 A->getOption().getID() != options::OPT_ftrapping_math)
1796 TrappingMath = false;
1797 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
1798 !TrappingMath)
1799 CmdArgs.push_back("-menable-unsafe-fp-math");
1800
Lang Hamesaa53b932012-07-06 00:59:19 +00001801
1802 // Validate and pass through -fp-contract option.
1803 if (Arg *A = Args.getLastArg(options::OPT_ffast_math,
1804 options::OPT_ffp_contract)) {
1805 if (A->getOption().getID() == options::OPT_ffp_contract) {
1806 StringRef Val = A->getValue(Args);
1807 if (Val == "fast" || Val == "on" || Val == "off") {
1808 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
1809 } else {
1810 D.Diag(diag::err_drv_unsupported_option_argument)
1811 << A->getOption().getName() << Val;
1812 }
1813 } else { // A is OPT_ffast_math
1814 // If fast-math is set then set the fp-contract mode to fast.
1815 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
1816 }
1817 }
1818
Bob Wilson6a039162012-07-19 03:52:53 +00001819 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
1820 // and if we find them, tell the frontend to provide the appropriate
1821 // preprocessor macros. This is distinct from enabling any optimizations as
1822 // these options induce language changes which must survive serialization
1823 // and deserialization, etc.
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001824 if (Args.hasArg(options::OPT_ffast_math))
1825 CmdArgs.push_back("-ffast-math");
Bob Wilson6a039162012-07-19 03:52:53 +00001826 if (Args.hasArg(options::OPT_ffinite_math_only))
1827 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00001828
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001829 // Decide whether to use verbose asm. Verbose assembly is the default on
1830 // toolchains which have the integrated assembler on by default.
1831 bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
1832 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001833 IsVerboseAsmDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001834 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001835 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00001836
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001837 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
1838 CmdArgs.push_back("-mdebug-pass");
1839 CmdArgs.push_back("Structure");
1840 }
1841 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
1842 CmdArgs.push_back("-mdebug-pass");
1843 CmdArgs.push_back("Arguments");
1844 }
1845
John McCall8517abc2010-02-19 02:45:38 +00001846 // Enable -mconstructor-aliases except on darwin, where we have to
1847 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00001848 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00001849 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00001850
John McCall7ef5cb32011-03-18 02:56:14 +00001851 // Darwin's kernel doesn't support guard variables; just die if we
1852 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00001853 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00001854 CmdArgs.push_back("-fforbid-guard-variables");
1855
Douglas Gregordbe39272011-02-01 15:15:22 +00001856 if (Args.hasArg(options::OPT_mms_bitfields)) {
1857 CmdArgs.push_back("-mms-bitfields");
1858 }
John McCall8517abc2010-02-19 02:45:38 +00001859
Daniel Dunbar306945d2009-09-16 06:17:29 +00001860 // This is a coarse approximation of what llvm-gcc actually does, both
1861 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
1862 // complicated ways.
1863 bool AsynchronousUnwindTables =
1864 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
1865 options::OPT_fno_asynchronous_unwind_tables,
1866 getToolChain().IsUnwindTablesDefault() &&
Daniel Dunbare46b52a2010-03-20 04:52:14 +00001867 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00001868 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
1869 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001870 CmdArgs.push_back("-munwind-tables");
1871
Rafael Espindola66aa0452012-06-19 01:26:10 +00001872 getToolChain().addClangTargetOptions(CmdArgs);
1873
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001874 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
1875 CmdArgs.push_back("-mlimit-float-precision");
1876 CmdArgs.push_back(A->getValue(Args));
1877 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00001878
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001879 // FIXME: Handle -mtune=.
1880 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00001881
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001882 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00001883 CmdArgs.push_back("-mcode-model");
Benjamin Kramercf4371a2009-08-05 14:30:52 +00001884 CmdArgs.push_back(A->getValue(Args));
1885 }
1886
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001887 // Add target specific cpu and features flags.
1888 switch(getToolChain().getTriple().getArch()) {
1889 default:
1890 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001891
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001892 case llvm::Triple::arm:
1893 case llvm::Triple::thumb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00001894 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001895 break;
1896
Eric Christopher0b26a612010-03-02 02:41:08 +00001897 case llvm::Triple::mips:
1898 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00001899 case llvm::Triple::mips64:
1900 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00001901 AddMIPSTargetArgs(Args, CmdArgs);
1902 break;
1903
Hal Finkel8eb59282012-06-11 22:35:19 +00001904 case llvm::Triple::ppc:
1905 case llvm::Triple::ppc64:
1906 AddPPCTargetArgs(Args, CmdArgs);
1907 break;
1908
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001909 case llvm::Triple::sparc:
1910 AddSparcTargetArgs(Args, CmdArgs);
1911 break;
1912
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001913 case llvm::Triple::x86:
1914 case llvm::Triple::x86_64:
1915 AddX86TargetArgs(Args, CmdArgs);
1916 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00001917
1918 case llvm::Triple::hexagon:
1919 AddHexagonTargetArgs(Args, CmdArgs);
1920 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00001921 }
1922
Tony Linthicum76329bf2011-12-12 21:14:55 +00001923
1924
Daniel Dunbar976a2f52010-08-11 23:07:47 +00001925 // Pass the linker version in use.
1926 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1927 CmdArgs.push_back("-target-linker-version");
1928 CmdArgs.push_back(A->getValue(Args));
1929 }
1930
Nick Lewycky75033772011-02-02 06:43:03 +00001931 // -mno-omit-leaf-frame-pointer is the default on Darwin.
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001932 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
Nick Lewycky75033772011-02-02 06:43:03 +00001933 options::OPT_mno_omit_leaf_frame_pointer,
Bob Wilson6524dd32011-10-14 05:03:44 +00001934 !getToolChain().getTriple().isOSDarwin()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00001935 CmdArgs.push_back("-momit-leaf-frame-pointer");
1936
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001937 // Explicitly error on some things we know we don't support and can't just
1938 // ignore.
1939 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001940 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
1941 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001942 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00001943 getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001944 getToolChain().getTriple().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00001945 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
1946 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001947 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00001948 << Unsupported->getOption().getName();
1949 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00001950 }
1951
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001952 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00001953 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00001954 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00001955 CmdArgs.push_back("-header-include-file");
1956 CmdArgs.push_back(D.CCPrintHeadersFilename ?
1957 D.CCPrintHeadersFilename : "-");
1958 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001959 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00001960 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001961
Chad Rosierbe10f982011-08-02 17:58:04 +00001962 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00001963 CmdArgs.push_back("-diagnostic-log-file");
1964 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
1965 D.CCLogDiagnosticsFilename : "-");
1966 }
1967
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001968 // Use the last option from "-g" group. "-gline-tables-only" is
1969 // preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00001970 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001971 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
1972 if (A->getOption().matches(options::OPT_gline_tables_only)) {
1973 CmdArgs.push_back("-gline-tables-only");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001974 } else if (!A->getOption().matches(options::OPT_g0) &&
1975 !A->getOption().matches(options::OPT_ggdb0)) {
Chad Rosier8fe3b112011-11-07 19:52:29 +00001976 CmdArgs.push_back("-g");
Chad Rosierc2bf3382011-11-04 19:28:44 +00001977 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00001978 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00001979
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00001980 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
1981 Args.ClaimAllArgs(options::OPT_g_flags_Group);
1982
Rafael Espindola66bfb2752010-05-06 21:06:04 +00001983 Args.AddAllArgs(CmdArgs, options::OPT_ffunction_sections);
1984 Args.AddAllArgs(CmdArgs, options::OPT_fdata_sections);
1985
Chris Lattner3c77a352010-06-22 00:03:40 +00001986 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
1987
Nick Lewycky207bce32011-04-21 23:44:07 +00001988 if (Args.hasArg(options::OPT_ftest_coverage) ||
1989 Args.hasArg(options::OPT_coverage))
1990 CmdArgs.push_back("-femit-coverage-notes");
1991 if (Args.hasArg(options::OPT_fprofile_arcs) ||
1992 Args.hasArg(options::OPT_coverage))
1993 CmdArgs.push_back("-femit-coverage-data");
1994
Nick Lewycky480cb992011-05-04 20:46:58 +00001995 if (C.getArgs().hasArg(options::OPT_c) ||
1996 C.getArgs().hasArg(options::OPT_S)) {
1997 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00001998 CmdArgs.push_back("-coverage-file");
Bill Wendling8c0b4bc2012-08-30 00:43:41 +00001999 SmallString<128> absFilename(Output.getFilename());
2000 llvm::sys::fs::make_absolute(absFilename);
2001 CmdArgs.push_back(Args.MakeArgString(absFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00002002 }
2003 }
2004
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002005 // Pass options for controlling the default header search paths.
2006 if (Args.hasArg(options::OPT_nostdinc)) {
2007 CmdArgs.push_back("-nostdsysteminc");
2008 CmdArgs.push_back("-nobuiltininc");
2009 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00002010 if (Args.hasArg(options::OPT_nostdlibinc))
2011 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00002012 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
2013 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
2014 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002015
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002016 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00002017 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00002018 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00002019
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00002020 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
2021
Ted Kremenekf7639e12012-03-06 20:06:33 +00002022 bool ARCMTEnabled = false;
John McCalld70fb982011-06-15 23:25:17 +00002023 if (!Args.hasArg(options::OPT_fno_objc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002024 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002025 options::OPT_ccc_arcmt_modify,
2026 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00002027 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00002028 switch (A->getOption().getID()) {
2029 default:
2030 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002031 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00002032 CmdArgs.push_back("-arcmt-check");
2033 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00002034 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00002035 CmdArgs.push_back("-arcmt-modify");
2036 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002037 case options::OPT_ccc_arcmt_migrate:
2038 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002039 CmdArgs.push_back("-mt-migrate-directory");
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002040 CmdArgs.push_back(A->getValue(Args));
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00002041
2042 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
2043 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00002044 break;
John McCalld70fb982011-06-15 23:25:17 +00002045 }
2046 }
2047 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002048
Ted Kremenekf7639e12012-03-06 20:06:33 +00002049 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
2050 if (ARCMTEnabled) {
2051 D.Diag(diag::err_drv_argument_not_allowed_with)
2052 << A->getAsString(Args) << "-ccc-arcmt-migrate";
2053 }
2054 CmdArgs.push_back("-mt-migrate-directory");
2055 CmdArgs.push_back(A->getValue(Args));
2056
2057 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
2058 options::OPT_objcmt_migrate_subscripting)) {
2059 // None specified, means enable them all.
2060 CmdArgs.push_back("-objcmt-migrate-literals");
2061 CmdArgs.push_back("-objcmt-migrate-subscripting");
2062 } else {
2063 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
2064 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
2065 }
2066 }
2067
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002068 // Add preprocessing options like -I, -D, etc. if we are using the
2069 // preprocessor.
2070 //
2071 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002072 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Peter Collingbourne9b515cb2011-11-06 00:40:05 +00002073 AddPreprocessingOptions(C, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002074
Rafael Espindolaa7431922011-07-21 23:40:37 +00002075 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
2076 // that "The compiler can only warn and ignore the option if not recognized".
2077 // When building with ccache, it will pass -D options to clang even on
2078 // preprocessed inputs and configure concludes that -fPIC is not supported.
2079 Args.ClaimAllArgs(options::OPT_D);
2080
Daniel Dunbar58f78332009-09-17 06:53:36 +00002081 // Manually translate -O to -O2 and -O4 to -O3; let clang reject
Daniel Dunbar13864952009-03-24 20:17:30 +00002082 // others.
2083 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +00002084 if (A->getOption().matches(options::OPT_O4))
Daniel Dunbar13864952009-03-24 20:17:30 +00002085 CmdArgs.push_back("-O3");
Daniel Dunbar9296f632010-05-27 06:51:08 +00002086 else if (A->getOption().matches(options::OPT_O) &&
2087 A->getValue(Args)[0] == '\0')
Daniel Dunbar58f78332009-09-17 06:53:36 +00002088 CmdArgs.push_back("-O2");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002089 else
Daniel Dunbar7ef5ed62009-03-18 23:39:35 +00002090 A->render(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002091 }
2092
Daniel Dunbar945577c2009-10-29 02:24:45 +00002093 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00002094 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
2095 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00002096 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002097 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002098
2099 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
2100 // (-ansi is equivalent to -std=c89).
2101 //
2102 // If a std is supplied, only add -trigraphs if it follows the
2103 // option.
2104 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
2105 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00002106 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002107 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00002108 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002109 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002110 else
2111 Std->render(Args, CmdArgs);
2112
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00002113 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
2114 options::OPT_trigraphs))
2115 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002116 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002117 } else {
2118 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00002119 //
2120 // FIXME: Clang doesn't correctly handle -std= when the input language
2121 // doesn't match. For the time being just ignore this for C++ inputs;
2122 // eventually we want to do all the standard defaulting here instead of
2123 // splitting it between the driver and clang -cc1.
2124 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00002125 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
2126 "-std=", /*Joined=*/true);
2127 else if (getToolChain().getTriple().getOS() == llvm::Triple::Win32)
2128 CmdArgs.push_back("-std=c++11");
2129
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00002130 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00002131 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002132
Chandler Carruthb009b142011-04-23 06:30:43 +00002133 // Map the bizarre '-Wwrite-strings' flag to a more sensible
2134 // '-fconst-strings'; this better indicates its actual behavior.
2135 if (Args.hasFlag(options::OPT_Wwrite_strings, options::OPT_Wno_write_strings,
2136 false)) {
2137 // For perfect compatibility with GCC, we do this even in the presence of
2138 // '-w'. This flag names something other than a warning for GCC.
2139 CmdArgs.push_back("-fconst-strings");
2140 }
2141
Chandler Carruth61fbf622011-04-23 09:27:53 +00002142 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00002143 // during C++ compilation, which it is by default. GCC keeps this define even
2144 // in the presence of '-w', match this behavior bug-for-bug.
2145 if (types::isCXX(InputType) &&
2146 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
2147 true)) {
2148 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00002149 }
2150
Chandler Carruthe0391482010-05-22 02:21:53 +00002151 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
2152 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
2153 if (Asm->getOption().matches(options::OPT_fasm))
2154 CmdArgs.push_back("-fgnu-keywords");
2155 else
2156 CmdArgs.push_back("-fno-gnu-keywords");
2157 }
2158
Rafael Espindola4cfa7972011-05-02 17:43:32 +00002159 if (ShouldDisableCFI(Args, getToolChain()))
2160 CmdArgs.push_back("-fno-dwarf2-cfi-asm");
Rafael Espindolae2641872011-04-30 18:35:43 +00002161
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002162 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
2163 CmdArgs.push_back("-fno-dwarf-directory-asm");
2164
Nick Lewyckyba743b72011-10-21 02:32:14 +00002165 if (const char *pwd = ::getenv("PWD")) {
2166 // GCC also verifies that stat(pwd) and stat(".") have the same inode
2167 // number. Not doing those because stats are slow, but we could.
NAKAMURA Takumib5e6fa22011-10-22 10:25:25 +00002168 if (llvm::sys::path::is_absolute(pwd)) {
Nick Lewyckyba743b72011-10-21 02:32:14 +00002169 std::string CompDir = pwd;
2170 CmdArgs.push_back("-fdebug-compilation-dir");
2171 CmdArgs.push_back(Args.MakeArgString(CompDir));
2172 }
2173 }
2174
Richard Smith9a568822011-11-21 19:36:32 +00002175 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
2176 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002177 CmdArgs.push_back("-ftemplate-depth");
2178 CmdArgs.push_back(A->getValue(Args));
2179 }
2180
Richard Smith9a568822011-11-21 19:36:32 +00002181 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
2182 CmdArgs.push_back("-fconstexpr-depth");
2183 CmdArgs.push_back(A->getValue(Args));
2184 }
2185
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00002186 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
2187 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00002188 if (A->getNumValues()) {
2189 StringRef bytes = A->getValue(Args);
2190 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
2191 } else
2192 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00002193 }
2194
Nuno Lopes3d6311d2012-05-08 22:10:46 +00002195 if (Arg *A = Args.getLastArg(options::OPT_fbounds_checking,
2196 options::OPT_fbounds_checking_EQ)) {
2197 if (A->getNumValues()) {
2198 StringRef val = A->getValue(Args);
2199 CmdArgs.push_back(Args.MakeArgString("-fbounds-checking=" + val));
2200 } else
2201 CmdArgs.push_back("-fbounds-checking=1");
2202 }
2203
Daniel Dunbarfffd1812009-11-19 04:00:53 +00002204 if (Args.hasArg(options::OPT__relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002205 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00002206
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00002207 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
2208 CmdArgs.push_back("-fconstant-string-class");
2209 CmdArgs.push_back(A->getValue(Args));
2210 }
David Chisnall5778fce2009-08-31 16:41:57 +00002211
Chris Lattnere23003d2010-01-09 21:54:33 +00002212 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
2213 CmdArgs.push_back("-ftabstop");
2214 CmdArgs.push_back(A->getValue(Args));
2215 }
2216
Chris Lattnerb35583d2010-04-07 20:49:23 +00002217 CmdArgs.push_back("-ferror-limit");
2218 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
2219 CmdArgs.push_back(A->getValue(Args));
2220 else
2221 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002222
Chandler Carrutha77a7272010-05-06 04:55:18 +00002223 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
2224 CmdArgs.push_back("-fmacro-backtrace-limit");
Douglas Gregorcd121fb2010-05-04 17:13:42 +00002225 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002226 }
2227
2228 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
2229 CmdArgs.push_back("-ftemplate-backtrace-limit");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00002230 CmdArgs.push_back(A->getValue(Args));
Chandler Carrutha77a7272010-05-06 04:55:18 +00002231 }
2232
Richard Smithf6f003a2011-12-16 19:06:07 +00002233 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
2234 CmdArgs.push_back("-fconstexpr-backtrace-limit");
2235 CmdArgs.push_back(A->getValue(Args));
2236 }
2237
Daniel Dunbar2c978472009-11-04 06:24:47 +00002238 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002239 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00002240 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Daniel Dunbar84bb7932009-11-30 08:40:54 +00002241 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002242 } else {
2243 // If -fmessage-length=N was not specified, determine whether this is a
2244 // terminal and, if so, implicitly define -fmessage-length appropriately.
2245 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002246 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00002247 }
2248
Daniel Dunbare357d562009-12-03 18:42:11 +00002249 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ)) {
2250 CmdArgs.push_back("-fvisibility");
2251 CmdArgs.push_back(A->getValue(Args));
2252 }
2253
Douglas Gregor08329632010-06-15 17:05:35 +00002254 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002255
Hans Wennborgf60f6af2012-06-28 08:01:44 +00002256 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
2257
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002258 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002259 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
2260 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002261 CmdArgs.push_back("-ffreestanding");
2262
Daniel Dunbare357d562009-12-03 18:42:11 +00002263 // Forward -f (flag) options which we can pass directly.
Mike Stumpd9546382009-12-12 01:27:46 +00002264 Args.AddLastArg(CmdArgs, options::OPT_fcatch_undefined_behavior);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002265 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002266 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Devang Patel91bbb552010-09-30 19:05:55 +00002267 Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info);
Devang Patel384dfa42011-11-04 20:05:58 +00002268 Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info);
Eric Christopher86050822011-10-25 07:13:06 +00002269 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Anton Yartsev9b6b2e52011-12-23 20:23:19 +00002270 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00002271 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
2272 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00002273
2274 // Report and error for -faltivec on anything other then PowerPC.
2275 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
2276 if (!(getToolChain().getTriple().getArch() == llvm::Triple::ppc ||
2277 getToolChain().getTriple().getArch() == llvm::Triple::ppc64))
2278 D.Diag(diag::err_drv_argument_only_allowed_with)
2279 << A->getAsString(Args) << "ppc/ppc64";
2280
Daniel Dunbar733b0f82011-03-01 18:49:30 +00002281 if (getToolChain().SupportsProfiling())
2282 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00002283
Kostya Serebryany8855ff62011-11-16 17:34:26 +00002284 if (Args.hasFlag(options::OPT_faddress_sanitizer,
2285 options::OPT_fno_address_sanitizer, false))
2286 CmdArgs.push_back("-faddress-sanitizer");
2287
Kostya Serebryany28a7a112012-03-01 22:27:08 +00002288 if (Args.hasFlag(options::OPT_fthread_sanitizer,
2289 options::OPT_fno_thread_sanitizer, false))
2290 CmdArgs.push_back("-fthread-sanitizer");
2291
Daniel Dunbar35621a92010-03-16 16:57:46 +00002292 // -flax-vector-conversions is default.
2293 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
2294 options::OPT_fno_lax_vector_conversions))
2295 CmdArgs.push_back("-fno-lax-vector-conversions");
2296
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002297 if (Args.getLastArg(options::OPT_fapple_kext))
2298 CmdArgs.push_back("-fapple-kext");
2299
David Blaikie690f21e2012-06-14 18:55:27 +00002300 if (Args.hasFlag(options::OPT_frewrite_includes,
2301 options::OPT_fno_rewrite_includes, false))
2302 CmdArgs.push_back("-frewrite-includes");
2303
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00002304 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00002305 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00002306 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002307 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
2308 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00002309
2310 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
2311 CmdArgs.push_back("-ftrapv-handler");
2312 CmdArgs.push_back(A->getValue(Args));
2313 }
2314
Bob Wilson14adb362012-02-03 06:27:22 +00002315 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00002316
Chandler Carruth6e501032011-03-27 00:04:55 +00002317 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
2318 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
2319 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
2320 options::OPT_fno_wrapv)) {
2321 if (A->getOption().matches(options::OPT_fwrapv))
2322 CmdArgs.push_back("-fwrapv");
2323 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
2324 options::OPT_fno_strict_overflow)) {
2325 if (A->getOption().matches(options::OPT_fno_strict_overflow))
2326 CmdArgs.push_back("-fwrapv");
2327 }
Daniel Dunbar3a148f22009-04-07 21:51:40 +00002328 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Eric Christopherf387dbd2010-08-07 23:08:14 +00002329 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002330
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00002331 Args.AddLastArg(CmdArgs, options::OPT_pthread);
2332
Daniel Dunbar4930e332009-11-17 08:07:36 +00002333 // -stack-protector=0 is default.
2334 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002335 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
2336 options::OPT_fstack_protector_all,
2337 options::OPT_fstack_protector)) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002338 if (A->getOption().matches(options::OPT_fstack_protector))
2339 StackProtectorLevel = 1;
2340 else if (A->getOption().matches(options::OPT_fstack_protector_all))
2341 StackProtectorLevel = 2;
Nico Weberdd473632011-08-23 07:38:27 +00002342 } else {
2343 StackProtectorLevel =
2344 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
2345 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002346 if (StackProtectorLevel) {
2347 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002348 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002349 }
Chad Rosierdb3da832012-08-21 16:16:06 +00002350
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002351 // --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 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00002357 CmdArgs.push_back("-stack-protector-buffer-size");
2358 // FIXME: Verify the argument is a valid integer.
2359 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00002360 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00002361 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00002362 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00002363 }
2364
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00002365 // Translate -mstackrealign
2366 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
2367 false)) {
2368 CmdArgs.push_back("-backend-option");
2369 CmdArgs.push_back("-force-align-stack");
2370 }
2371 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
2372 false)) {
2373 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
2374 }
2375
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00002376 if (Args.hasArg(options::OPT_mstack_alignment)) {
2377 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
2378 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00002379 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00002380
Daniel Dunbard18049a2009-04-07 21:16:11 +00002381 // Forward -f options with positive and negative forms; we translate
2382 // these by hand.
2383
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002384 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00002385 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002386 CmdArgs.push_back("-fapple-kext");
2387 if (!Args.hasArg(options::OPT_fbuiltin))
2388 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00002389 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002390 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00002391 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002392 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00002393 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00002394
Nuno Lopes13c88c72009-12-16 16:59:22 +00002395 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2396 options::OPT_fno_assume_sane_operator_new))
2397 CmdArgs.push_back("-fno-assume-sane-operator-new");
2398
Daniel Dunbar4930e332009-11-17 08:07:36 +00002399 // -fblocks=0 is default.
2400 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00002401 getToolChain().IsBlocksDefault()) ||
2402 (Args.hasArg(options::OPT_fgnu_runtime) &&
2403 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
2404 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00002405 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00002406
2407 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
2408 !getToolChain().hasBlocksRuntime())
2409 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00002410 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00002411
Douglas Gregor226173a2012-01-18 15:19:58 +00002412 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
2413 // users must also pass -fcxx-modules. The latter flag will disappear once the
2414 // modules implementation is solid for C++/Objective-C++ programs as well.
2415 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
2416 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
2417 options::OPT_fno_cxx_modules,
2418 false);
2419 if (AllowedInCXX || !types::isCXX(InputType))
2420 CmdArgs.push_back("-fmodules");
2421 }
Douglas Gregor787869b2012-01-03 17:13:05 +00002422
John McCalldfea9982010-04-09 19:12:06 +00002423 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00002424 if (Args.hasFlag(options::OPT_fno_access_control,
2425 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00002426 false))
John McCall3155f572010-04-09 19:03:51 +00002427 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00002428
Anders Carlssond470fef2010-11-21 00:09:52 +00002429 // -felide-constructors is the default.
2430 if (Args.hasFlag(options::OPT_fno_elide_constructors,
2431 options::OPT_felide_constructors,
2432 false))
2433 CmdArgs.push_back("-fno-elide-constructors");
2434
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002435 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002436 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
2437 KernelOrKext)
Daniel Dunbar484afa22009-11-19 04:55:23 +00002438 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00002439
Tony Linthicum76329bf2011-12-12 21:14:55 +00002440 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002441 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00002442 options::OPT_fno_short_enums,
2443 getToolChain().getTriple().getArch() ==
2444 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00002445 CmdArgs.push_back("-fshort-enums");
2446
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002447 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002448 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00002449 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00002450 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00002451
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002452 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002453 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00002454 options::OPT_fno_threadsafe_statics))
2455 CmdArgs.push_back("-fno-threadsafe-statics");
2456
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002457 // -fuse-cxa-atexit is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00002458 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
2459 options::OPT_fno_use_cxa_atexit,
2460 getToolChain().getTriple().getOS() != llvm::Triple::Cygwin &&
Tony Linthicum76329bf2011-12-12 21:14:55 +00002461 getToolChain().getTriple().getOS() != llvm::Triple::MinGW32 &&
Chad Rosier4fab82c2012-03-26 22:04:46 +00002462 getToolChain().getTriple().getArch() != llvm::Triple::hexagon) ||
2463 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00002464 CmdArgs.push_back("-fno-use-cxa-atexit");
2465
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002466 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00002467 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00002468 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
2469 CmdArgs.push_back("-fms-extensions");
2470
Chad Rosiered943242012-07-20 21:20:33 +00002471 // -fms-inline-asm.
Chad Rosierd3957e52012-07-20 23:12:26 +00002472 if (Args.hasArg(options::OPT_fenable_experimental_ms_inline_asm))
2473 CmdArgs.push_back("-fenable-experimental-ms-inline-asm");
Chad Rosiered943242012-07-20 21:20:33 +00002474
Francois Pichet1b4f1632011-09-17 04:32:15 +00002475 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00002476 if (Args.hasFlag(options::OPT_fms_compatibility,
2477 options::OPT_fno_ms_compatibility,
2478 (getToolChain().getTriple().getOS() == llvm::Triple::Win32 &&
2479 Args.hasFlag(options::OPT_fms_extensions,
2480 options::OPT_fno_ms_extensions,
2481 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00002482 CmdArgs.push_back("-fms-compatibility");
2483
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002484 // -fmsc-version=1300 is default.
2485 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2486 getToolChain().getTriple().getOS() == llvm::Triple::Win32) ||
2487 Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002488 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002489 if (msc_ver.empty())
2490 CmdArgs.push_back("-fmsc-version=1300");
2491 else
2492 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
2493 }
2494
2495
Dawn Perchik68bb1b42010-09-02 23:59:25 +00002496 // -fborland-extensions=0 is default.
2497 if (Args.hasFlag(options::OPT_fborland_extensions,
2498 options::OPT_fno_borland_extensions, false))
2499 CmdArgs.push_back("-fborland-extensions");
2500
Francois Pichet02744872011-09-01 16:38:08 +00002501 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
2502 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00002503 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
2504 options::OPT_fno_delayed_template_parsing,
Francois Pichet02744872011-09-01 16:38:08 +00002505 getToolChain().getTriple().getOS() == llvm::Triple::Win32))
Francois Pichet35bc5de2011-08-26 00:22:34 +00002506 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00002507
Chandler Carruthe03aa552010-04-17 20:17:31 +00002508 // -fgnu-keywords default varies depending on language; only pass if
2509 // specified.
2510 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00002511 options::OPT_fno_gnu_keywords))
2512 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00002513
Rafael Espindola922a6242011-06-02 17:30:53 +00002514 if (Args.hasFlag(options::OPT_fgnu89_inline,
2515 options::OPT_fno_gnu89_inline,
2516 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00002517 CmdArgs.push_back("-fgnu89-inline");
2518
Chad Rosier9c76d242012-03-15 22:31:42 +00002519 if (Args.hasArg(options::OPT_fno_inline))
2520 CmdArgs.push_back("-fno-inline");
2521
Chad Rosier64d6be92012-03-06 21:17:19 +00002522 if (Args.hasArg(options::OPT_fno_inline_functions))
2523 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00002524
John McCall5fb5df92012-06-20 06:18:46 +00002525 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00002526
John McCall5fb5df92012-06-20 06:18:46 +00002527 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
2528 // legacy is the default.
2529 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00002530 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
2531 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00002532 objcRuntime.isLegacyDispatchDefaultForArch(
2533 getToolChain().getTriple().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00002534 if (getToolChain().UseObjCMixedDispatch())
2535 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
2536 else
2537 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
2538 }
2539 }
2540
Nico Weber97bd94b2012-03-09 21:19:44 +00002541 // -fobjc-default-synthesize-properties=1 is default. This only has an effect
2542 // if the nonfragile objc abi is used.
Fariborz Jahanian05684072012-04-09 18:58:55 +00002543 if (getToolChain().IsObjCDefaultSynthPropertiesDefault()) {
David Chisnall3154e682011-09-30 13:32:35 +00002544 CmdArgs.push_back("-fobjc-default-synthesize-properties");
2545 }
2546
John McCall24fc0de2011-07-06 00:26:06 +00002547 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
2548 // NOTE: This logic is duplicated in ToolChains.cpp.
2549 bool ARC = isObjCAutoRefCount(Args);
2550 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00002551 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00002552
John McCall24fc0de2011-07-06 00:26:06 +00002553 CmdArgs.push_back("-fobjc-arc");
2554
Chandler Carruth491db322011-11-04 07:34:47 +00002555 // FIXME: It seems like this entire block, and several around it should be
2556 // wrapped in isObjC, but for now we just use it here as this is where it
2557 // was being used previously.
2558 if (types::isCXX(InputType) && types::isObjC(InputType)) {
2559 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
2560 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
2561 else
2562 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
2563 }
2564
John McCall24fc0de2011-07-06 00:26:06 +00002565 // Allow the user to enable full exceptions code emission.
2566 // We define off for Objective-CC, on for Objective-C++.
2567 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
2568 options::OPT_fno_objc_arc_exceptions,
2569 /*default*/ types::isCXX(InputType)))
2570 CmdArgs.push_back("-fobjc-arc-exceptions");
2571 }
2572
2573 // -fobjc-infer-related-result-type is the default, except in the Objective-C
2574 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00002575 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00002576 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002577
John McCall24fc0de2011-07-06 00:26:06 +00002578 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
2579 // takes precedence.
2580 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
2581 if (!GCArg)
2582 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
2583 if (GCArg) {
2584 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002585 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00002586 << GCArg->getAsString(Args);
2587 } else if (getToolChain().SupportsObjCGC()) {
2588 GCArg->render(Args, CmdArgs);
2589 } else {
2590 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002591 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00002592 << GCArg->getAsString(Args);
2593 }
2594 }
2595
John McCallb5f652e2011-06-22 00:53:57 +00002596 // Add exception args.
2597 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00002598 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00002599
2600 if (getToolChain().UseSjLjExceptions())
2601 CmdArgs.push_back("-fsjlj-exceptions");
2602
2603 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00002604 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
2605 options::OPT_fno_assume_sane_operator_new))
2606 CmdArgs.push_back("-fno-assume-sane-operator-new");
2607
Daniel Dunbar34d7a992010-04-27 15:34:57 +00002608 // -fconstant-cfstrings is default, and may be subject to argument translation
2609 // on Darwin.
2610 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
2611 options::OPT_fno_constant_cfstrings) ||
2612 !Args.hasFlag(options::OPT_mconstant_cfstrings,
2613 options::OPT_mno_constant_cfstrings))
2614 CmdArgs.push_back("-fno-constant-cfstrings");
2615
John Thompsoned4e2952009-11-05 20:14:16 +00002616 // -fshort-wchar default varies depending on platform; only
2617 // pass if specified.
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00002618 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar))
2619 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00002620
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +00002621 // -fno-pascal-strings is default, only pass non-default. If the tool chain
2622 // happened to translate to -mpascal-strings, we want to back translate here.
Daniel Dunbard4510f22009-04-07 23:51:44 +00002623 //
2624 // FIXME: This is gross; that translation should be pulled from the
2625 // tool chain.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002626 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00002627 options::OPT_fno_pascal_strings,
2628 false) ||
2629 Args.hasFlag(options::OPT_mpascal_strings,
2630 options::OPT_mno_pascal_strings,
2631 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002632 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002633
Daniel Dunbar096ed292011-10-05 21:04:55 +00002634 // Honor -fpack-struct= and -fpack-struct, if given. Note that
2635 // -fno-pack-struct doesn't apply to -fpack-struct=.
2636 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00002637 std::string PackStructStr = "-fpack-struct=";
2638 PackStructStr += A->getValue(Args);
2639 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00002640 } else if (Args.hasFlag(options::OPT_fpack_struct,
2641 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00002642 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00002643 }
2644
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002645 if (Args.hasArg(options::OPT_mkernel) ||
2646 Args.hasArg(options::OPT_fapple_kext)) {
2647 if (!Args.hasArg(options::OPT_fcommon))
2648 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00002649 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002650 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00002651
Daniel Dunbard18049a2009-04-07 21:16:11 +00002652 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00002653 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00002654 CmdArgs.push_back("-fno-common");
2655
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002656 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00002657 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00002658 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002659 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002660 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00002661 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
2662
Daniel Dunbar6358d682010-10-15 22:30:42 +00002663 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
2664 if (!Args.hasFlag(options::OPT_ffor_scope,
2665 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002666 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00002667 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
2668
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00002669 // -fcaret-diagnostics is default.
2670 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
2671 options::OPT_fno_caret_diagnostics, true))
2672 CmdArgs.push_back("-fno-caret-diagnostics");
2673
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002674 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00002675 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00002676 options::OPT_fno_diagnostics_fixit_info))
2677 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002678
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002679 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00002680 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002681 options::OPT_fno_diagnostics_show_option))
2682 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002683
Chris Lattnerbf6fac82010-05-04 21:55:25 +00002684 if (const Arg *A =
2685 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
2686 CmdArgs.push_back("-fdiagnostics-show-category");
2687 CmdArgs.push_back(A->getValue(Args));
2688 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002689
Douglas Gregor643c9222011-05-21 17:07:29 +00002690 if (const Arg *A =
2691 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
2692 CmdArgs.push_back("-fdiagnostics-format");
2693 CmdArgs.push_back(A->getValue(Args));
2694 }
2695
Chandler Carruthb6766f02011-03-27 01:50:55 +00002696 if (Arg *A = Args.getLastArg(
2697 options::OPT_fdiagnostics_show_note_include_stack,
2698 options::OPT_fno_diagnostics_show_note_include_stack)) {
2699 if (A->getOption().matches(
2700 options::OPT_fdiagnostics_show_note_include_stack))
2701 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
2702 else
2703 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
2704 }
2705
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002706 // Color diagnostics are the default, unless the terminal doesn't support
2707 // them.
2708 if (Args.hasFlag(options::OPT_fcolor_diagnostics,
Argyrios Kyrtzidis4f920162010-09-23 12:56:06 +00002709 options::OPT_fno_color_diagnostics,
2710 llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00002711 CmdArgs.push_back("-fcolor-diagnostics");
2712
Daniel Dunbardb097022009-06-08 21:13:54 +00002713 if (!Args.hasFlag(options::OPT_fshow_source_location,
2714 options::OPT_fno_show_source_location))
2715 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00002716
Douglas Gregor643c9222011-05-21 17:07:29 +00002717 if (!Args.hasFlag(options::OPT_fshow_column,
2718 options::OPT_fno_show_column,
2719 true))
2720 CmdArgs.push_back("-fno-show-column");
2721
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00002722 if (!Args.hasFlag(options::OPT_fspell_checking,
2723 options::OPT_fno_spell_checking))
2724 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002725
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002726
Daniel Dunbar3ada2b72010-11-02 19:42:04 +00002727 // Silently ignore -fasm-blocks for now.
2728 (void) Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
2729 false);
Daniel Dunbar473f8a62010-10-18 22:49:46 +00002730
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00002731 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
2732 A->render(Args, CmdArgs);
2733
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002734 // -fdollars-in-identifiers default varies depending on platform and
2735 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00002736 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002737 options::OPT_fno_dollars_in_identifiers)) {
2738 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002739 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002740 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00002741 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00002742 }
2743
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002744 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
2745 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00002746 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002747 options::OPT_fno_unit_at_a_time)) {
2748 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002749 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00002750 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002751
Eli Friedman055c9702011-11-02 01:53:16 +00002752 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
2753 options::OPT_fno_apple_pragma_pack, false))
2754 CmdArgs.push_back("-fapple-pragma-pack");
2755
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002756 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002757 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002758 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002759#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00002760 if (getToolChain().getTriple().isOSDarwin() &&
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002761 (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
2762 getToolChain().getTriple().getArch() == llvm::Triple::thumb)) {
2763 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
2764 CmdArgs.push_back("-fno-builtin-strcat");
2765 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
2766 CmdArgs.push_back("-fno-builtin-strcpy");
2767 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00002768#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00002769
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002770 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00002771 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002772 options::OPT_traditional_cpp)) {
2773 if (isa<PreprocessJobAction>(JA))
2774 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00002775 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002776 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00002777 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00002778
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002779 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00002780 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00002781
2782 // Handle serialized diagnostics.
2783 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
2784 CmdArgs.push_back("-serialize-diagnostic-file");
2785 CmdArgs.push_back(Args.MakeArgString(A->getValue(Args)));
2786 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002787
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002788 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
2789 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002790 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002791 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
2792 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00002793 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00002794
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002795 // We translate this by hand to the -cc1 argument, since nightly test uses
2796 // it and developers have been trained to spell it with -mllvm.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002797 if (StringRef((*it)->getValue(Args, 0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002798 CmdArgs.push_back("-disable-llvm-optzns");
2799 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00002800 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00002801 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002802
Daniel Dunbard67a3222009-03-30 06:36:42 +00002803 if (Output.getType() == types::TY_Dependencies) {
2804 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002805 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00002806 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002807 CmdArgs.push_back(Output.getFilename());
2808 } else {
2809 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00002810 }
2811
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002812 for (InputInfoList::const_iterator
2813 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
2814 const InputInfo &II = *it;
2815 CmdArgs.push_back("-x");
2816 CmdArgs.push_back(types::getTypeName(II.getType()));
Daniel Dunbarb440f562010-08-02 02:38:21 +00002817 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002818 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002819 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00002820 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002821 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002822
Chris Lattnere9d7d782009-11-03 19:50:27 +00002823 Args.AddAllArgs(CmdArgs, options::OPT_undef);
2824
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00002825 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002826
2827 // Optionally embed the -cc1 level arguments into the debug info, for build
2828 // analysis.
2829 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002830 ArgStringList OriginalArgs;
2831 for (ArgList::const_iterator it = Args.begin(),
2832 ie = Args.end(); it != ie; ++it)
2833 (*it)->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00002834
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00002835 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002836 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002837 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002838 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00002839 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00002840 }
2841 CmdArgs.push_back("-dwarf-debug-flags");
2842 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
2843 }
2844
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00002845 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar17731772009-03-23 19:03:36 +00002846
Roman Divacky178e01602011-02-10 16:52:03 +00002847 if (Arg *A = Args.getLastArg(options::OPT_pg))
2848 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002849 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00002850 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002851
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002852 // Claim some arguments which clang supports automatically.
2853
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00002854 // -fpch-preprocess is used with gcc to add a special marker in the output to
2855 // include the PCH file. Clang's PTH solution is completely transparent, so we
2856 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00002857 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002858
Daniel Dunbar17731772009-03-23 19:03:36 +00002859 // Claim some arguments which clang doesn't support, but we don't
2860 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00002861 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
2862 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00002863
Rafael Espindolad95a8122011-03-01 05:25:27 +00002864 // Disable warnings for clang -E -use-gold-plugin -emit-llvm foo.c
Rafael Espindola22f603032011-02-28 23:29:45 +00002865 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolad95a8122011-03-01 05:25:27 +00002866 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002867}
2868
Jim Grosbach576452b2012-02-10 20:37:10 +00002869void ClangAs::AddARMTargetArgs(const ArgList &Args,
2870 ArgStringList &CmdArgs) const {
2871 const Driver &D = getToolChain().getDriver();
2872 llvm::Triple Triple = getToolChain().getTriple();
2873
2874 // Set the CPU based on -march= and -mcpu=.
2875 CmdArgs.push_back("-target-cpu");
Benjamin Kramer09811c72012-06-26 22:20:06 +00002876 CmdArgs.push_back(Args.MakeArgString(getARMTargetCPU(Args, Triple)));
Jim Grosbach576452b2012-02-10 20:37:10 +00002877
2878 // Honor -mfpu=.
Chad Rosiercfbfc582012-04-04 20:51:35 +00002879 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Chad Rosierd1717c12012-04-04 20:56:36 +00002880 addFPUArgs(D, A, Args, CmdArgs);
Chad Rosier1f0e52e2012-04-04 20:39:32 +00002881
2882 // Honor -mfpmath=.
2883 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ))
Chad Rosier45619cb2012-04-04 22:13:40 +00002884 addFPMathArgs(D, A, Args, CmdArgs, getARMTargetCPU(Args, Triple));
Jim Grosbach576452b2012-02-10 20:37:10 +00002885}
2886
John McCall5fb5df92012-06-20 06:18:46 +00002887/// Add options related to the Objective-C runtime/ABI.
2888///
2889/// Returns true if the runtime is non-fragile.
2890ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
2891 ArgStringList &cmdArgs,
2892 RewriteKind rewriteKind) const {
2893 // Look for the controlling runtime option.
2894 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
2895 options::OPT_fgnu_runtime,
2896 options::OPT_fobjc_runtime_EQ);
2897
2898 // Just forward -fobjc-runtime= to the frontend. This supercedes
2899 // options about fragility.
2900 if (runtimeArg &&
2901 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
2902 ObjCRuntime runtime;
2903 StringRef value = runtimeArg->getValue(args);
2904 if (runtime.tryParse(value)) {
2905 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
2906 << value;
2907 }
2908
2909 runtimeArg->render(args, cmdArgs);
2910 return runtime;
2911 }
2912
2913 // Otherwise, we'll need the ABI "version". Version numbers are
2914 // slightly confusing for historical reasons:
2915 // 1 - Traditional "fragile" ABI
2916 // 2 - Non-fragile ABI, version 1
2917 // 3 - Non-fragile ABI, version 2
2918 unsigned objcABIVersion = 1;
2919 // If -fobjc-abi-version= is present, use that to set the version.
2920 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
2921 StringRef value = abiArg->getValue(args);
2922 if (value == "1")
2923 objcABIVersion = 1;
2924 else if (value == "2")
2925 objcABIVersion = 2;
2926 else if (value == "3")
2927 objcABIVersion = 3;
2928 else
2929 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2930 << value;
2931 } else {
2932 // Otherwise, determine if we are using the non-fragile ABI.
2933 bool nonFragileABIIsDefault =
2934 (rewriteKind == RK_NonFragile ||
2935 (rewriteKind == RK_None &&
2936 getToolChain().IsObjCNonFragileABIDefault()));
2937 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
2938 options::OPT_fno_objc_nonfragile_abi,
2939 nonFragileABIIsDefault)) {
2940 // Determine the non-fragile ABI version to use.
2941#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
2942 unsigned nonFragileABIVersion = 1;
2943#else
2944 unsigned nonFragileABIVersion = 2;
2945#endif
2946
2947 if (Arg *abiArg = args.getLastArg(
2948 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
2949 StringRef value = abiArg->getValue(args);
2950 if (value == "1")
2951 nonFragileABIVersion = 1;
2952 else if (value == "2")
2953 nonFragileABIVersion = 2;
2954 else
2955 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
2956 << value;
2957 }
2958
2959 objcABIVersion = 1 + nonFragileABIVersion;
2960 } else {
2961 objcABIVersion = 1;
2962 }
2963 }
2964
2965 // We don't actually care about the ABI version other than whether
2966 // it's non-fragile.
2967 bool isNonFragile = objcABIVersion != 1;
2968
2969 // If we have no runtime argument, ask the toolchain for its default runtime.
2970 // However, the rewriter only really supports the Mac runtime, so assume that.
2971 ObjCRuntime runtime;
2972 if (!runtimeArg) {
2973 switch (rewriteKind) {
2974 case RK_None:
2975 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2976 break;
2977 case RK_Fragile:
2978 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
2979 break;
2980 case RK_NonFragile:
2981 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2982 break;
2983 }
2984
2985 // -fnext-runtime
2986 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
2987 // On Darwin, make this use the default behavior for the toolchain.
2988 if (getToolChain().getTriple().isOSDarwin()) {
2989 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
2990
2991 // Otherwise, build for a generic macosx port.
2992 } else {
2993 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
2994 }
2995
2996 // -fgnu-runtime
2997 } else {
2998 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00002999 // Legacy behaviour is to target the gnustep runtime if we are i
3000 // non-fragile mode or the GCC runtime in fragile mode.
3001 if (isNonFragile)
3002 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple());
3003 else
3004 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00003005 }
3006
3007 cmdArgs.push_back(args.MakeArgString(
3008 "-fobjc-runtime=" + runtime.getAsString()));
3009 return runtime;
3010}
3011
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003012void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003013 const InputInfo &Output,
3014 const InputInfoList &Inputs,
3015 const ArgList &Args,
3016 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003017 ArgStringList CmdArgs;
3018
3019 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
3020 const InputInfo &Input = Inputs[0];
3021
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003022 // Don't warn about "clang -w -c foo.s"
3023 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00003024 // and "clang -emit-llvm -c foo.s"
3025 Args.ClaimAllArgs(options::OPT_emit_llvm);
3026 // and "clang -use-gold-plugin -c foo.s"
3027 Args.ClaimAllArgs(options::OPT_use_gold_plugin);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00003028
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003029 // Invoke ourselves in -cc1as mode.
3030 //
3031 // FIXME: Implement custom jobs for internal actions.
3032 CmdArgs.push_back("-cc1as");
3033
3034 // Add the "effective" target triple.
3035 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00003036 std::string TripleStr =
3037 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003038 CmdArgs.push_back(Args.MakeArgString(TripleStr));
3039
3040 // Set the output mode, we currently only expect to be used as a real
3041 // assembler.
3042 CmdArgs.push_back("-filetype");
3043 CmdArgs.push_back("obj");
3044
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00003045 if (UseRelaxAll(C, Args))
Daniel Dunbar99ca8b72010-05-28 16:43:21 +00003046 CmdArgs.push_back("-relax-all");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003047
Jim Grosbach576452b2012-02-10 20:37:10 +00003048 // Add target specific cpu and features flags.
3049 switch(getToolChain().getTriple().getArch()) {
3050 default:
3051 break;
3052
3053 case llvm::Triple::arm:
3054 case llvm::Triple::thumb:
3055 AddARMTargetArgs(Args, CmdArgs);
3056 break;
3057 }
3058
Daniel Dunbar1d733e22011-03-17 17:37:29 +00003059 // Ignore explicit -force_cpusubtype_ALL option.
3060 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003061
Eric Christopherfc3ee562012-01-10 00:38:01 +00003062 // Determine the original source input.
3063 const Action *SourceAction = &JA;
3064 while (SourceAction->getKind() != Action::InputClass) {
3065 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
3066 SourceAction = SourceAction->getInputs()[0];
3067 }
3068
3069 // Forward -g, assuming we are dealing with an actual assembly file.
3070 if (SourceAction->getType() == types::TY_Asm ||
3071 SourceAction->getType() == types::TY_PP_Asm) {
3072 Args.ClaimAllArgs(options::OPT_g_Group);
3073 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
3074 if (!A->getOption().matches(options::OPT_g0))
3075 CmdArgs.push_back("-g");
3076 }
Kevin Enderby292dc082011-12-22 19:31:58 +00003077
3078 // Optionally embed the -cc1as level arguments into the debug info, for build
3079 // analysis.
3080 if (getToolChain().UseDwarfDebugFlags()) {
3081 ArgStringList OriginalArgs;
3082 for (ArgList::const_iterator it = Args.begin(),
3083 ie = Args.end(); it != ie; ++it)
3084 (*it)->render(Args, OriginalArgs);
3085
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00003086 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00003087 const char *Exec = getToolChain().getDriver().getClangProgramPath();
3088 Flags += Exec;
3089 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
3090 Flags += " ";
3091 Flags += OriginalArgs[i];
3092 }
3093 CmdArgs.push_back("-dwarf-debug-flags");
3094 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
3095 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003096
3097 // FIXME: Add -static support, once we have it.
3098
3099 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3100 options::OPT_Xassembler);
Daniel Dunbar252e8f92011-04-29 17:53:18 +00003101 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003102
3103 assert(Output.isFilename() && "Unexpected lipo output.");
3104 CmdArgs.push_back("-o");
3105 CmdArgs.push_back(Output.getFilename());
3106
Daniel Dunbarb440f562010-08-02 02:38:21 +00003107 assert(Input.isFilename() && "Invalid input.");
3108 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003109
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00003110 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003111 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00003112}
3113
Daniel Dunbara3246a02009-03-18 08:07:30 +00003114void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003115 const InputInfo &Output,
3116 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003117 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00003118 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003119 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003120 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003121
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003122 for (ArgList::const_iterator
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003123 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003124 Arg *A = *it;
Daniel Dunbar2da02722009-03-19 07:55:12 +00003125 if (A->getOption().hasForwardToGCC()) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00003126 // Don't forward any -g arguments to assembly steps.
3127 if (isa<AssembleJobAction>(JA) &&
3128 A->getOption().matches(options::OPT_g_Group))
3129 continue;
3130
Daniel Dunbar2da02722009-03-19 07:55:12 +00003131 // It is unfortunate that we have to claim here, as this means
3132 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00003133 // platforms using a generic gcc, even if we are just using gcc
3134 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00003135 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003136 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00003137 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003138 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003139
Daniel Dunbar4e295052010-01-25 22:35:08 +00003140 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003141
3142 // If using a driver driver, force the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003143 const std::string &Arch = getToolChain().getArchName();
Bob Wilson6524dd32011-10-14 05:03:44 +00003144 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003145 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00003146
3147 // FIXME: Remove these special cases.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003148 if (Arch == "powerpc")
3149 CmdArgs.push_back("ppc");
3150 else if (Arch == "powerpc64")
3151 CmdArgs.push_back("ppc64");
3152 else
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003153 CmdArgs.push_back(Args.MakeArgString(Arch));
Daniel Dunbara3246a02009-03-18 08:07:30 +00003154 }
3155
Daniel Dunbar5716d872009-05-02 21:41:52 +00003156 // Try to force gcc to match the tool chain we want, if we recognize
3157 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003158 //
3159 // FIXME: The triple class should directly provide the information we want
3160 // here.
3161 if (Arch == "i386" || Arch == "powerpc")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003162 CmdArgs.push_back("-m32");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00003163 else if (Arch == "x86_64" || Arch == "powerpc64")
Daniel Dunbar5716d872009-05-02 21:41:52 +00003164 CmdArgs.push_back("-m64");
3165
Daniel Dunbarb440f562010-08-02 02:38:21 +00003166 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003167 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003168 CmdArgs.push_back(Output.getFilename());
3169 } else {
3170 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00003171 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003172 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003173
Tony Linthicum76329bf2011-12-12 21:14:55 +00003174 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
3175 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003176
3177 // Only pass -x if gcc will understand it; otherwise hope gcc
3178 // understands the suffix correctly. The main use case this would go
3179 // wrong in is for linker inputs if they happened to have an odd
3180 // suffix; really the only way to get this to happen is a command
3181 // like '-x foobar a.c' which will treat a.c like a linker input.
3182 //
3183 // FIXME: For the linker case specifically, can we safely convert
3184 // inputs into '-Wl,' options?
3185 for (InputInfoList::const_iterator
3186 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3187 const InputInfo &II = *it;
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003188
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003189 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003190 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3191 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003192 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003193 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003194 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003195 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003196 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00003197
Daniel Dunbara3246a02009-03-18 08:07:30 +00003198 if (types::canTypeBeUserSpecified(II.getType())) {
3199 CmdArgs.push_back("-x");
3200 CmdArgs.push_back(types::getTypeName(II.getType()));
3201 }
3202
Daniel Dunbarb440f562010-08-02 02:38:21 +00003203 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003204 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00003205 else {
3206 const Arg &A = II.getInputArg();
3207
3208 // Reverse translate some rewritten options.
3209 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
3210 CmdArgs.push_back("-lstdc++");
3211 continue;
3212 }
3213
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00003214 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00003215 A.render(Args, CmdArgs);
3216 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00003217 }
3218
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003219 const std::string customGCCName = D.getCCCGenericGCCName();
3220 const char *GCCName;
3221 if (!customGCCName.empty())
3222 GCCName = customGCCName.c_str();
3223 else if (D.CCCIsCXX) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003224 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00003225 } else
3226 GCCName = "gcc";
3227
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003228 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003229 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003230 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003231}
3232
Daniel Dunbar4e295052010-01-25 22:35:08 +00003233void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
3234 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003235 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003236}
3237
Daniel Dunbar4e295052010-01-25 22:35:08 +00003238void gcc::Precompile::RenderExtraToolArgs(const JobAction &JA,
3239 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003240 // The type is good enough.
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003241}
3242
Daniel Dunbar4e295052010-01-25 22:35:08 +00003243void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
3244 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003245 const Driver &D = getToolChain().getDriver();
3246
Daniel Dunbar4e295052010-01-25 22:35:08 +00003247 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00003248 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
3249 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00003250 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003251 else {
3252 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003253 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003254 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003255
Daniel Dunbar4e295052010-01-25 22:35:08 +00003256 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003257 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003258}
3259
Daniel Dunbar4e295052010-01-25 22:35:08 +00003260void gcc::Assemble::RenderExtraToolArgs(const JobAction &JA,
3261 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003262 CmdArgs.push_back("-c");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003263}
Daniel Dunbara3246a02009-03-18 08:07:30 +00003264
Daniel Dunbar4e295052010-01-25 22:35:08 +00003265void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
3266 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00003267 // The types are (hopefully) good enough.
3268}
3269
Tony Linthicum76329bf2011-12-12 21:14:55 +00003270// Hexagon tools start.
3271void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
3272 ArgStringList &CmdArgs) const {
3273
3274}
3275void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
3276 const InputInfo &Output,
3277 const InputInfoList &Inputs,
3278 const ArgList &Args,
3279 const char *LinkingOutput) const {
3280
3281 const Driver &D = getToolChain().getDriver();
3282 ArgStringList CmdArgs;
3283
3284 std::string MarchString = "-march=";
3285 MarchString += getHexagonTargetCPU(Args);
3286 CmdArgs.push_back(Args.MakeArgString(MarchString));
3287
3288 RenderExtraToolArgs(JA, CmdArgs);
3289
3290 if (Output.isFilename()) {
3291 CmdArgs.push_back("-o");
3292 CmdArgs.push_back(Output.getFilename());
3293 } else {
3294 assert(Output.isNothing() && "Unexpected output");
3295 CmdArgs.push_back("-fsyntax-only");
3296 }
3297
3298
3299 // Only pass -x if gcc will understand it; otherwise hope gcc
3300 // understands the suffix correctly. The main use case this would go
3301 // wrong in is for linker inputs if they happened to have an odd
3302 // suffix; really the only way to get this to happen is a command
3303 // like '-x foobar a.c' which will treat a.c like a linker input.
3304 //
3305 // FIXME: For the linker case specifically, can we safely convert
3306 // inputs into '-Wl,' options?
3307 for (InputInfoList::const_iterator
3308 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3309 const InputInfo &II = *it;
3310
3311 // Don't try to pass LLVM or AST inputs to a generic gcc.
3312 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3313 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3314 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3315 << getToolChain().getTripleString();
3316 else if (II.getType() == types::TY_AST)
3317 D.Diag(clang::diag::err_drv_no_ast_support)
3318 << getToolChain().getTripleString();
3319
3320 if (II.isFilename())
3321 CmdArgs.push_back(II.getFilename());
3322 else
3323 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3324 II.getInputArg().render(Args, CmdArgs);
3325 }
3326
3327 const char *GCCName = "hexagon-as";
3328 const char *Exec =
3329 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3330 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3331
3332}
3333void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
3334 ArgStringList &CmdArgs) const {
3335 // The types are (hopefully) good enough.
3336}
3337
3338void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
3339 const InputInfo &Output,
3340 const InputInfoList &Inputs,
3341 const ArgList &Args,
3342 const char *LinkingOutput) const {
3343
3344 const Driver &D = getToolChain().getDriver();
3345 ArgStringList CmdArgs;
3346
3347 for (ArgList::const_iterator
3348 it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3349 Arg *A = *it;
3350 if (A->getOption().hasForwardToGCC()) {
3351 // Don't forward any -g arguments to assembly steps.
3352 if (isa<AssembleJobAction>(JA) &&
3353 A->getOption().matches(options::OPT_g_Group))
3354 continue;
3355
3356 // It is unfortunate that we have to claim here, as this means
3357 // we will basically never report anything interesting for
3358 // platforms using a generic gcc, even if we are just using gcc
3359 // to get to the assembler.
3360 A->claim();
3361 A->render(Args, CmdArgs);
3362 }
3363 }
3364
3365 RenderExtraToolArgs(JA, CmdArgs);
3366
3367 // Add Arch Information
3368 Arg *A;
Sebastian Pop86500282012-01-13 20:37:10 +00003369 if ((A = getLastHexagonArchArg(Args))) {
3370 if (A->getOption().matches(options::OPT_m_Joined))
3371 A->render(Args, CmdArgs);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003372 else
Sebastian Pop86500282012-01-13 20:37:10 +00003373 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
Tony Linthicum76329bf2011-12-12 21:14:55 +00003374 }
Sebastian Pop86500282012-01-13 20:37:10 +00003375 else {
3376 CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
3377 }
3378
Tony Linthicum76329bf2011-12-12 21:14:55 +00003379 CmdArgs.push_back("-mqdsp6-compat");
3380
3381 const char *GCCName;
3382 if (C.getDriver().CCCIsCXX)
3383 GCCName = "hexagon-g++";
3384 else
3385 GCCName = "hexagon-gcc";
3386 const char *Exec =
3387 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
3388
3389 if (Output.isFilename()) {
3390 CmdArgs.push_back("-o");
3391 CmdArgs.push_back(Output.getFilename());
3392 }
3393
3394 for (InputInfoList::const_iterator
3395 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3396 const InputInfo &II = *it;
3397
3398 // Don't try to pass LLVM or AST inputs to a generic gcc.
3399 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
3400 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
3401 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
3402 << getToolChain().getTripleString();
3403 else if (II.getType() == types::TY_AST)
3404 D.Diag(clang::diag::err_drv_no_ast_support)
3405 << getToolChain().getTripleString();
3406
3407 if (II.isFilename())
3408 CmdArgs.push_back(II.getFilename());
3409 else
3410 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
3411 II.getInputArg().render(Args, CmdArgs);
3412 }
3413 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
3414
3415}
3416// Hexagon tools end.
3417
3418
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003419const char *darwin::CC1::getCC1Name(types::ID Type) const {
3420 switch (Type) {
3421 default:
David Blaikie83d382b2011-09-23 05:06:16 +00003422 llvm_unreachable("Unexpected type for Darwin CC1 tool.");
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003423 case types::TY_Asm:
3424 case types::TY_C: case types::TY_CHeader:
3425 case types::TY_PP_C: case types::TY_PP_CHeader:
3426 return "cc1";
3427 case types::TY_ObjC: case types::TY_ObjCHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003428 case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
3429 case types::TY_PP_ObjCHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003430 return "cc1obj";
3431 case types::TY_CXX: case types::TY_CXXHeader:
3432 case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
3433 return "cc1plus";
3434 case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
Nico Webered8080c2011-08-13 23:13:37 +00003435 case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
3436 case types::TY_PP_ObjCXXHeader:
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003437 return "cc1objplus";
3438 }
3439}
3440
David Blaikie68e081d2011-12-20 02:48:34 +00003441void darwin::CC1::anchor() {}
3442
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003443const char *darwin::CC1::getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003444 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00003445 return Args.MakeArgString(
3446 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003447}
3448
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003449const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003450 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003451 const char *Str = getBaseInputName(Args, Inputs);
3452
Chris Lattner906bb902011-01-16 08:14:11 +00003453 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003454 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003455
3456 return Str;
3457}
3458
3459const char *
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003460darwin::CC1::getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003461 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003462 // FIXME: Think about this more.
3463 std::string Res;
3464
3465 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3466 std::string Str(OutputOpt->getValue(Args));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003467 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003468 } else {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003469 Res = darwin::CC1::getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003470 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003471 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003472}
3473
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003474void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
Eric Christopher84fbdb42011-08-19 00:30:14 +00003475 for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003476 it != ie;) {
Chad Rosier2f818792011-08-18 17:56:32 +00003477
3478 StringRef Option = *it;
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003479 bool RemoveOption = false;
Chad Rosier30453862011-08-18 01:18:28 +00003480
Bob Wilson7ecbd322012-02-07 01:17:55 +00003481 // Erase both -fmodule-cache-path and its argument.
3482 if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
3483 it = CmdArgs.erase(it, it+2);
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003484 ie = CmdArgs.end();
Chad Rosier30453862011-08-18 01:18:28 +00003485 continue;
3486 }
3487
Bob Wilson7ecbd322012-02-07 01:17:55 +00003488 // Remove unsupported -f options.
3489 if (Option.startswith("-f")) {
3490 // Remove -f/-fno- to reduce the number of cases.
3491 if (Option.startswith("-fno-"))
3492 Option = Option.substr(5);
3493 else
3494 Option = Option.substr(2);
3495 RemoveOption = llvm::StringSwitch<bool>(Option)
3496 .Case("altivec", true)
3497 .Case("modules", true)
3498 .Case("diagnostics-show-note-include-stack", true)
3499 .Default(false);
3500 }
3501
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003502 // Handle machine specific options.
3503 if (Option.startswith("-m")) {
3504 RemoveOption = llvm::StringSwitch<bool>(Option)
3505 .Case("-mthumb", true)
3506 .Case("-mno-thumb", true)
3507 .Case("-mno-fused-madd", true)
3508 .Case("-mlong-branch", true)
3509 .Case("-mlongcall", true)
3510 .Case("-mcpu=G4", true)
3511 .Case("-mcpu=G5", true)
3512 .Default(false);
3513 }
3514
3515 // Handle warning options.
3516 if (Option.startswith("-W")) {
3517 // Remove -W/-Wno- to reduce the number of cases.
3518 if (Option.startswith("-Wno-"))
3519 Option = Option.substr(5);
3520 else
3521 Option = Option.substr(2);
3522
3523 RemoveOption = llvm::StringSwitch<bool>(Option)
3524 .Case("address-of-temporary", true)
3525 .Case("ambiguous-member-template", true)
3526 .Case("analyzer-incompatible-plugin", true)
3527 .Case("array-bounds", true)
3528 .Case("array-bounds-pointer-arithmetic", true)
3529 .Case("bind-to-temporary-copy", true)
3530 .Case("bitwise-op-parentheses", true)
3531 .Case("bool-conversions", true)
3532 .Case("builtin-macro-redefined", true)
3533 .Case("c++-hex-floats", true)
3534 .Case("c++0x-compat", true)
3535 .Case("c++0x-extensions", true)
3536 .Case("c++0x-narrowing", true)
Richard Smith31ce7932011-10-13 23:32:09 +00003537 .Case("c++11-compat", true)
3538 .Case("c++11-extensions", true)
3539 .Case("c++11-narrowing", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003540 .Case("conditional-uninitialized", true)
3541 .Case("constant-conversion", true)
David Blaikieebcbe4b2012-03-15 04:50:32 +00003542 .Case("conversion-null", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003543 .Case("CFString-literal", true)
3544 .Case("constant-logical-operand", true)
3545 .Case("custom-atomic-properties", true)
3546 .Case("default-arg-special-member", true)
3547 .Case("delegating-ctor-cycles", true)
3548 .Case("delete-non-virtual-dtor", true)
3549 .Case("deprecated-implementations", true)
3550 .Case("deprecated-writable-strings", true)
3551 .Case("distributed-object-modifiers", true)
3552 .Case("duplicate-method-arg", true)
3553 .Case("dynamic-class-memaccess", true)
3554 .Case("enum-compare", true)
3555 .Case("exit-time-destructors", true)
3556 .Case("gnu", true)
3557 .Case("gnu-designator", true)
3558 .Case("header-hygiene", true)
3559 .Case("idiomatic-parentheses", true)
3560 .Case("ignored-qualifiers", true)
3561 .Case("implicit-atomic-properties", true)
3562 .Case("incompatible-pointer-types", true)
3563 .Case("incomplete-implementation", true)
3564 .Case("initializer-overrides", true)
3565 .Case("invalid-noreturn", true)
3566 .Case("invalid-token-paste", true)
Ivan Krasin31f74112011-10-06 02:46:34 +00003567 .Case("language-extension-token", true)
Chad Rosierf29d9aa2011-08-26 18:30:43 +00003568 .Case("literal-conversion", true)
3569 .Case("literal-range", true)
3570 .Case("local-type-template-args", true)
3571 .Case("logical-op-parentheses", true)
3572 .Case("method-signatures", true)
3573 .Case("microsoft", true)
3574 .Case("mismatched-tags", true)
3575 .Case("missing-method-return-type", true)
3576 .Case("non-pod-varargs", true)
3577 .Case("nonfragile-abi2", true)
3578 .Case("null-arithmetic", true)
3579 .Case("null-dereference", true)
3580 .Case("out-of-line-declaration", true)
3581 .Case("overriding-method-mismatch", true)
3582 .Case("readonly-setter-attrs", true)
3583 .Case("return-stack-address", true)
3584 .Case("self-assign", true)
3585 .Case("semicolon-before-method-body", true)
3586 .Case("sentinel", true)
3587 .Case("shift-overflow", true)
3588 .Case("shift-sign-overflow", true)
3589 .Case("sign-conversion", true)
3590 .Case("sizeof-array-argument", true)
3591 .Case("sizeof-pointer-memaccess", true)
3592 .Case("string-compare", true)
3593 .Case("super-class-method-mismatch", true)
3594 .Case("tautological-compare", true)
3595 .Case("typedef-redefinition", true)
3596 .Case("typename-missing", true)
3597 .Case("undefined-reinterpret-cast", true)
3598 .Case("unknown-warning-option", true)
3599 .Case("unnamed-type-template-args", true)
3600 .Case("unneeded-internal-declaration", true)
3601 .Case("unneeded-member-function", true)
3602 .Case("unused-comparison", true)
3603 .Case("unused-exception-parameter", true)
3604 .Case("unused-member-function", true)
3605 .Case("unused-result", true)
3606 .Case("vector-conversions", true)
3607 .Case("vla", true)
3608 .Case("used-but-marked-unused", true)
3609 .Case("weak-vtables", true)
3610 .Default(false);
3611 } // if (Option.startswith("-W"))
Chad Rosier30453862011-08-18 01:18:28 +00003612 if (RemoveOption) {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003613 it = CmdArgs.erase(it);
Chad Rosier23594f62011-08-17 18:51:56 +00003614 ie = CmdArgs.end();
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003615 } else {
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003616 ++it;
Chad Rosier6fdf38b2011-08-17 23:08:45 +00003617 }
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00003618 }
3619}
3620
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003621void darwin::CC1::AddCC1Args(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003622 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003623 const Driver &D = getToolChain().getDriver();
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003624
3625 CheckCodeGenerationOptions(D, Args);
3626
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003627 // Derived from cc1 spec.
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003628 if (!Args.hasArg(options::OPT_mkernel) && !Args.hasArg(options::OPT_static) &&
3629 !Args.hasArg(options::OPT_mdynamic_no_pic))
3630 CmdArgs.push_back("-fPIC");
3631
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003632 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3633 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3634 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
3635 CmdArgs.push_back("-fno-builtin-strcat");
3636 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
3637 CmdArgs.push_back("-fno-builtin-strcpy");
3638 }
3639
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003640 if (Args.hasArg(options::OPT_g_Flag) &&
3641 !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
3642 CmdArgs.push_back("-feliminate-unused-debug-symbols");
3643}
3644
3645void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3646 const InputInfoList &Inputs,
3647 const ArgStringList &OutputArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003648 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003649
3650 // Derived from cc1_options spec.
3651 if (Args.hasArg(options::OPT_fast) ||
3652 Args.hasArg(options::OPT_fastf) ||
3653 Args.hasArg(options::OPT_fastcp))
3654 CmdArgs.push_back("-O3");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003655
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003656 if (Arg *A = Args.getLastArg(options::OPT_pg))
3657 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003658 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003659 << A->getAsString(Args) << "-fomit-frame-pointer";
3660
3661 AddCC1Args(Args, CmdArgs);
3662
3663 if (!Args.hasArg(options::OPT_Q))
3664 CmdArgs.push_back("-quiet");
3665
3666 CmdArgs.push_back("-dumpbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003667 CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003668
3669 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3670
3671 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
3672 Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
3673
3674 // FIXME: The goal is to use the user provided -o if that is our
3675 // final output, otherwise to drive from the original input
3676 // name. Find a clean way to go about this.
3677 if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
3678 Args.hasArg(options::OPT_o)) {
3679 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
3680 CmdArgs.push_back("-auxbase-strip");
3681 CmdArgs.push_back(OutputOpt->getValue(Args));
3682 } else {
3683 CmdArgs.push_back("-auxbase");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003684 CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003685 }
3686
3687 Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
3688
3689 Args.AddAllArgs(CmdArgs, options::OPT_O);
3690 // FIXME: -Wall is getting some special treatment. Investigate.
3691 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3692 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003693 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003694 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003695 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3696 // Honor -std-default.
3697 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3698 "-std=", /*Joined=*/true);
3699 }
3700
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003701 if (Args.hasArg(options::OPT_v))
3702 CmdArgs.push_back("-version");
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003703 if (Args.hasArg(options::OPT_pg) &&
3704 getToolChain().SupportsProfiling())
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003705 CmdArgs.push_back("-p");
3706 Args.AddLastArg(CmdArgs, options::OPT_p);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003707
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003708 // The driver treats -fsyntax-only specially.
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003709 if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
3710 getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
3711 // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
3712 // used to inhibit the default -fno-builtin-str{cat,cpy}.
3713 //
3714 // FIXME: Should we grow a better way to deal with "removing" args?
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00003715 for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
3716 options::OPT_fsyntax_only),
3717 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00003718 if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
3719 !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
3720 (*it)->claim();
3721 (*it)->render(Args, CmdArgs);
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00003722 }
3723 }
3724 } else
3725 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003726
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003727 // Claim Clang only -f options, they aren't worth warning about.
3728 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3729
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003730 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3731 if (Args.hasArg(options::OPT_Qn))
3732 CmdArgs.push_back("-fno-ident");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003733
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003734 // FIXME: This isn't correct.
3735 //Args.AddLastArg(CmdArgs, options::OPT__help)
3736 //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
3737
3738 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3739
3740 // FIXME: Still don't get what is happening here. Investigate.
3741 Args.AddAllArgs(CmdArgs, options::OPT__param);
3742
3743 if (Args.hasArg(options::OPT_fmudflap) ||
3744 Args.hasArg(options::OPT_fmudflapth)) {
3745 CmdArgs.push_back("-fno-builtin");
3746 CmdArgs.push_back("-fno-merge-constants");
3747 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003748
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003749 if (Args.hasArg(options::OPT_coverage)) {
3750 CmdArgs.push_back("-fprofile-arcs");
3751 CmdArgs.push_back("-ftest-coverage");
3752 }
3753
3754 if (types::isCXX(Inputs[0].getType()))
3755 CmdArgs.push_back("-D__private_extern__=extern");
3756}
3757
3758void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
3759 const InputInfoList &Inputs,
3760 const ArgStringList &OutputArgs) const {
3761 // Derived from cpp_options
3762 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003763
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003764 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3765
3766 AddCC1Args(Args, CmdArgs);
3767
3768 // NOTE: The code below has some commonality with cpp_options, but
3769 // in classic gcc style ends up sending things in different
3770 // orders. This may be a good merge candidate once we drop pedantic
3771 // compatibility.
3772
3773 Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003774 Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003775 options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003776 if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3777 // Honor -std-default.
3778 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3779 "-std=", /*Joined=*/true);
3780 }
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003781 Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
3782 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003783
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003784 // The driver treats -fsyntax-only specially.
3785 Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
3786
Daniel Dunbarf28c2ff2011-04-07 20:41:03 +00003787 // Claim Clang only -f options, they aren't worth warning about.
3788 Args.ClaimAllArgs(options::OPT_f_clang_Group);
3789
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003790 if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
3791 !Args.hasArg(options::OPT_fno_working_directory))
3792 CmdArgs.push_back("-fworking-directory");
3793
3794 Args.AddAllArgs(CmdArgs, options::OPT_O);
3795 Args.AddAllArgs(CmdArgs, options::OPT_undef);
3796 if (Args.hasArg(options::OPT_save_temps))
3797 CmdArgs.push_back("-fpch-preprocess");
3798}
3799
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003800void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003801 ArgStringList &CmdArgs,
Mike Stump11289f42009-09-09 15:08:12 +00003802 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003803 const Driver &D = getToolChain().getDriver();
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003804
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003805 CheckPreprocessingOptions(D, Args);
3806
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003807 // Derived from cpp_unique_options.
Daniel Dunbar64198ef2009-09-10 01:21:05 +00003808 // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
3809 Args.AddLastArg(CmdArgs, options::OPT_C);
3810 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003811 if (!Args.hasArg(options::OPT_Q))
3812 CmdArgs.push_back("-quiet");
3813 Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
Douglas Gregor64b046f2010-03-24 20:13:48 +00003814 Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003815 Args.AddLastArg(CmdArgs, options::OPT_v);
3816 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
3817 Args.AddLastArg(CmdArgs, options::OPT_P);
3818
3819 // FIXME: Handle %I properly.
3820 if (getToolChain().getArchName() == "x86_64") {
3821 CmdArgs.push_back("-imultilib");
3822 CmdArgs.push_back("x86_64");
3823 }
3824
3825 if (Args.hasArg(options::OPT_MD)) {
3826 CmdArgs.push_back("-MD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003827 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003828 }
3829
3830 if (Args.hasArg(options::OPT_MMD)) {
3831 CmdArgs.push_back("-MMD");
Daniel Dunbar52e96cc2009-03-30 00:34:04 +00003832 CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003833 }
3834
3835 Args.AddLastArg(CmdArgs, options::OPT_M);
3836 Args.AddLastArg(CmdArgs, options::OPT_MM);
3837 Args.AddAllArgs(CmdArgs, options::OPT_MF);
3838 Args.AddLastArg(CmdArgs, options::OPT_MG);
3839 Args.AddLastArg(CmdArgs, options::OPT_MP);
3840 Args.AddAllArgs(CmdArgs, options::OPT_MQ);
3841 Args.AddAllArgs(CmdArgs, options::OPT_MT);
3842 if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
3843 (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
3844 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
3845 CmdArgs.push_back("-MQ");
3846 CmdArgs.push_back(OutputOpt->getValue(Args));
3847 }
3848 }
3849
3850 Args.AddLastArg(CmdArgs, options::OPT_remap);
3851 if (Args.hasArg(options::OPT_g3))
3852 CmdArgs.push_back("-dD");
3853 Args.AddLastArg(CmdArgs, options::OPT_H);
3854
3855 AddCPPArgs(Args, CmdArgs);
3856
3857 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
3858 Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
3859
3860 for (InputInfoList::const_iterator
3861 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3862 const InputInfo &II = *it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003863
Daniel Dunbarb440f562010-08-02 02:38:21 +00003864 CmdArgs.push_back(II.getFilename());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003865 }
3866
3867 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
3868 options::OPT_Xpreprocessor);
3869
3870 if (Args.hasArg(options::OPT_fmudflap)) {
3871 CmdArgs.push_back("-D_MUDFLAP");
3872 CmdArgs.push_back("-include");
3873 CmdArgs.push_back("mf-runtime.h");
3874 }
3875
3876 if (Args.hasArg(options::OPT_fmudflapth)) {
3877 CmdArgs.push_back("-D_MUDFLAP");
3878 CmdArgs.push_back("-D_MUDFLAPTH");
3879 CmdArgs.push_back("-include");
3880 CmdArgs.push_back("mf-runtime.h");
3881 }
3882}
3883
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003884void darwin::CC1::AddCPPArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003885 ArgStringList &CmdArgs) const {
3886 // Derived from cpp spec.
3887
3888 if (Args.hasArg(options::OPT_static)) {
3889 // The gcc spec is broken here, it refers to dynamic but
3890 // that has been translated. Start by being bug compatible.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003891
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003892 // if (!Args.hasArg(arglist.parser.dynamicOption))
3893 CmdArgs.push_back("-D__STATIC__");
3894 } else
3895 CmdArgs.push_back("-D__DYNAMIC__");
3896
3897 if (Args.hasArg(options::OPT_pthread))
3898 CmdArgs.push_back("-D_REENTRANT");
3899}
3900
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003901void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003902 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003903 const InputInfoList &Inputs,
3904 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003905 const char *LinkingOutput) const {
3906 ArgStringList CmdArgs;
3907
3908 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3909
3910 CmdArgs.push_back("-E");
3911
3912 if (Args.hasArg(options::OPT_traditional) ||
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003913 Args.hasArg(options::OPT_traditional_cpp))
3914 CmdArgs.push_back("-traditional-cpp");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003915
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003916 ArgStringList OutputArgs;
Daniel Dunbarb440f562010-08-02 02:38:21 +00003917 assert(Output.isFilename() && "Unexpected CC1 output.");
3918 OutputArgs.push_back("-o");
3919 OutputArgs.push_back(Output.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003920
Joerg Sonnenbergerb86f5f42011-03-06 23:31:01 +00003921 if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
Daniel Dunbarf64f5302009-03-29 22:27:40 +00003922 AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3923 } else {
3924 AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3925 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3926 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003927
Daniel Dunbar6a8803a2009-04-03 01:27:06 +00003928 Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
3929
Chad Rosierc31e48d2011-09-08 00:38:00 +00003930 RemoveCC1UnsupportedArgs(CmdArgs);
3931
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003932 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003933 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00003934 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003935 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003936}
3937
3938void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00003939 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003940 const InputInfoList &Inputs,
3941 const ArgList &Args,
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003942 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003943 const Driver &D = getToolChain().getDriver();
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003944 ArgStringList CmdArgs;
3945
3946 assert(Inputs.size() == 1 && "Unexpected number of inputs!");
3947
Bob Wilson0090df22012-04-01 23:03:29 +00003948 // Silence warning about unused --serialize-diagnostics
3949 Args.ClaimAllArgs(options::OPT__serialize_diags);
3950
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003951 types::ID InputType = Inputs[0].getType();
David Blaikie747ff7e2012-04-04 20:43:14 +00003952 if (const Arg *A = Args.getLastArg(options::OPT_traditional))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003953 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003954 << A->getAsString(Args) << "-E";
3955
Daniel Dunbar24e52992010-06-07 23:28:45 +00003956 if (JA.getType() == types::TY_LLVM_IR ||
3957 JA.getType() == types::TY_LTO_IR)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003958 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003959 else if (JA.getType() == types::TY_LLVM_BC ||
3960 JA.getType() == types::TY_LTO_BC)
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003961 CmdArgs.push_back("-emit-llvm-bc");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003962 else if (Output.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003963 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00003964 << getToolChain().getTripleString();
Daniel Dunbarbcd554f2010-02-11 17:33:45 +00003965 else if (JA.getType() != types::TY_PP_Asm &&
3966 JA.getType() != types::TY_PCH)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003967 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003968 << getTypeName(JA.getType());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003969
3970 ArgStringList OutputArgs;
3971 if (Output.getType() != types::TY_PCH) {
3972 OutputArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00003973 if (Output.isNothing())
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003974 OutputArgs.push_back("/dev/null");
3975 else
3976 OutputArgs.push_back(Output.getFilename());
3977 }
3978
3979 // There is no need for this level of compatibility, but it makes
3980 // diffing easier.
3981 bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
3982 Args.hasArg(options::OPT_S));
3983
3984 if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00003985 AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003986 if (OutputArgsEarly) {
3987 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
3988 } else {
3989 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
3990 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
3991 }
3992 } else {
3993 CmdArgs.push_back("-fpreprocessed");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003994
Daniel Dunbare6adeee2009-03-29 17:08:39 +00003995 for (InputInfoList::const_iterator
3996 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
3997 const InputInfo &II = *it;
3998
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003999 // Reject AST inputs.
4000 if (II.getType() == types::TY_AST) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004001 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004002 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004003 return;
4004 }
4005
Daniel Dunbarb440f562010-08-02 02:38:21 +00004006 CmdArgs.push_back(II.getFilename());
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004007 }
4008
4009 if (OutputArgsEarly) {
4010 AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
4011 } else {
4012 AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
4013 CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
4014 }
4015 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004016
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004017 if (Output.getType() == types::TY_PCH) {
4018 assert(Output.isFilename() && "Invalid PCH output.");
4019
4020 CmdArgs.push_back("-o");
4021 // NOTE: gcc uses a temp .s file for this, but there doesn't seem
4022 // to be a good reason.
Chad Rosier96d690c2011-08-01 19:58:48 +00004023 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004024 D.GetTemporaryPath("cc", "s"));
Chad Rosier96d690c2011-08-01 19:58:48 +00004025 C.addTempFile(TmpPath);
4026 CmdArgs.push_back(TmpPath);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004027
Eric Christopher84fbdb42011-08-19 00:30:14 +00004028 // If we're emitting a pch file with the last 4 characters of ".pth"
4029 // and falling back to llvm-gcc we want to use ".gch" instead.
4030 std::string OutputFile(Output.getFilename());
4031 size_t loc = OutputFile.rfind(".pth");
4032 if (loc != std::string::npos)
4033 OutputFile.replace(loc, 4, ".gch");
4034 const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
4035 CmdArgs.push_back(Tmp);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004036 }
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004037
Chad Rosierbc5ea3d2011-08-17 18:24:55 +00004038 RemoveCC1UnsupportedArgs(CmdArgs);
4039
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004040 const char *CC1Name = getCC1Name(Inputs[0].getType());
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004041 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004042 Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004043 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbare6adeee2009-03-29 17:08:39 +00004044}
4045
Daniel Dunbarbe220842009-03-20 16:06:39 +00004046void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004047 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004048 const InputInfoList &Inputs,
4049 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00004050 const char *LinkingOutput) const {
4051 ArgStringList CmdArgs;
4052
4053 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4054 const InputInfo &Input = Inputs[0];
4055
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004056 // Determine the original source input.
4057 const Action *SourceAction = &JA;
4058 while (SourceAction->getKind() != Action::InputClass) {
4059 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4060 SourceAction = SourceAction->getInputs()[0];
4061 }
4062
4063 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00004064 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00004065 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004066 if (Args.hasArg(options::OPT_gstabs))
4067 CmdArgs.push_back("--gstabs");
4068 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00004069 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00004070 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004071
Daniel Dunbarbe220842009-03-20 16:06:39 +00004072 // Derived from asm spec.
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004073 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00004074
Daniel Dunbar6d484762010-07-22 01:47:22 +00004075 // Use -force_cpusubtype_ALL on x86 by default.
4076 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 ||
4077 getToolChain().getTriple().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00004078 Args.hasArg(options::OPT_force__cpusubtype__ALL))
4079 CmdArgs.push_back("-force_cpusubtype_ALL");
4080
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004081 if (getToolChain().getTriple().getArch() != llvm::Triple::x86_64 &&
4082 (Args.hasArg(options::OPT_mkernel) ||
Daniel Dunbarbe220842009-03-20 16:06:39 +00004083 Args.hasArg(options::OPT_static) ||
Daniel Dunbara6b4a3d2009-08-24 22:26:16 +00004084 Args.hasArg(options::OPT_fapple_kext)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004085 CmdArgs.push_back("-static");
4086
Daniel Dunbarbe220842009-03-20 16:06:39 +00004087 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4088 options::OPT_Xassembler);
4089
4090 assert(Output.isFilename() && "Unexpected lipo output.");
4091 CmdArgs.push_back("-o");
4092 CmdArgs.push_back(Output.getFilename());
4093
Daniel Dunbarb440f562010-08-02 02:38:21 +00004094 assert(Input.isFilename() && "Invalid input.");
4095 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00004096
4097 // asm_final spec is empty.
4098
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004099 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004100 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004101 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00004102}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004103
David Blaikie68e081d2011-12-20 02:48:34 +00004104void darwin::DarwinTool::anchor() {}
4105
Daniel Dunbare9ded432009-09-09 18:36:20 +00004106void darwin::DarwinTool::AddDarwinArch(const ArgList &Args,
4107 ArgStringList &CmdArgs) const {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004108 StringRef ArchName = getDarwinToolChain().getDarwinArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004109
Daniel Dunbarc1964212009-03-26 16:23:12 +00004110 // Derived from darwin_arch spec.
4111 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004112 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004113
Daniel Dunbardcc3b652010-01-22 02:04:58 +00004114 // FIXME: Is this needed anymore?
4115 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00004116 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004117}
4118
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004119void darwin::Link::AddLinkArgs(Compilation &C,
4120 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004121 ArgStringList &CmdArgs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004122 const Driver &D = getToolChain().getDriver();
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004123 const toolchains::Darwin &DarwinTC = getDarwinToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00004124
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004125 unsigned Version[3] = { 0, 0, 0 };
4126 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4127 bool HadExtra;
4128 if (!Driver::GetReleaseVersion(A->getValue(Args), Version[0],
4129 Version[1], Version[2], HadExtra) ||
4130 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004131 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004132 << A->getAsString(Args);
4133 }
4134
4135 // Newer linkers support -demangle, pass it if supported and not disabled by
4136 // the user.
Daniel Dunbarecb41cb2012-01-04 21:45:27 +00004137 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) {
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004138 // Don't pass -demangle to ld_classic.
4139 //
4140 // FIXME: This is a temporary workaround, ld should be handling this.
4141 bool UsesLdClassic = (getToolChain().getArch() == llvm::Triple::x86 &&
4142 Args.hasArg(options::OPT_static));
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004143 if (getToolChain().getArch() == llvm::Triple::x86) {
4144 for (arg_iterator it = Args.filtered_begin(options::OPT_Xlinker,
4145 options::OPT_Wl_COMMA),
4146 ie = Args.filtered_end(); it != ie; ++it) {
4147 const Arg *A = *it;
4148 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004149 if (StringRef(A->getValue(Args, i)) == "-kext")
Daniel Dunbar3d7e0e22010-09-07 17:50:41 +00004150 UsesLdClassic = true;
4151 }
4152 }
Daniel Dunbar1eaf5c62010-09-07 17:07:49 +00004153 if (!UsesLdClassic)
4154 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00004155 }
4156
Daniel Dunbaref889c72011-06-21 20:55:11 +00004157 // If we are using LTO, then automatically create a temporary file path for
4158 // the linker to use, so that it's lifetime will extend past a possible
4159 // dsymutil step.
Daniel Dunbar3d125d32011-06-21 21:18:32 +00004160 if (Version[0] >= 116 && D.IsUsingLTO(Args)) {
Daniel Dunbaref889c72011-06-21 20:55:11 +00004161 const char *TmpPath = C.getArgs().MakeArgString(
Chad Rosier39ab7432011-08-26 21:28:44 +00004162 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
Daniel Dunbaref889c72011-06-21 20:55:11 +00004163 C.addTempFile(TmpPath);
4164 CmdArgs.push_back("-object_path_lto");
4165 CmdArgs.push_back(TmpPath);
4166 }
4167
Daniel Dunbarc1964212009-03-26 16:23:12 +00004168 // Derived from the "link" spec.
4169 Args.AddAllArgs(CmdArgs, options::OPT_static);
4170 if (!Args.hasArg(options::OPT_static))
4171 CmdArgs.push_back("-dynamic");
4172 if (Args.hasArg(options::OPT_fgnu_runtime)) {
4173 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
4174 // here. How do we wish to handle such things?
4175 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004176
Daniel Dunbarc1964212009-03-26 16:23:12 +00004177 if (!Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbara48823f2010-01-22 02:04:52 +00004178 AddDarwinArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00004179 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00004180 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004181
4182 Args.AddLastArg(CmdArgs, options::OPT_bundle);
4183 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
4184 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
4185
4186 Arg *A;
4187 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
4188 (A = Args.getLastArg(options::OPT_current__version)) ||
4189 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004190 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004191 << A->getAsString(Args) << "-dynamiclib";
4192
4193 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
4194 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
4195 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
4196 } else {
4197 CmdArgs.push_back("-dylib");
4198
4199 Arg *A;
4200 if ((A = Args.getLastArg(options::OPT_bundle)) ||
4201 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
4202 (A = Args.getLastArg(options::OPT_client__name)) ||
4203 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
4204 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
4205 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004206 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00004207 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004208
Daniel Dunbarc1964212009-03-26 16:23:12 +00004209 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
4210 "-dylib_compatibility_version");
4211 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
4212 "-dylib_current_version");
4213
Daniel Dunbara48823f2010-01-22 02:04:52 +00004214 AddDarwinArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004215
4216 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
4217 "-dylib_install_name");
4218 }
4219
4220 Args.AddLastArg(CmdArgs, options::OPT_all__load);
4221 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
4222 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004223 if (DarwinTC.isTargetIPhoneOS())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004224 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004225 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
4226 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
4227 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
4228 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
4229 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
4230 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00004231 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004232 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
4233 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
4234 Args.AddAllArgs(CmdArgs, options::OPT_init);
4235
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004236 // Add the deployment target.
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004237 VersionTuple TargetVersion = DarwinTC.getTargetVersion();
Daniel Dunbar72ceb922011-04-30 04:22:58 +00004238
4239 // If we had an explicit -mios-simulator-version-min argument, honor that,
4240 // otherwise use the traditional deployment targets. We can't just check the
4241 // is-sim attribute because existing code follows this path, and the linker
4242 // may not handle the argument.
4243 //
4244 // FIXME: We may be able to remove this, once we can verify no one depends on
4245 // it.
4246 if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
4247 CmdArgs.push_back("-ios_simulator_version_min");
4248 else if (DarwinTC.isTargetIPhoneOS())
4249 CmdArgs.push_back("-iphoneos_version_min");
4250 else
4251 CmdArgs.push_back("-macosx_version_min");
Benjamin Kramerddefa6d2012-03-10 20:55:36 +00004252 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
Daniel Dunbarc44d3132011-04-28 21:23:41 +00004253
Daniel Dunbarc1964212009-03-26 16:23:12 +00004254 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
4255 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
4256 Args.AddLastArg(CmdArgs, options::OPT_single__module);
4257 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
4258 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004259
Daniel Dunbaraf68a882010-07-13 23:31:40 +00004260 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
4261 options::OPT_fno_pie,
4262 options::OPT_fno_PIE)) {
4263 if (A->getOption().matches(options::OPT_fpie) ||
4264 A->getOption().matches(options::OPT_fPIE))
4265 CmdArgs.push_back("-pie");
4266 else
4267 CmdArgs.push_back("-no_pie");
4268 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004269
4270 Args.AddLastArg(CmdArgs, options::OPT_prebind);
4271 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
4272 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
4273 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
4274 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
4275 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
4276 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
4277 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
4278 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
4279 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
4280 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
4281 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
4282 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
4283 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
4284 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
4285 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004286
Daniel Dunbar84384642011-05-02 21:03:47 +00004287 // Give --sysroot= preference, over the Apple specific behavior to also use
4288 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00004289 StringRef sysroot = C.getSysRoot();
4290 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00004291 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00004292 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00004293 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4294 CmdArgs.push_back("-syslibroot");
4295 CmdArgs.push_back(A->getValue(Args));
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004296 }
4297
Daniel Dunbarc1964212009-03-26 16:23:12 +00004298 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
4299 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
4300 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
4301 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
4302 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00004303 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004304 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
4305 Args.AddAllArgs(CmdArgs, options::OPT_y);
4306 Args.AddLastArg(CmdArgs, options::OPT_w);
4307 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
4308 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
4309 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
4310 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
4311 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
4312 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
4313 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
4314 Args.AddLastArg(CmdArgs, options::OPT_whyload);
4315 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
4316 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
4317 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
4318 Args.AddLastArg(CmdArgs, options::OPT_Mach);
4319}
4320
4321void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004322 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004323 const InputInfoList &Inputs,
4324 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00004325 const char *LinkingOutput) const {
4326 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00004327
Daniel Dunbarc1964212009-03-26 16:23:12 +00004328 // The logic here is derived from gcc's behavior; most of which
4329 // comes from specs (starting with link_command). Consult gcc for
4330 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00004331 ArgStringList CmdArgs;
4332
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00004333 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
4334 if (Args.hasArg(options::OPT_ccc_arcmt_check,
4335 options::OPT_ccc_arcmt_migrate)) {
4336 for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I)
4337 (*I)->claim();
4338 const char *Exec =
4339 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
4340 CmdArgs.push_back(Output.getFilename());
4341 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4342 return;
4343 }
4344
Daniel Dunbarc1964212009-03-26 16:23:12 +00004345 // I'm not sure why this particular decomposition exists in gcc, but
4346 // we follow suite for ease of comparison.
Daniel Dunbarccbc4522010-09-09 21:51:05 +00004347 AddLinkArgs(C, Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004348
Daniel Dunbarc1964212009-03-26 16:23:12 +00004349 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
4350 Args.AddAllArgs(CmdArgs, options::OPT_s);
4351 Args.AddAllArgs(CmdArgs, options::OPT_t);
4352 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
4353 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004354 Args.AddLastArg(CmdArgs, options::OPT_e);
4355 Args.AddAllArgs(CmdArgs, options::OPT_m_Separate);
4356 Args.AddAllArgs(CmdArgs, options::OPT_r);
4357
Daniel Dunbar767bbab2010-10-18 22:08:36 +00004358 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
4359 // members of static archive libraries which implement Objective-C classes or
4360 // categories.
4361 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
4362 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004363
Daniel Dunbarc1964212009-03-26 16:23:12 +00004364 CmdArgs.push_back("-o");
4365 CmdArgs.push_back(Output.getFilename());
4366
Chad Rosier06fd3c62012-05-16 23:45:12 +00004367 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004368 !Args.hasArg(options::OPT_nostartfiles)) {
4369 // Derived from startfile spec.
4370 if (Args.hasArg(options::OPT_dynamiclib)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004371 // Derived from darwin_dylib1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004372 if (getDarwinToolChain().isTargetIOSSimulator()) {
4373 // The simulator doesn't have a versioned crt1 file.
4374 CmdArgs.push_back("-ldylib1.o");
4375 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004376 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4377 CmdArgs.push_back("-ldylib1.o");
4378 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004379 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
Daniel Dunbar83608032010-01-27 00:56:56 +00004380 CmdArgs.push_back("-ldylib1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004381 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004382 CmdArgs.push_back("-ldylib1.10.5.o");
4383 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004384 } else {
4385 if (Args.hasArg(options::OPT_bundle)) {
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004386 if (!Args.hasArg(options::OPT_static)) {
4387 // Derived from darwin_bundle1 spec.
Daniel Dunbar16d97092011-04-01 21:02:42 +00004388 if (getDarwinToolChain().isTargetIOSSimulator()) {
4389 // The simulator doesn't have a versioned crt1 file.
4390 CmdArgs.push_back("-lbundle1.o");
4391 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004392 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4393 CmdArgs.push_back("-lbundle1.o");
4394 } else {
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004395 if (getDarwinToolChain().isMacosxVersionLT(10, 6))
Daniel Dunbar83608032010-01-27 00:56:56 +00004396 CmdArgs.push_back("-lbundle1.o");
4397 }
Daniel Dunbarae8bca02009-04-01 03:17:40 +00004398 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004399 } else {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004400 if (Args.hasArg(options::OPT_pg) &&
4401 getToolChain().SupportsProfiling()) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00004402 if (Args.hasArg(options::OPT_static) ||
4403 Args.hasArg(options::OPT_object) ||
4404 Args.hasArg(options::OPT_preload)) {
4405 CmdArgs.push_back("-lgcrt0.o");
4406 } else {
4407 CmdArgs.push_back("-lgcrt1.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004408
Daniel Dunbarc1964212009-03-26 16:23:12 +00004409 // darwin_crt2 spec is empty.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004410 }
Bob Wilsonef285b42012-07-04 00:18:41 +00004411 // By default on OS X 10.8 and later, we don't link with a crt1.o
4412 // file and the linker knows to use _main as the entry point. But,
4413 // when compiling with -pg, we need to link with the gcrt1.o file,
4414 // so pass the -no_new_main option to tell the linker to use the
4415 // "start" symbol as the entry point.
Bob Wilson1e148fe2012-07-03 20:42:10 +00004416 if (getDarwinToolChain().isTargetMacOS() &&
4417 !getDarwinToolChain().isMacosxVersionLT(10, 8))
4418 CmdArgs.push_back("-no_new_main");
Daniel Dunbarc1964212009-03-26 16:23:12 +00004419 } else {
4420 if (Args.hasArg(options::OPT_static) ||
4421 Args.hasArg(options::OPT_object) ||
4422 Args.hasArg(options::OPT_preload)) {
4423 CmdArgs.push_back("-lcrt0.o");
4424 } else {
4425 // Derived from darwin_crt1 spec.
Daniel Dunbarebc34df2011-03-31 17:12:33 +00004426 if (getDarwinToolChain().isTargetIOSSimulator()) {
4427 // The simulator doesn't have a versioned crt1 file.
4428 CmdArgs.push_back("-lcrt1.o");
4429 } else if (getDarwinToolChain().isTargetIPhoneOS()) {
Daniel Dunbar83608032010-01-27 00:56:56 +00004430 if (getDarwinToolChain().isIPhoneOSVersionLT(3, 1))
4431 CmdArgs.push_back("-lcrt1.o");
4432 else
4433 CmdArgs.push_back("-lcrt1.3.1.o");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004434 } else {
4435 if (getDarwinToolChain().isMacosxVersionLT(10, 5))
4436 CmdArgs.push_back("-lcrt1.o");
4437 else if (getDarwinToolChain().isMacosxVersionLT(10, 6))
4438 CmdArgs.push_back("-lcrt1.10.5.o");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004439 else if (getDarwinToolChain().isMacosxVersionLT(10, 8))
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004440 CmdArgs.push_back("-lcrt1.10.6.o");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004441
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004442 // darwin_crt2 spec is empty.
4443 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00004444 }
4445 }
4446 }
4447 }
4448
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +00004449 if (!getDarwinToolChain().isTargetIPhoneOS() &&
4450 Args.hasArg(options::OPT_shared_libgcc) &&
4451 getDarwinToolChain().isMacosxVersionLT(10, 5)) {
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004452 const char *Str =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004453 Args.MakeArgString(getToolChain().GetFilePath("crt3.o"));
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004454 CmdArgs.push_back(Str);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004455 }
4456 }
4457
4458 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004459
Kostya Serebryany0b692ce2011-12-06 19:18:44 +00004460 // If we're building a dynamic lib with -faddress-sanitizer, unresolved
4461 // symbols may appear. Mark all of them as dynamic_lookup.
4462 // Linking executables is handled in lib/Driver/ToolChains.cpp.
4463 if (Args.hasFlag(options::OPT_faddress_sanitizer,
4464 options::OPT_fno_address_sanitizer, false)) {
4465 if (Args.hasArg(options::OPT_dynamiclib) ||
4466 Args.hasArg(options::OPT_bundle)) {
4467 CmdArgs.push_back("-undefined");
4468 CmdArgs.push_back("dynamic_lookup");
4469 }
4470 }
4471
Daniel Dunbarc1964212009-03-26 16:23:12 +00004472 if (Args.hasArg(options::OPT_fopenmp))
4473 // This is more complicated in gcc...
4474 CmdArgs.push_back("-lgomp");
4475
Douglas Gregor9295df02012-05-15 21:00:27 +00004476 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4477
Bob Wilson16d93952012-05-15 18:57:39 +00004478 if (isObjCRuntimeLinked(Args) &&
4479 !Args.hasArg(options::OPT_nostdlib) &&
4480 !Args.hasArg(options::OPT_nodefaultlibs)) {
Ted Kremeneke65b0862012-03-06 20:05:56 +00004481 // Avoid linking compatibility stubs on i386 mac.
4482 if (!getDarwinToolChain().isTargetMacOS() ||
4483 getDarwinToolChain().getArchName() != "i386") {
4484 // If we don't have ARC or subscripting runtime support, link in the
4485 // runtime stubs. We have to do this *before* adding any of the normal
4486 // linker inputs so that its initializer gets run first.
John McCall5fb5df92012-06-20 06:18:46 +00004487 ObjCRuntime runtime =
4488 getDarwinToolChain().getDefaultObjCRuntime(/*nonfragile*/ true);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004489 // We use arclite library for both ARC and subscripting support.
John McCall3deb1ad2012-08-21 02:47:43 +00004490 if ((!runtime.hasNativeARC() && isObjCAutoRefCount(Args)) ||
John McCall5fb5df92012-06-20 06:18:46 +00004491 !runtime.hasSubscripting())
Ted Kremeneke65b0862012-03-06 20:05:56 +00004492 getDarwinToolChain().AddLinkARCArgs(Args, CmdArgs);
Ted Kremeneke65b0862012-03-06 20:05:56 +00004493 }
Bob Wilson7dda0cd2012-04-21 00:21:42 +00004494 CmdArgs.push_back("-framework");
4495 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00004496 // Link libobj.
4497 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00004498 }
John McCall31168b02011-06-15 23:02:42 +00004499
Daniel Dunbarc1964212009-03-26 16:23:12 +00004500 if (LinkingOutput) {
4501 CmdArgs.push_back("-arch_multiple");
4502 CmdArgs.push_back("-final_output");
4503 CmdArgs.push_back(LinkingOutput);
4504 }
4505
Daniel Dunbarc1964212009-03-26 16:23:12 +00004506 if (Args.hasArg(options::OPT_fnested_functions))
4507 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004508
Daniel Dunbarc1964212009-03-26 16:23:12 +00004509 if (!Args.hasArg(options::OPT_nostdlib) &&
4510 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004511 if (getToolChain().getDriver().CCCIsCXX)
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004512 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00004513
Daniel Dunbarc1964212009-03-26 16:23:12 +00004514 // link_ssp spec is empty.
4515
Daniel Dunbar26d482a2009-09-18 08:15:03 +00004516 // Let the tool chain choose which runtime library to link.
4517 getDarwinToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00004518 }
4519
Chad Rosier06fd3c62012-05-16 23:45:12 +00004520 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00004521 !Args.hasArg(options::OPT_nostartfiles)) {
4522 // endfile_spec is empty.
4523 }
4524
4525 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4526 Args.AddAllArgs(CmdArgs, options::OPT_F);
4527
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004528 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004529 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004530 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00004531}
4532
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004533void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004534 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004535 const InputInfoList &Inputs,
4536 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004537 const char *LinkingOutput) const {
4538 ArgStringList CmdArgs;
4539
4540 CmdArgs.push_back("-create");
4541 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004542
4543 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004544 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00004545
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004546 for (InputInfoList::const_iterator
4547 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4548 const InputInfo &II = *it;
4549 assert(II.isFilename() && "Unexpected lipo input.");
4550 CmdArgs.push_back(II.getFilename());
4551 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004552 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004553 Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004554 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00004555}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00004556
Daniel Dunbar88299622010-06-04 18:28:36 +00004557void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004558 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00004559 const InputInfoList &Inputs,
4560 const ArgList &Args,
4561 const char *LinkingOutput) const {
4562 ArgStringList CmdArgs;
4563
Daniel Dunbareb86b042011-05-09 17:23:16 +00004564 CmdArgs.push_back("-o");
4565 CmdArgs.push_back(Output.getFilename());
4566
Daniel Dunbar88299622010-06-04 18:28:36 +00004567 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4568 const InputInfo &Input = Inputs[0];
4569 assert(Input.isFilename() && "Unexpected dsymutil input.");
4570 CmdArgs.push_back(Input.getFilename());
4571
Daniel Dunbar88299622010-06-04 18:28:36 +00004572 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004573 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004574 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00004575}
4576
Eric Christopher551ef452011-08-23 17:56:55 +00004577void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
4578 const InputInfo &Output,
4579 const InputInfoList &Inputs,
4580 const ArgList &Args,
4581 const char *LinkingOutput) const {
4582 ArgStringList CmdArgs;
4583 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00004584 CmdArgs.push_back("--debug-info");
4585 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00004586 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00004587
4588 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
4589 const InputInfo &Input = Inputs[0];
4590 assert(Input.isFilename() && "Unexpected verify input");
4591
4592 // Grabbing the output of the earlier dsymutil run.
4593 CmdArgs.push_back(Input.getFilename());
4594
4595 const char *Exec =
4596 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
4597 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4598}
4599
David Chisnallf571cde2012-02-15 13:39:01 +00004600void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4601 const InputInfo &Output,
4602 const InputInfoList &Inputs,
4603 const ArgList &Args,
4604 const char *LinkingOutput) const {
4605 ArgStringList CmdArgs;
4606
4607 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4608 options::OPT_Xassembler);
4609
4610 CmdArgs.push_back("-o");
4611 CmdArgs.push_back(Output.getFilename());
4612
4613 for (InputInfoList::const_iterator
4614 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4615 const InputInfo &II = *it;
4616 CmdArgs.push_back(II.getFilename());
4617 }
4618
4619 const char *Exec =
4620 Args.MakeArgString(getToolChain().GetProgramPath("as"));
4621 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4622}
4623
4624
4625void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
4626 const InputInfo &Output,
4627 const InputInfoList &Inputs,
4628 const ArgList &Args,
4629 const char *LinkingOutput) const {
4630 // FIXME: Find a real GCC, don't hard-code versions here
4631 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
4632 const llvm::Triple &T = getToolChain().getTriple();
4633 std::string LibPath = "/usr/lib/";
4634 llvm::Triple::ArchType Arch = T.getArch();
4635 switch (Arch) {
4636 case llvm::Triple::x86:
4637 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4638 T.getOSName()).str() + "/4.5.2/";
4639 break;
4640 case llvm::Triple::x86_64:
4641 GCCLibPath += ("i386-" + T.getVendorName() + "-" +
4642 T.getOSName()).str();
4643 GCCLibPath += "/4.5.2/amd64/";
4644 LibPath += "amd64/";
4645 break;
4646 default:
4647 assert(0 && "Unsupported architecture");
4648 }
4649
4650 ArgStringList CmdArgs;
4651
David Chisnall272a0712012-02-29 15:06:12 +00004652 // Demangle C++ names in errors
4653 CmdArgs.push_back("-C");
4654
David Chisnallf571cde2012-02-15 13:39:01 +00004655 if ((!Args.hasArg(options::OPT_nostdlib)) &&
4656 (!Args.hasArg(options::OPT_shared))) {
4657 CmdArgs.push_back("-e");
4658 CmdArgs.push_back("_start");
4659 }
4660
4661 if (Args.hasArg(options::OPT_static)) {
4662 CmdArgs.push_back("-Bstatic");
4663 CmdArgs.push_back("-dn");
4664 } else {
4665 CmdArgs.push_back("-Bdynamic");
4666 if (Args.hasArg(options::OPT_shared)) {
4667 CmdArgs.push_back("-shared");
4668 } else {
4669 CmdArgs.push_back("--dynamic-linker");
4670 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
4671 }
4672 }
4673
4674 if (Output.isFilename()) {
4675 CmdArgs.push_back("-o");
4676 CmdArgs.push_back(Output.getFilename());
4677 } else {
4678 assert(Output.isNothing() && "Invalid output.");
4679 }
4680
4681 if (!Args.hasArg(options::OPT_nostdlib) &&
4682 !Args.hasArg(options::OPT_nostartfiles)) {
4683 if (!Args.hasArg(options::OPT_shared)) {
4684 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
4685 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004686 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004687 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
4688 } else {
4689 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00004690 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
4691 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004692 }
David Chisnallddc4c9d2012-03-13 14:14:54 +00004693 if (getToolChain().getDriver().CCCIsCXX)
4694 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004695 }
4696
4697 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
4698
4699 Args.AddAllArgs(CmdArgs, options::OPT_L);
4700 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4701 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00004702 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00004703
4704 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
4705
4706 if (!Args.hasArg(options::OPT_nostdlib) &&
4707 !Args.hasArg(options::OPT_nodefaultlibs)) {
David Chisnall3d127c72012-04-10 11:49:50 +00004708 if (getToolChain().getDriver().CCCIsCXX)
4709 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00004710 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004711 if (!Args.hasArg(options::OPT_shared)) {
4712 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00004713 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00004714 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00004715 }
David Chisnallf571cde2012-02-15 13:39:01 +00004716 }
4717
4718 if (!Args.hasArg(options::OPT_nostdlib) &&
4719 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00004720 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004721 }
David Chisnall96de9932012-02-16 16:00:47 +00004722 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00004723
4724 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
4725
4726 const char *Exec =
4727 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
4728 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4729}
4730
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004731void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004732 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004733 const InputInfoList &Inputs,
4734 const ArgList &Args,
4735 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004736 ArgStringList CmdArgs;
4737
4738 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4739 options::OPT_Xassembler);
4740
4741 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004742 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004743
4744 for (InputInfoList::const_iterator
4745 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4746 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004747 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004748 }
4749
4750 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004751 Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004752 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004753}
4754
4755void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004756 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004757 const InputInfoList &Inputs,
4758 const ArgList &Args,
4759 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004760 ArgStringList CmdArgs;
4761
4762 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004763 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004764 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004765 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004766 }
4767
4768 if (Args.hasArg(options::OPT_static)) {
4769 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004770 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004771 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00004772// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004773 CmdArgs.push_back("-Bdynamic");
4774 if (Args.hasArg(options::OPT_shared)) {
4775 CmdArgs.push_back("-shared");
4776 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00004777 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004778 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
4779 }
4780 }
4781
Daniel Dunbarb440f562010-08-02 02:38:21 +00004782 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004783 CmdArgs.push_back("-o");
4784 CmdArgs.push_back(Output.getFilename());
4785 } else {
4786 assert(Output.isNothing() && "Invalid output.");
4787 }
4788
4789 if (!Args.hasArg(options::OPT_nostdlib) &&
4790 !Args.hasArg(options::OPT_nostartfiles)) {
4791 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004792 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004793 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004794 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004795 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004796 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004797 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004798 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004799 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004800 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004801 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00004802 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004803 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004804 }
4805
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004806 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
4807 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004808 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004809
4810 Args.AddAllArgs(CmdArgs, options::OPT_L);
4811 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4812 Args.AddAllArgs(CmdArgs, options::OPT_e);
4813
Daniel Dunbar54423b22010-09-17 00:24:54 +00004814 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004815
4816 if (!Args.hasArg(options::OPT_nostdlib) &&
4817 !Args.hasArg(options::OPT_nodefaultlibs)) {
4818 // FIXME: For some reason GCC passes -lgcc before adding
4819 // the default system libraries. Just mimic this for now.
4820 CmdArgs.push_back("-lgcc");
4821
4822 if (Args.hasArg(options::OPT_pthread))
4823 CmdArgs.push_back("-pthread");
4824 if (!Args.hasArg(options::OPT_shared))
4825 CmdArgs.push_back("-lc");
4826 CmdArgs.push_back("-lgcc");
4827 }
4828
4829 if (!Args.hasArg(options::OPT_nostdlib) &&
4830 !Args.hasArg(options::OPT_nostartfiles)) {
4831 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004832 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004833 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004834 }
4835
Bill Wendling08760582011-06-27 19:15:03 +00004836 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00004837
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004838 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004839 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004840 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00004841}
4842
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004843void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004844 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004845 const InputInfoList &Inputs,
4846 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00004847 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004848 ArgStringList CmdArgs;
4849
4850 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4851 options::OPT_Xassembler);
4852
4853 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00004854 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004855
4856 for (InputInfoList::const_iterator
4857 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4858 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00004859 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004860 }
4861
4862 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004863 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004864 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004865}
4866
4867void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004868 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004869 const InputInfoList &Inputs,
4870 const ArgList &Args,
4871 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004872 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004873 ArgStringList CmdArgs;
4874
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004875 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004876 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004877 CmdArgs.push_back("-e");
4878 CmdArgs.push_back("__start");
4879 }
4880
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004881 if (Args.hasArg(options::OPT_static)) {
4882 CmdArgs.push_back("-Bstatic");
4883 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00004884 if (Args.hasArg(options::OPT_rdynamic))
4885 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004886 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004887 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004888 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004889 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004890 } else {
4891 CmdArgs.push_back("-dynamic-linker");
4892 CmdArgs.push_back("/usr/libexec/ld.so");
4893 }
4894 }
4895
Daniel Dunbarb440f562010-08-02 02:38:21 +00004896 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004897 CmdArgs.push_back("-o");
4898 CmdArgs.push_back(Output.getFilename());
4899 } else {
4900 assert(Output.isNothing() && "Invalid output.");
4901 }
4902
4903 if (!Args.hasArg(options::OPT_nostdlib) &&
4904 !Args.hasArg(options::OPT_nostartfiles)) {
4905 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00004906 if (Args.hasArg(options::OPT_pg))
4907 CmdArgs.push_back(Args.MakeArgString(
4908 getToolChain().GetFilePath("gcrt0.o")));
4909 else
4910 CmdArgs.push_back(Args.MakeArgString(
4911 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00004912 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004913 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004914 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00004915 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004916 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004917 }
4918 }
4919
Edward O'Callaghan5c521462009-10-28 15:13:08 +00004920 std::string Triple = getToolChain().getTripleString();
4921 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004922 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00004923 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004924 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004925
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004926 Args.AddAllArgs(CmdArgs, options::OPT_L);
4927 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4928 Args.AddAllArgs(CmdArgs, options::OPT_e);
4929
Daniel Dunbar54423b22010-09-17 00:24:54 +00004930 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004931
4932 if (!Args.hasArg(options::OPT_nostdlib) &&
4933 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004934 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00004935 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00004936 if (Args.hasArg(options::OPT_pg))
4937 CmdArgs.push_back("-lm_p");
4938 else
4939 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00004940 }
4941
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004942 // FIXME: For some reason GCC passes -lgcc before adding
4943 // the default system libraries. Just mimic this for now.
4944 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004945
Eric Christopher17674ec2012-09-13 06:32:34 +00004946 if (Args.hasArg(options::OPT_pthread)) {
4947 if (!Args.hasArg(options::OPT_shared) &&
4948 Args.hasArg(options::OPT_pg))
4949 CmdArgs.push_back("-lpthread_p");
4950 else
4951 CmdArgs.push_back("-lpthread");
4952 }
4953
Chandler Carruth45661652011-12-17 22:32:42 +00004954 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00004955 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00004956 CmdArgs.push_back("-lc_p");
4957 else
4958 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00004959 }
Eric Christopher17674ec2012-09-13 06:32:34 +00004960
Daniel Dunbara8888ac2009-08-03 01:28:59 +00004961 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004962 }
4963
4964 if (!Args.hasArg(options::OPT_nostdlib) &&
4965 !Args.hasArg(options::OPT_nostartfiles)) {
4966 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00004967 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004968 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004969 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00004970 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004971 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004972 }
4973
4974 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004975 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004976 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004977}
Ed Schoutene33194b2009-04-02 19:13:12 +00004978
Eli Friedman9fa28852012-08-08 23:57:20 +00004979void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4980 const InputInfo &Output,
4981 const InputInfoList &Inputs,
4982 const ArgList &Args,
4983 const char *LinkingOutput) const {
4984 ArgStringList CmdArgs;
4985
4986 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4987 options::OPT_Xassembler);
4988
4989 CmdArgs.push_back("-o");
4990 CmdArgs.push_back(Output.getFilename());
4991
4992 for (InputInfoList::const_iterator
4993 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
4994 const InputInfo &II = *it;
4995 CmdArgs.push_back(II.getFilename());
4996 }
4997
4998 const char *Exec =
4999 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5000 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5001}
5002
5003void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
5004 const InputInfo &Output,
5005 const InputInfoList &Inputs,
5006 const ArgList &Args,
5007 const char *LinkingOutput) const {
5008 const Driver &D = getToolChain().getDriver();
5009 ArgStringList CmdArgs;
5010
5011 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5012 (!Args.hasArg(options::OPT_shared))) {
5013 CmdArgs.push_back("-e");
5014 CmdArgs.push_back("__start");
5015 }
5016
5017 if (Args.hasArg(options::OPT_static)) {
5018 CmdArgs.push_back("-Bstatic");
5019 } else {
5020 if (Args.hasArg(options::OPT_rdynamic))
5021 CmdArgs.push_back("-export-dynamic");
5022 CmdArgs.push_back("--eh-frame-hdr");
5023 CmdArgs.push_back("-Bdynamic");
5024 if (Args.hasArg(options::OPT_shared)) {
5025 CmdArgs.push_back("-shared");
5026 } else {
5027 CmdArgs.push_back("-dynamic-linker");
5028 CmdArgs.push_back("/usr/libexec/ld.so");
5029 }
5030 }
5031
5032 if (Output.isFilename()) {
5033 CmdArgs.push_back("-o");
5034 CmdArgs.push_back(Output.getFilename());
5035 } else {
5036 assert(Output.isNothing() && "Invalid output.");
5037 }
5038
5039 if (!Args.hasArg(options::OPT_nostdlib) &&
5040 !Args.hasArg(options::OPT_nostartfiles)) {
5041 if (!Args.hasArg(options::OPT_shared)) {
5042 if (Args.hasArg(options::OPT_pg))
5043 CmdArgs.push_back(Args.MakeArgString(
5044 getToolChain().GetFilePath("gcrt0.o")));
5045 else
5046 CmdArgs.push_back(Args.MakeArgString(
5047 getToolChain().GetFilePath("crt0.o")));
5048 CmdArgs.push_back(Args.MakeArgString(
5049 getToolChain().GetFilePath("crtbegin.o")));
5050 } else {
5051 CmdArgs.push_back(Args.MakeArgString(
5052 getToolChain().GetFilePath("crtbeginS.o")));
5053 }
5054 }
5055
5056 Args.AddAllArgs(CmdArgs, options::OPT_L);
5057 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5058 Args.AddAllArgs(CmdArgs, options::OPT_e);
5059
5060 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5061
5062 if (!Args.hasArg(options::OPT_nostdlib) &&
5063 !Args.hasArg(options::OPT_nodefaultlibs)) {
5064 if (D.CCCIsCXX) {
5065 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5066 if (Args.hasArg(options::OPT_pg))
5067 CmdArgs.push_back("-lm_p");
5068 else
5069 CmdArgs.push_back("-lm");
5070 }
5071
5072 if (Args.hasArg(options::OPT_pthread))
5073 CmdArgs.push_back("-lpthread");
5074 if (!Args.hasArg(options::OPT_shared)) {
5075 if (Args.hasArg(options::OPT_pg))
5076 CmdArgs.push_back("-lc_p");
5077 else
5078 CmdArgs.push_back("-lc");
5079 }
5080
5081 std::string myarch = "-lclang_rt.";
5082 const llvm::Triple &T = getToolChain().getTriple();
5083 llvm::Triple::ArchType Arch = T.getArch();
5084 switch (Arch) {
5085 case llvm::Triple::arm:
5086 myarch += ("arm");
5087 break;
5088 case llvm::Triple::x86:
5089 myarch += ("i386");
5090 break;
5091 case llvm::Triple::x86_64:
5092 myarch += ("amd64");
5093 break;
5094 default:
5095 assert(0 && "Unsupported architecture");
5096 }
5097 CmdArgs.push_back(Args.MakeArgString(myarch));
5098 }
5099
5100 if (!Args.hasArg(options::OPT_nostdlib) &&
5101 !Args.hasArg(options::OPT_nostartfiles)) {
5102 if (!Args.hasArg(options::OPT_shared))
5103 CmdArgs.push_back(Args.MakeArgString(
5104 getToolChain().GetFilePath("crtend.o")));
5105 else
5106 CmdArgs.push_back(Args.MakeArgString(
5107 getToolChain().GetFilePath("crtendS.o")));
5108 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00005109
5110 const char *Exec =
5111 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
5112 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00005113}
5114
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005115void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005116 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005117 const InputInfoList &Inputs,
5118 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005119 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005120 ArgStringList CmdArgs;
5121
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005122 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5123 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005124 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005125 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005126 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00005127 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005128 else if (getToolChain().getArch() == llvm::Triple::mips ||
5129 getToolChain().getArch() == llvm::Triple::mipsel ||
5130 getToolChain().getArch() == llvm::Triple::mips64 ||
5131 getToolChain().getArch() == llvm::Triple::mips64el) {
5132 StringRef CPUName;
5133 StringRef ABIName;
5134 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005135
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00005136 CmdArgs.push_back("-march");
5137 CmdArgs.push_back(CPUName.data());
5138
5139 // Convert ABI name to the GNU tools acceptable variant.
5140 if (ABIName == "o32")
5141 ABIName = "32";
5142 else if (ABIName == "n64")
5143 ABIName = "64";
5144
5145 CmdArgs.push_back("-mabi");
5146 CmdArgs.push_back(ABIName.data());
5147
5148 if (getToolChain().getArch() == llvm::Triple::mips ||
5149 getToolChain().getArch() == llvm::Triple::mips64)
5150 CmdArgs.push_back("-EB");
5151 else
5152 CmdArgs.push_back("-EL");
5153
5154 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5155 options::OPT_fpic, options::OPT_fno_pic,
5156 options::OPT_fPIE, options::OPT_fno_PIE,
5157 options::OPT_fpie, options::OPT_fno_pie);
5158 if (LastPICArg &&
5159 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5160 LastPICArg->getOption().matches(options::OPT_fpic) ||
5161 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5162 LastPICArg->getOption().matches(options::OPT_fpie))) {
5163 CmdArgs.push_back("-KPIC");
5164 }
5165 }
Eric Christopher0b26a612010-03-02 02:41:08 +00005166
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005167 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5168 options::OPT_Xassembler);
5169
5170 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005171 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005172
5173 for (InputInfoList::const_iterator
5174 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5175 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005176 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005177 }
5178
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005179 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005180 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005181 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005182}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005183
5184void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005185 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005186 const InputInfoList &Inputs,
5187 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005188 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00005189 const toolchains::FreeBSD& ToolChain =
5190 static_cast<const toolchains::FreeBSD&>(getToolChain());
5191 const Driver &D = ToolChain.getDriver();
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005192 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00005193
5194 // Silence warning for "clang -g foo.o -o foo"
5195 Args.ClaimAllArgs(options::OPT_g_Group);
5196 // and "clang -emit-llvm foo.o -o foo"
5197 Args.ClaimAllArgs(options::OPT_emit_llvm);
5198 // and for "clang -w foo.o -o foo". Other warning options are already
5199 // handled somewhere else.
5200 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005201
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005202 if (!D.SysRoot.empty())
5203 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5204
Roman Divackyafe2f232012-08-28 15:09:03 +00005205 if (Args.hasArg(options::OPT_pie))
5206 CmdArgs.push_back("-pie");
5207
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005208 if (Args.hasArg(options::OPT_static)) {
5209 CmdArgs.push_back("-Bstatic");
5210 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00005211 if (Args.hasArg(options::OPT_rdynamic))
5212 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005213 CmdArgs.push_back("--eh-frame-hdr");
5214 if (Args.hasArg(options::OPT_shared)) {
5215 CmdArgs.push_back("-Bshareable");
5216 } else {
5217 CmdArgs.push_back("-dynamic-linker");
5218 CmdArgs.push_back("/libexec/ld-elf.so.1");
5219 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005220 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
5221 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00005222 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
5223 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
5224 CmdArgs.push_back("--hash-style=both");
5225 }
5226 }
5227 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005228 }
5229
5230 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
5231 // instruct ld in the base system to link 32-bit code.
Roman Divackyafe2f232012-08-28 15:09:03 +00005232 if (ToolChain.getArchName() == "i386") {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005233 CmdArgs.push_back("-m");
5234 CmdArgs.push_back("elf_i386_fbsd");
5235 }
5236
Roman Divackyafe2f232012-08-28 15:09:03 +00005237 if (ToolChain.getArchName() == "powerpc") {
Roman Divacky5e300b82011-06-04 07:40:24 +00005238 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00005239 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00005240 }
5241
Daniel Dunbarb440f562010-08-02 02:38:21 +00005242 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005243 CmdArgs.push_back("-o");
5244 CmdArgs.push_back(Output.getFilename());
5245 } else {
5246 assert(Output.isNothing() && "Invalid output.");
5247 }
5248
5249 if (!Args.hasArg(options::OPT_nostdlib) &&
5250 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005251 const char *crt1 = NULL;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005252 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005253 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00005254 crt1 = "gcrt1.o";
5255 else if (Args.hasArg(options::OPT_pie))
5256 crt1 = "Scrt1.o";
5257 else
5258 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005259 }
Roman Divackyafe2f232012-08-28 15:09:03 +00005260 if (crt1)
5261 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
5262
5263 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5264
5265 const char *crtbegin = NULL;
5266 if (Args.hasArg(options::OPT_static))
5267 crtbegin = "crtbeginT.o";
5268 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
5269 crtbegin = "crtbeginS.o";
5270 else
5271 crtbegin = "crtbegin.o";
5272
5273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005274 }
5275
5276 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00005277 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Roman Divackyee8188a2011-03-01 17:53:14 +00005278 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5279 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005280 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005281 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5282 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00005283 Args.AddAllArgs(CmdArgs, options::OPT_s);
5284 Args.AddAllArgs(CmdArgs, options::OPT_t);
5285 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5286 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005287
Roman Divackyafe2f232012-08-28 15:09:03 +00005288 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005289
5290 if (!Args.hasArg(options::OPT_nostdlib) &&
5291 !Args.hasArg(options::OPT_nodefaultlibs)) {
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005292 if (D.CCCIsCXX) {
Roman Divackyafe2f232012-08-28 15:09:03 +00005293 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00005294 if (Args.hasArg(options::OPT_pg))
5295 CmdArgs.push_back("-lm_p");
5296 else
5297 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00005298 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005299 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5300 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00005301 if (Args.hasArg(options::OPT_pg))
5302 CmdArgs.push_back("-lgcc_p");
5303 else
5304 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005305 if (Args.hasArg(options::OPT_static)) {
5306 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005307 } else if (Args.hasArg(options::OPT_pg)) {
5308 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005309 } else {
5310 CmdArgs.push_back("--as-needed");
5311 CmdArgs.push_back("-lgcc_s");
5312 CmdArgs.push_back("--no-as-needed");
5313 }
5314
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005315 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00005316 if (Args.hasArg(options::OPT_pg))
5317 CmdArgs.push_back("-lpthread_p");
5318 else
5319 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00005320 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005321
Roman Divacky66f22762011-02-10 16:59:40 +00005322 if (Args.hasArg(options::OPT_pg)) {
5323 if (Args.hasArg(options::OPT_shared))
5324 CmdArgs.push_back("-lc");
5325 else
5326 CmdArgs.push_back("-lc_p");
5327 CmdArgs.push_back("-lgcc_p");
5328 } else {
5329 CmdArgs.push_back("-lc");
5330 CmdArgs.push_back("-lgcc");
5331 }
5332
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005333 if (Args.hasArg(options::OPT_static)) {
5334 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00005335 } else if (Args.hasArg(options::OPT_pg)) {
5336 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005337 } else {
5338 CmdArgs.push_back("--as-needed");
5339 CmdArgs.push_back("-lgcc_s");
5340 CmdArgs.push_back("--no-as-needed");
5341 }
5342 }
5343
5344 if (!Args.hasArg(options::OPT_nostdlib) &&
5345 !Args.hasArg(options::OPT_nostartfiles)) {
Roman Divackya3c50242012-09-07 13:36:21 +00005346 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Roman Divackyafe2f232012-08-28 15:09:03 +00005347 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00005348 else
5349 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00005350 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005351 }
5352
Roman Divackyafe2f232012-08-28 15:09:03 +00005353 addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005354
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005355 const char *Exec =
Roman Divackyafe2f232012-08-28 15:09:03 +00005356 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005357 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00005358}
Daniel Dunbarcc912342009-05-02 18:28:39 +00005359
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005360void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5361 const InputInfo &Output,
5362 const InputInfoList &Inputs,
5363 const ArgList &Args,
5364 const char *LinkingOutput) const {
5365 ArgStringList CmdArgs;
5366
5367 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5368 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005369 if (getToolChain().getArch() == llvm::Triple::x86)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005370 CmdArgs.push_back("--32");
5371
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005372 // Set byte order explicitly
5373 if (getToolChain().getArchName() == "mips")
5374 CmdArgs.push_back("-EB");
5375 else if (getToolChain().getArchName() == "mipsel")
5376 CmdArgs.push_back("-EL");
5377
5378 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5379 options::OPT_Xassembler);
5380
5381 CmdArgs.push_back("-o");
5382 CmdArgs.push_back(Output.getFilename());
5383
5384 for (InputInfoList::const_iterator
5385 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5386 const InputInfo &II = *it;
5387 CmdArgs.push_back(II.getFilename());
5388 }
5389
David Chisnallddbd68f2011-09-27 22:03:18 +00005390 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005391 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5392}
5393
5394void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
5395 const InputInfo &Output,
5396 const InputInfoList &Inputs,
5397 const ArgList &Args,
5398 const char *LinkingOutput) const {
5399 const Driver &D = getToolChain().getDriver();
5400 ArgStringList CmdArgs;
5401
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005402 if (!D.SysRoot.empty())
5403 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5404
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005405 if (Args.hasArg(options::OPT_static)) {
5406 CmdArgs.push_back("-Bstatic");
5407 } else {
5408 if (Args.hasArg(options::OPT_rdynamic))
5409 CmdArgs.push_back("-export-dynamic");
5410 CmdArgs.push_back("--eh-frame-hdr");
5411 if (Args.hasArg(options::OPT_shared)) {
5412 CmdArgs.push_back("-Bshareable");
5413 } else {
5414 CmdArgs.push_back("-dynamic-linker");
5415 CmdArgs.push_back("/libexec/ld.elf_so");
5416 }
5417 }
5418
5419 // When building 32-bit code on NetBSD/amd64, we have to explicitly
5420 // instruct ld in the base system to link 32-bit code.
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +00005421 if (getToolChain().getArch() == llvm::Triple::x86) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005422 CmdArgs.push_back("-m");
5423 CmdArgs.push_back("elf_i386");
5424 }
5425
5426 if (Output.isFilename()) {
5427 CmdArgs.push_back("-o");
5428 CmdArgs.push_back(Output.getFilename());
5429 } else {
5430 assert(Output.isNothing() && "Invalid output.");
5431 }
5432
5433 if (!Args.hasArg(options::OPT_nostdlib) &&
5434 !Args.hasArg(options::OPT_nostartfiles)) {
5435 if (!Args.hasArg(options::OPT_shared)) {
5436 CmdArgs.push_back(Args.MakeArgString(
5437 getToolChain().GetFilePath("crt0.o")));
5438 CmdArgs.push_back(Args.MakeArgString(
5439 getToolChain().GetFilePath("crti.o")));
5440 CmdArgs.push_back(Args.MakeArgString(
5441 getToolChain().GetFilePath("crtbegin.o")));
5442 } else {
5443 CmdArgs.push_back(Args.MakeArgString(
5444 getToolChain().GetFilePath("crti.o")));
5445 CmdArgs.push_back(Args.MakeArgString(
5446 getToolChain().GetFilePath("crtbeginS.o")));
5447 }
5448 }
5449
5450 Args.AddAllArgs(CmdArgs, options::OPT_L);
5451 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5452 Args.AddAllArgs(CmdArgs, options::OPT_e);
5453 Args.AddAllArgs(CmdArgs, options::OPT_s);
5454 Args.AddAllArgs(CmdArgs, options::OPT_t);
5455 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5456 Args.AddAllArgs(CmdArgs, options::OPT_r);
5457
5458 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5459
5460 if (!Args.hasArg(options::OPT_nostdlib) &&
5461 !Args.hasArg(options::OPT_nodefaultlibs)) {
5462 if (D.CCCIsCXX) {
5463 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
5464 CmdArgs.push_back("-lm");
5465 }
5466 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
5467 // the default system libraries. Just mimic this for now.
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005468 if (Args.hasArg(options::OPT_static)) {
5469 CmdArgs.push_back("-lgcc_eh");
5470 } else {
5471 CmdArgs.push_back("--as-needed");
5472 CmdArgs.push_back("-lgcc_s");
5473 CmdArgs.push_back("--no-as-needed");
5474 }
Joerg Sonnenberger87717772011-06-07 23:39:17 +00005475 CmdArgs.push_back("-lgcc");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005476
5477 if (Args.hasArg(options::OPT_pthread))
5478 CmdArgs.push_back("-lpthread");
5479 CmdArgs.push_back("-lc");
5480
5481 CmdArgs.push_back("-lgcc");
5482 if (Args.hasArg(options::OPT_static)) {
5483 CmdArgs.push_back("-lgcc_eh");
5484 } else {
5485 CmdArgs.push_back("--as-needed");
5486 CmdArgs.push_back("-lgcc_s");
5487 CmdArgs.push_back("--no-as-needed");
5488 }
5489 }
5490
5491 if (!Args.hasArg(options::OPT_nostdlib) &&
5492 !Args.hasArg(options::OPT_nostartfiles)) {
5493 if (!Args.hasArg(options::OPT_shared))
5494 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5495 "crtend.o")));
5496 else
5497 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5498 "crtendS.o")));
5499 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
5500 "crtn.o")));
5501 }
5502
Bill Wendling08760582011-06-27 19:15:03 +00005503 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005504
David Chisnallddbd68f2011-09-27 22:03:18 +00005505 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00005506 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5507}
5508
Rafael Espindola92b00932010-08-10 00:25:48 +00005509void linuxtools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5510 const InputInfo &Output,
5511 const InputInfoList &Inputs,
5512 const ArgList &Args,
5513 const char *LinkingOutput) const {
5514 ArgStringList CmdArgs;
5515
5516 // Add --32/--64 to make sure we get the format we want.
5517 // This is incomplete
5518 if (getToolChain().getArch() == llvm::Triple::x86) {
5519 CmdArgs.push_back("--32");
5520 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
5521 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00005522 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
5523 CmdArgs.push_back("-a32");
5524 CmdArgs.push_back("-mppc");
5525 CmdArgs.push_back("-many");
5526 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
5527 CmdArgs.push_back("-a64");
5528 CmdArgs.push_back("-mppc64");
5529 CmdArgs.push_back("-many");
Rafael Espindola92b00932010-08-10 00:25:48 +00005530 } else if (getToolChain().getArch() == llvm::Triple::arm) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005531 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00005532 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
5533 CmdArgs.push_back("-mfpu=neon");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00005534
5535 StringRef ARMFloatABI = getARMFloatABI(getToolChain().getDriver(), Args,
5536 getToolChain().getTriple());
5537 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00005538
5539 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
5540 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
5541 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005542 } else if (getToolChain().getArch() == llvm::Triple::mips ||
5543 getToolChain().getArch() == llvm::Triple::mipsel ||
5544 getToolChain().getArch() == llvm::Triple::mips64 ||
5545 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005546 StringRef CPUName;
5547 StringRef ABIName;
5548 getMipsCPUAndABI(Args, getToolChain(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00005549
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00005550 CmdArgs.push_back("-march");
5551 CmdArgs.push_back(CPUName.data());
5552
5553 // Convert ABI name to the GNU tools acceptable variant.
5554 if (ABIName == "o32")
5555 ABIName = "32";
5556 else if (ABIName == "n64")
5557 ABIName = "64";
5558
5559 CmdArgs.push_back("-mabi");
5560 CmdArgs.push_back(ABIName.data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00005561
5562 if (getToolChain().getArch() == llvm::Triple::mips ||
5563 getToolChain().getArch() == llvm::Triple::mips64)
5564 CmdArgs.push_back("-EB");
5565 else
5566 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00005567
5568 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
5569 options::OPT_fpic, options::OPT_fno_pic,
5570 options::OPT_fPIE, options::OPT_fno_PIE,
5571 options::OPT_fpie, options::OPT_fno_pie);
5572 if (LastPICArg &&
5573 (LastPICArg->getOption().matches(options::OPT_fPIC) ||
5574 LastPICArg->getOption().matches(options::OPT_fpic) ||
5575 LastPICArg->getOption().matches(options::OPT_fPIE) ||
5576 LastPICArg->getOption().matches(options::OPT_fpie))) {
5577 CmdArgs.push_back("-KPIC");
5578 }
Rafael Espindola92b00932010-08-10 00:25:48 +00005579 }
5580
5581 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5582 options::OPT_Xassembler);
5583
5584 CmdArgs.push_back("-o");
5585 CmdArgs.push_back(Output.getFilename());
5586
5587 for (InputInfoList::const_iterator
5588 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5589 const InputInfo &II = *it;
5590 CmdArgs.push_back(II.getFilename());
5591 }
5592
5593 const char *Exec =
5594 Args.MakeArgString(getToolChain().GetProgramPath("as"));
5595 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5596}
5597
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005598static void AddLibgcc(llvm::Triple Triple, const Driver &D,
5599 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00005600 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005601 bool StaticLibgcc = isAndroid || Args.hasArg(options::OPT_static) ||
Rafael Espindolacc354322011-10-17 21:39:04 +00005602 Args.hasArg(options::OPT_static_libgcc);
5603 if (!D.CCCIsCXX)
5604 CmdArgs.push_back("-lgcc");
5605
5606 if (StaticLibgcc) {
5607 if (D.CCCIsCXX)
5608 CmdArgs.push_back("-lgcc");
5609 } else {
5610 if (!D.CCCIsCXX)
5611 CmdArgs.push_back("--as-needed");
5612 CmdArgs.push_back("-lgcc_s");
5613 if (!D.CCCIsCXX)
5614 CmdArgs.push_back("--no-as-needed");
5615 }
5616
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005617 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00005618 CmdArgs.push_back("-lgcc_eh");
5619 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX)
5620 CmdArgs.push_back("-lgcc");
5621}
5622
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005623void linuxtools::Link::ConstructJob(Compilation &C, const JobAction &JA,
5624 const InputInfo &Output,
5625 const InputInfoList &Inputs,
5626 const ArgList &Args,
5627 const char *LinkingOutput) const {
5628 const toolchains::Linux& ToolChain =
5629 static_cast<const toolchains::Linux&>(getToolChain());
5630 const Driver &D = ToolChain.getDriver();
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005631 const bool isAndroid = ToolChain.getTriple().getEnvironment() ==
Logan Chienc6fd8202012-09-02 09:30:11 +00005632 llvm::Triple::Android;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005633
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005634 ArgStringList CmdArgs;
5635
Rafael Espindolad1002f62010-11-15 18:28:16 +00005636 // Silence warning for "clang -g foo.o -o foo"
5637 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005638 // and "clang -emit-llvm foo.o -o foo"
5639 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00005640 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00005641 // handled somewhere else.
5642 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00005643
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005644 if (!D.SysRoot.empty())
5645 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005646
Rafael Espindolad47ac232010-11-17 22:26:15 +00005647 if (Args.hasArg(options::OPT_pie))
5648 CmdArgs.push_back("-pie");
5649
Rafael Espindola1c76c592010-11-07 22:57:16 +00005650 if (Args.hasArg(options::OPT_rdynamic))
5651 CmdArgs.push_back("-export-dynamic");
5652
Rafael Espindola34d77dc2010-11-11 19:34:42 +00005653 if (Args.hasArg(options::OPT_s))
5654 CmdArgs.push_back("-s");
5655
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005656 for (std::vector<std::string>::const_iterator i = ToolChain.ExtraOpts.begin(),
5657 e = ToolChain.ExtraOpts.end();
5658 i != e; ++i)
5659 CmdArgs.push_back(i->c_str());
5660
5661 if (!Args.hasArg(options::OPT_static)) {
5662 CmdArgs.push_back("--eh-frame-hdr");
5663 }
5664
5665 CmdArgs.push_back("-m");
5666 if (ToolChain.getArch() == llvm::Triple::x86)
5667 CmdArgs.push_back("elf_i386");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005668 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00005669 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005670 CmdArgs.push_back("armelf_linux_eabi");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005671 else if (ToolChain.getArch() == llvm::Triple::ppc)
5672 CmdArgs.push_back("elf32ppclinux");
5673 else if (ToolChain.getArch() == llvm::Triple::ppc64)
5674 CmdArgs.push_back("elf64ppc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005675 else if (ToolChain.getArch() == llvm::Triple::mips)
5676 CmdArgs.push_back("elf32btsmip");
5677 else if (ToolChain.getArch() == llvm::Triple::mipsel)
5678 CmdArgs.push_back("elf32ltsmip");
5679 else if (ToolChain.getArch() == llvm::Triple::mips64)
5680 CmdArgs.push_back("elf64btsmip");
5681 else if (ToolChain.getArch() == llvm::Triple::mips64el)
5682 CmdArgs.push_back("elf64ltsmip");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005683 else
5684 CmdArgs.push_back("elf_x86_64");
5685
5686 if (Args.hasArg(options::OPT_static)) {
Douglas Gregord9bb1522011-03-06 19:11:49 +00005687 if (ToolChain.getArch() == llvm::Triple::arm
5688 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005689 CmdArgs.push_back("-Bstatic");
5690 else
5691 CmdArgs.push_back("-static");
5692 } else if (Args.hasArg(options::OPT_shared)) {
5693 CmdArgs.push_back("-shared");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005694 if ((ToolChain.getArch() == llvm::Triple::arm
5695 || ToolChain.getArch() == llvm::Triple::thumb) && isAndroid) {
5696 CmdArgs.push_back("-Bsymbolic");
5697 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005698 }
5699
5700 if (ToolChain.getArch() == llvm::Triple::arm ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00005701 ToolChain.getArch() == llvm::Triple::thumb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005702 (!Args.hasArg(options::OPT_static) &&
5703 !Args.hasArg(options::OPT_shared))) {
5704 CmdArgs.push_back("-dynamic-linker");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005705 if (isAndroid)
5706 CmdArgs.push_back("/system/bin/linker");
5707 else if (ToolChain.getArch() == llvm::Triple::x86)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005708 CmdArgs.push_back("/lib/ld-linux.so.2");
Douglas Gregord9bb1522011-03-06 19:11:49 +00005709 else if (ToolChain.getArch() == llvm::Triple::arm ||
Jiangning Liueabbf922012-07-30 11:05:56 +00005710 ToolChain.getArch() == llvm::Triple::thumb) {
5711 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
5712 CmdArgs.push_back("/lib/ld-linux-armhf.so.3");
5713 else
5714 CmdArgs.push_back("/lib/ld-linux.so.3");
5715 }
Eli Friedman27b8c4f2011-11-08 19:43:37 +00005716 else if (ToolChain.getArch() == llvm::Triple::mips ||
5717 ToolChain.getArch() == llvm::Triple::mipsel)
5718 CmdArgs.push_back("/lib/ld.so.1");
Simon Atanasyan1e1e2e22012-04-06 20:14:27 +00005719 else if (ToolChain.getArch() == llvm::Triple::mips64 ||
5720 ToolChain.getArch() == llvm::Triple::mips64el)
5721 CmdArgs.push_back("/lib64/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005722 else if (ToolChain.getArch() == llvm::Triple::ppc)
Chris Lattner20b90d02011-04-11 21:15:37 +00005723 CmdArgs.push_back("/lib/ld.so.1");
Ted Kremenek43d47cc2011-04-05 22:04:27 +00005724 else if (ToolChain.getArch() == llvm::Triple::ppc64)
Chris Lattner20b90d02011-04-11 21:15:37 +00005725 CmdArgs.push_back("/lib64/ld64.so.1");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005726 else
5727 CmdArgs.push_back("/lib64/ld-linux-x86-64.so.2");
5728 }
5729
5730 CmdArgs.push_back("-o");
5731 CmdArgs.push_back(Output.getFilename());
5732
Rafael Espindola81937ec2010-12-01 01:52:43 +00005733 if (!Args.hasArg(options::OPT_nostdlib) &&
5734 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005735 if (!isAndroid) {
5736 const char *crt1 = NULL;
5737 if (!Args.hasArg(options::OPT_shared)){
5738 if (Args.hasArg(options::OPT_pie))
5739 crt1 = "Scrt1.o";
5740 else
5741 crt1 = "crt1.o";
5742 }
5743 if (crt1)
5744 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005745
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005746 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
5747 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005748
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005749 const char *crtbegin;
5750 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005751 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005752 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005753 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005754 else if (Args.hasArg(options::OPT_pie))
5755 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005756 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005757 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005758 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
5759 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005760
5761 Args.AddAllArgs(CmdArgs, options::OPT_L);
5762
5763 const ToolChain::path_list Paths = ToolChain.getFilePaths();
5764
Roman Divackyee8188a2011-03-01 17:53:14 +00005765 for (ToolChain::path_list::const_iterator i = Paths.begin(), e = Paths.end();
5766 i != e; ++i)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005767 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + *i));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005768
Rafael Espindola9446d762012-04-09 23:53:34 +00005769 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
5770 // as gold requires -plugin to come before any -plugin-opt that -Wl might
5771 // forward.
5772 if (D.IsUsingLTO(Args) || Args.hasArg(options::OPT_use_gold_plugin)) {
5773 CmdArgs.push_back("-plugin");
5774 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
5775 CmdArgs.push_back(Args.MakeArgString(Plugin));
5776 }
5777
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00005778 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5779 CmdArgs.push_back("--no-demangle");
5780
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005781 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
5782
Chandler Carruth94a32012012-05-14 18:31:18 +00005783 if (D.CCCIsCXX &&
5784 !Args.hasArg(options::OPT_nostdlib) &&
5785 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00005786 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
5787 !Args.hasArg(options::OPT_static);
5788 if (OnlyLibstdcxxStatic)
5789 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005790 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00005791 if (OnlyLibstdcxxStatic)
5792 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005793 CmdArgs.push_back("-lm");
5794 }
5795
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005796 // Call this before we add the C run-time.
5797 addAsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00005798 addTsanRTLinux(getToolChain(), Args, CmdArgs);
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00005799
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005800 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00005801 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
5802 if (Args.hasArg(options::OPT_static))
5803 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00005804
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005805 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005806
Chandler Carruth94a32012012-05-14 18:31:18 +00005807 if (Args.hasArg(options::OPT_pthread) ||
5808 Args.hasArg(options::OPT_pthreads))
5809 CmdArgs.push_back("-lpthread");
5810
5811 CmdArgs.push_back("-lc");
5812
5813 if (Args.hasArg(options::OPT_static))
5814 CmdArgs.push_back("--end-group");
5815 else
5816 AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
5817 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00005818
Rafael Espindola81937ec2010-12-01 01:52:43 +00005819 if (!Args.hasArg(options::OPT_nostartfiles)) {
5820 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005821 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005822 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00005823 else if (Args.hasArg(options::OPT_pie))
5824 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00005825 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005826 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00005827
Rafael Espindola81937ec2010-12-01 01:52:43 +00005828 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00005829 if (!isAndroid)
5830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00005831 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005832 }
5833
Bill Wendling08760582011-06-27 19:15:03 +00005834 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005835
Rafael Espindolac8f008f2010-11-07 20:14:31 +00005836 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
5837}
Rafael Espindola92b00932010-08-10 00:25:48 +00005838
Chris Lattner3e2ee142010-07-07 16:01:42 +00005839void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005840 const InputInfo &Output,
5841 const InputInfoList &Inputs,
5842 const ArgList &Args,
5843 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005844 ArgStringList CmdArgs;
5845
5846 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5847 options::OPT_Xassembler);
5848
5849 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005850 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005851
5852 for (InputInfoList::const_iterator
5853 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5854 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005855 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00005856 }
5857
5858 const char *Exec =
Eli Friedman83de5132011-12-08 23:54:21 +00005859 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005860 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005861}
5862
5863void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005864 const InputInfo &Output,
5865 const InputInfoList &Inputs,
5866 const ArgList &Args,
5867 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005868 const Driver &D = getToolChain().getDriver();
5869 ArgStringList CmdArgs;
5870
Daniel Dunbarb440f562010-08-02 02:38:21 +00005871 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005872 CmdArgs.push_back("-o");
5873 CmdArgs.push_back(Output.getFilename());
5874 } else {
5875 assert(Output.isNothing() && "Invalid output.");
5876 }
5877
5878 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00005879 !Args.hasArg(options::OPT_nostartfiles)) {
5880 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
5881 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
5882 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
5883 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
5884 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005885
5886 Args.AddAllArgs(CmdArgs, options::OPT_L);
5887 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5888 Args.AddAllArgs(CmdArgs, options::OPT_e);
5889
Daniel Dunbar54423b22010-09-17 00:24:54 +00005890 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005891
Eli Friedman83de5132011-12-08 23:54:21 +00005892 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
5893
Chris Lattner3e2ee142010-07-07 16:01:42 +00005894 if (!Args.hasArg(options::OPT_nostdlib) &&
5895 !Args.hasArg(options::OPT_nodefaultlibs)) {
5896 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005897 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005898 CmdArgs.push_back("-lm");
5899 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005900 }
5901
5902 if (!Args.hasArg(options::OPT_nostdlib) &&
5903 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00005904 if (Args.hasArg(options::OPT_pthread))
5905 CmdArgs.push_back("-lpthread");
5906 CmdArgs.push_back("-lc");
5907 CmdArgs.push_back("-lCompilerRT-Generic");
5908 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
5909 CmdArgs.push_back(
5910 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005911 }
5912
Eli Friedman83de5132011-12-08 23:54:21 +00005913 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005914 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005915}
5916
Daniel Dunbarcc912342009-05-02 18:28:39 +00005917/// DragonFly Tools
5918
5919// For now, DragonFly Assemble does just about the same as for
5920// FreeBSD, but this may change soon.
5921void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005922 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005923 const InputInfoList &Inputs,
5924 const ArgList &Args,
5925 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005926 ArgStringList CmdArgs;
5927
5928 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5929 // instruct as in the base system to assemble 32-bit code.
5930 if (getToolChain().getArchName() == "i386")
5931 CmdArgs.push_back("--32");
5932
5933 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5934 options::OPT_Xassembler);
5935
5936 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005937 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005938
5939 for (InputInfoList::const_iterator
5940 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
5941 const InputInfo &II = *it;
Daniel Dunbarb440f562010-08-02 02:38:21 +00005942 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00005943 }
5944
5945 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005946 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005947 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005948}
5949
5950void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005951 const InputInfo &Output,
5952 const InputInfoList &Inputs,
5953 const ArgList &Args,
5954 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005955 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00005956 ArgStringList CmdArgs;
5957
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00005958 if (!D.SysRoot.empty())
5959 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
5960
Daniel Dunbarcc912342009-05-02 18:28:39 +00005961 if (Args.hasArg(options::OPT_static)) {
5962 CmdArgs.push_back("-Bstatic");
5963 } else {
5964 if (Args.hasArg(options::OPT_shared))
5965 CmdArgs.push_back("-Bshareable");
5966 else {
5967 CmdArgs.push_back("-dynamic-linker");
5968 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
5969 }
5970 }
5971
5972 // When building 32-bit code on DragonFly/pc64, we have to explicitly
5973 // instruct ld in the base system to link 32-bit code.
5974 if (getToolChain().getArchName() == "i386") {
5975 CmdArgs.push_back("-m");
5976 CmdArgs.push_back("elf_i386");
5977 }
5978
Daniel Dunbarb440f562010-08-02 02:38:21 +00005979 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00005980 CmdArgs.push_back("-o");
5981 CmdArgs.push_back(Output.getFilename());
5982 } else {
5983 assert(Output.isNothing() && "Invalid output.");
5984 }
5985
5986 if (!Args.hasArg(options::OPT_nostdlib) &&
5987 !Args.hasArg(options::OPT_nostartfiles)) {
5988 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005989 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005990 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005991 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005992 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005993 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005994 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00005995 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005996 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005997 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005998 CmdArgs.push_back(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005999 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006000 }
6001 }
6002
6003 Args.AddAllArgs(CmdArgs, options::OPT_L);
6004 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6005 Args.AddAllArgs(CmdArgs, options::OPT_e);
6006
Daniel Dunbar54423b22010-09-17 00:24:54 +00006007 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00006008
6009 if (!Args.hasArg(options::OPT_nostdlib) &&
6010 !Args.hasArg(options::OPT_nodefaultlibs)) {
6011 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
6012 // rpaths
6013 CmdArgs.push_back("-L/usr/lib/gcc41");
6014
6015 if (!Args.hasArg(options::OPT_static)) {
6016 CmdArgs.push_back("-rpath");
6017 CmdArgs.push_back("/usr/lib/gcc41");
6018
6019 CmdArgs.push_back("-rpath-link");
6020 CmdArgs.push_back("/usr/lib/gcc41");
6021
6022 CmdArgs.push_back("-rpath");
6023 CmdArgs.push_back("/usr/lib");
6024
6025 CmdArgs.push_back("-rpath-link");
6026 CmdArgs.push_back("/usr/lib");
6027 }
6028
Rafael Espindola38360b32010-07-20 12:59:03 +00006029 if (D.CCCIsCXX) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006030 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00006031 CmdArgs.push_back("-lm");
6032 }
6033
Daniel Dunbarcc912342009-05-02 18:28:39 +00006034 if (Args.hasArg(options::OPT_shared)) {
6035 CmdArgs.push_back("-lgcc_pic");
6036 } else {
6037 CmdArgs.push_back("-lgcc");
6038 }
6039
6040
6041 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00006042 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00006043
6044 if (!Args.hasArg(options::OPT_nolibc)) {
6045 CmdArgs.push_back("-lc");
6046 }
6047
6048 if (Args.hasArg(options::OPT_shared)) {
6049 CmdArgs.push_back("-lgcc_pic");
6050 } else {
6051 CmdArgs.push_back("-lgcc");
6052 }
6053 }
6054
6055 if (!Args.hasArg(options::OPT_nostdlib) &&
6056 !Args.hasArg(options::OPT_nostartfiles)) {
6057 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006058 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006059 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006060 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006061 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006062 getToolChain().GetFilePath("crtendS.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006063 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006064 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006065 }
6066
Bill Wendling08760582011-06-27 19:15:03 +00006067 addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006068
Daniel Dunbarcc912342009-05-02 18:28:39 +00006069 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006070 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006071 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00006072}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006073
6074void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
6075 const InputInfo &Output,
6076 const InputInfoList &Inputs,
6077 const ArgList &Args,
6078 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006079 ArgStringList CmdArgs;
6080
6081 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00006082 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
6083 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006084 } else {
6085 assert(Output.isNothing() && "Invalid output.");
6086 }
6087
6088 if (!Args.hasArg(options::OPT_nostdlib) &&
6089 !Args.hasArg(options::OPT_nostartfiles)) {
6090 CmdArgs.push_back("-defaultlib:libcmt");
6091 }
6092
6093 CmdArgs.push_back("-nologo");
6094
Michael J. Spencere2f49362012-06-18 16:56:04 +00006095 Args.AddAllArgValues(CmdArgs, options::OPT_l);
6096
6097 // Add filenames immediately.
6098 for (InputInfoList::const_iterator
6099 it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
6100 if (it->isFilename())
6101 CmdArgs.push_back(it->getFilename());
6102 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006103
6104 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00006105 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00006106 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6107}